|
порт под ADuC702x? |
|
|
|
Sep 12 2010, 19:41
|
Местный
  
Группа: Участник
Сообщений: 312
Регистрация: 9-04-10
Пользователь №: 56 532

|
Для сборки использую WinARM. При сборке вылетает ошибка Код OS_Target.h OS_INTERRUPT void SystemTimer_ISR(); expected constructor, destructor, or type conversion before 'void' Код scmRTOS_defs.h
#ifndef scmRTOS_CONTEXT_SWITCH_SCHEME #error "Error: Config macro scmRTOS_CONTEXT_SWITCH_SCHEME must be defined!" #endif Но scmRTOS_CONTEXT_SWITCH_SCHEME ведь определена по дефолту 0. Как собрать Ос? Все разобрался. Я с инклудами намутил.
Сообщение отредактировал a9d - Sep 12 2010, 20:21
|
|
|
|
|
Sep 12 2010, 21:47
|
Местный
  
Группа: Участник
Сообщений: 312
Регистрация: 9-04-10
Пользователь №: 56 532

|
А каким GCC компилятором собирался порт? У меня теперь ругается на это: Код undefined reference to `_exit' test_scm2 line 0, external location: exit.c undefined reference to `_sbrk_r' test_scm2 line 0, external location: mallocr.c undefined reference to `ContextRestore' main.cpp /test_scm2 line 0
Сообщение отредактировал a9d - Sep 12 2010, 21:49
|
|
|
|
|
Sep 13 2010, 05:06
|
Местный
  
Группа: Участник
Сообщений: 312
Регистрация: 9-04-10
Пользователь №: 56 532

|
Это ругается на пустом проекте. (WinARM-20060606) Стандартные примеры не собираются. Там вылетает ошибка Код Compiling: ../scmRTOS/Common/OS_Kernel.cpp Compiling: ../scmRTOS/Common/OS_Services.cpp Compiling: ../scmRTOS/Common/usrlib.cpp Compiling: ../scmRTOS/ARM7/OS_Target_cpp.cpp Compiling: ./Src/main.cpp Assembling: ../scmRTOS/ARM7/OS_Target_asm.s Assembling: ./Src/crt.s Linking: release/1-EventFlag.elf release/obj/crt.o: In function `ctor_end': ./Src/crt.s:157: undefined reference to `_data_image' c:/winarm/bin/../lib/gcc/arm-elf/4.1.1/../../../../arm-elf/bin/ld.exe: BFD 06060 6 20060606 internal error, aborting at c:/winarms/binutils-060606/bfd/elflink.c line 6509 in elf_link_output_extsym
c:/winarm/bin/../lib/gcc/arm-elf/4.1.1/../../../../arm-elf/bin/ld.exe: Please re port this bug.
collect2: ld returned 1 exit status make: *** [release/1-EventFlag.elf] Error 1
|
|
|
|
|
Sep 13 2010, 05:24
|

фанат дивана
     
Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684

|
Цитата(a9d @ Sep 13 2010, 11:06)  (WinARM-20060606) Староват наверное, компилятор-то. Возьмите поновее. Или вот этот: Sourcery G++ Lite.
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Sep 13 2010, 09:45
|
Местный
  
Группа: Участник
Сообщений: 312
Регистрация: 9-04-10
Пользователь №: 56 532

|
Поставил Sourcery G++ Lite. Результат стал еще хуже. Теперь в стандартных примерах ничего не собирается. Код Compiling: ../scmRTOS/Common/OS_Kernel.cpp process_begin: CreateProcess(NULL, arm-elf-gcc -c -mcpu=arm7tdmi -g -gdwarf-2 -M D -MP -MF release/dep/OS_Kernel.o.d -I../scmRTOS/Common -I../scmRTOS/ARM7 -I./Sr c -Os -DADUC7020=1 -fomit-frame-pointer -fno-exceptions -fno-rtti -Wall -Wextra -Wundef -Wcast-align -Wa,-ahlmsdc=release/lst/OS_Kernel.lst -fverbose-asm -ffunc tion-sections -fdata-sections -Winline -funsigned-bitfields -fshort-enums ../scm RTOS/Common/OS_Kernel.cpp -o release/obj/OS_Kernel.o, ...) failed. make (e=2): Не удается найти указанный файл. make: *** [release/obj/OS_Kernel.o] Error 2 yagarto-bu-2.20.1_gcc-4.5.1-c-c++_nl-1.18.0_gdb-7.1_eabi_20100813 выдает туже самую ошибку, что и Sourcery G++ Lite.
Сообщение отредактировал a9d - Sep 13 2010, 10:00
|
|
|
|
|
Sep 13 2010, 10:19
|

фанат дивана
     
Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684

|
Дык! Надо же поменять в makefile Код TARGET = arm-elf- на Код TARGET = arm-none-eabi- ! Компилер-то иначе называется теперь
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Sep 13 2010, 18:42
|
Местный
  
Группа: Участник
Сообщений: 312
Регистрация: 9-04-10
Пользователь №: 56 532

|
Прошивка ,через бутлоадер, отказывается заливатся. Контроллер ADuC7024. Вылетает ошибка: Wrong memory address 0x10000-0x10010 Erase aborted. В makefile выбрал LD_SCRIPT= ./Config/ADuC70xx_FLASH.ld и все завелось. Но после вызова OS::Run(); управление не передается первому процессу. Без JTAG туговато. Но с помощью светодиодов определил место где зависает. Файл OS_Target.h Код INLINE inline void OS_Start(TStackItem* sp) {
ContextRestore(sp); } Не происходит возврат из ContextRestore(sp). Но учитывая атрибут __noreturn__ я могу ошибаться. Скорей всего управление передается какой нибудь функции ОС.
Сообщение отредактировал a9d - Sep 13 2010, 22:50
|
|
|
|
|
Sep 14 2010, 04:58
|

фанат дивана
     
Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684

|
Цитата(a9d @ Sep 14 2010, 00:42)  В makefile выбрал LD_SCRIPT= ./Config/ADuC70xx_FLASH.ld А вы внесли в ADuC70xx_FLASH.ld изменения, про которые вам сказал Сергей Борщ? Вот сюда: Код __ctors_start = .; *(.ctors) __ctors_end = .; Добавьте после строки *(.ctors)строку Код KEEP(SORT(*)(.init_array))
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Sep 14 2010, 06:46
|
Местный
  
Группа: Участник
Сообщений: 312
Регистрация: 9-04-10
Пользователь №: 56 532

|
Не знаю, что я сделал но: Код __ctors_start = .; *(.ctors) *(.init_array) KEEP(SORT(*)(.init_array)) __ctors_end = .; __dtors_start = .; *(.dtors) __dtors_end = .; KEEP(SORT(*)(.ctors)) KEEP(SORT(*)(.init_array)) KEEP(SORT(*)(.dtors)) и все заработало. Снова поигрался с размером прошивки. На некоторых размерах все та же ошибка вылетает. Со скриптом все таки есть проблема.
Сообщение отредактировал a9d - Sep 14 2010, 06:52
|
|
|
|
|
Sep 14 2010, 17:09
|

фанат дивана
     
Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684

|
Цитата(a9d @ Sep 14 2010, 21:48)  три процесса мигают светодиодами. Поздравляю!  2 Сергей Борщ. Почему в скрипте сделано так: Код __ctors_start = .; *(.ctors) __ctors_end = .; KEEP(SORT(*)(.ctors)) ? Я обычно пишу: Код __ctors_start = .; KEEP(SORT(*)(.ctors)) __ctors_end = .; , и всё работает нормально. В чём разница между этими вариантами?
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Mar 7 2011, 22:35
|
Местный
  
Группа: Участник
Сообщений: 312
Регистрация: 9-04-10
Пользователь №: 56 532

|
Заметил при использовании channel непонятный момент(в порте под AVR этого не наблюдаю). У меня есть следующий код Код OS::channel<char,200> bufCam;
template<> OS_PROCESS void TProc2::Exec() { while(1) { Sleep(100); //Если слип убрать, то система вешается. Но у этого процесса приоритет ниже. Почему первый процесс не может забрать управление?? } }
template<> OS_PROCESS void TProc1::Exec() { MyUart.setChanel(3);
char buf;
while(1) { MyUart.sendByte(bufCam.get_count());
Sleep(500); }
}
extern "C" void IRQ_Switch() {
char b;
dword irq = IRQSIG; irq &= IRQSTA; if(irq & RTOS_TIMER_BIT) { OS::SystemTimer_ISR(); } else if (irq & UART_BIT) { b=COMRX; bufCam.push(b); }
} Отсылаю разные по длине посылки. Размер их отображается верно. Вопрос 1: Почему если из TProc2 убрать слип система зависает? У TProc1 приоритет выше и он должен забирать управление в любом случае. Ведь в процессе заглушка нет слипа и система работает. Меняю код в TProc1 Код template<> OS_PROCESS void TProc1::Exec() { MyUart.setChanel(3);
char buf;
while(1) { bufCam.pop(buf); MyUart.sendByte(buf); }
} Если отправляю по одному байту, то отклика нет. Если отправляю посылку, то возвращается только последний байт. Т.е. отправил "123" вернется "3". Меня код снова Код template<> OS_PROCESS void TProc1::Exec() { MyUart.setChanel(3);
char buf;
while(1) { bufCam.pop(buf,100); MyUart.sendByte(buf); }
} На выходе вижу равномерно идущие нули. Отправляю один байт, система подвисает и дальше снова начинают идти нули. Иду дальше Код template<> OS_PROCESS void TProc1::Exec() { MyUart.setChanel(3);
char buf;
while(1) { bufCam.pop(buf,100); MyUart.sendByte(bufCam.get_count()); }
} Отправляю посылку. В теории я должен видеть число которое постоянно уменьшается на единицу. В реальности вижу только 0. Пробовал сделать так struct TData { char a; }; OS::channel<TData,200> bufCam; Результат такой же. ЗЫ: Так же нужно подредактировать файл pin_macros.h . В нем есть опечатка. Он выглядит так. Код #define PM_PINL(port,bit,dummy) (!(GP##port##DAT & (1 << (bit)))) #define PM_PINH(port,bit,dummy) (!PM_PINH(port,bit,dummy)) Но должно быть так? Код #define PM_PINL(port,bit,dummy) (!(GP##port##DAT & (1 << (bit)))) #define PM_PINH(port,bit,dummy) (!PM_PINL(port,bit,dummy)) Иначе не компилится.
Сообщение отредактировал a9d - Mar 7 2011, 22:53
|
|
|
|
|
Mar 8 2011, 09:38
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
QUOTE (a9d @ Mar 8 2011, 00:35)  У меня есть следующий код Вы можете выложить сюда архив проекта, чтобы я погонял его под отладчиком? QUOTE (a9d @ Mar 8 2011, 00:35)  Так же нужно подредактировать файл pin_macros.h . В нем есть опечатка. Спасибо. Там еще и в ADUC702x.h попутаны значения _FREE_RUNNING и _PERIODIC для таймеров. Не могу зафиксировать исправление в репозиторий - ствол залочен на время работы над версией 4.00
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Mar 8 2011, 11:47
|
Местный
  
Группа: Участник
Сообщений: 312
Регистрация: 9-04-10
Пользователь №: 56 532

|
robot_arm2.rar ( 305 килобайт )
Кол-во скачиваний: 102Компилятор "Sourcery G++ Lite" Емкость канала в 255 объектов актуальна на 8-ми битках. Но в армах этого маловато. У меня пакет полностью не помещается в канал.
Сообщение отредактировал a9d - Mar 8 2011, 11:50
|
|
|
|
|
Mar 8 2011, 14:08
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Не могу быстро найти свою отладочную платку с ADuC, но на первый взгляд вы забыли завести объект типа OS::TISRW в обработчике прерывания UART. И надо бы перед помещением в канал проверять - есть ли в канале место. Иначе при переполнении канала channel::push() будет пытаться выполнить перепланировку, что для прерывания не имеет смысла: CODE else if (irq & UART_BIT) { OS::TISRW isrw; b=COMRX; if(bufCam.get_free_size()) bufCam.push(b); } Попробуйте, отпишитесь. Если не поможет - буду искать свою платку.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Mar 8 2011, 17:21
|
Местный
  
Группа: Участник
Сообщений: 312
Регистрация: 9-04-10
Пользователь №: 56 532

|
Ура заработало)) Цитата Спасибо. Там еще и в ADUC702x.h попутаны значения _FREE_RUNNING и _PERIODIC для таймеров. Не могу зафиксировать исправление в репозиторий - ствол залочен на время работы над версией 4.00 После этого все заработало. ЗЫ: Та же процесс 1 стал забирать управление у процесса 2. Даже если во втором процессе нет слипа. Важный бит был. ЗЗЫ: Не сработало это Код else if (irq & UART_BIT) { OS::TISRW isrw; b=COMRX; if(bufCam.get_free_size()) bufCam.push(b); } Нормальная настройка таймера сделала задержки такие как они и должны были быть. При проверке использовал старый хекс. Поэтому изменения сразу не заметил.
Сообщение отредактировал a9d - Mar 8 2011, 17:54
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|