AHTOXA 14 7 апреля, 2013 Опубликовано 7 апреля, 2013 · Жалоба SYSTICKFREQ - это частота тактирования системного таймера. А SYSTICKINTRATE - это желаемая частота прерываний системного таймера. В герцах. Аргумент функции sleep() - число тиков системного таймера. То есть, скажем, если SYSTICKINTRATE = 1000, то аргумент sleep() будет в миллисекундах, и для того, чтобы проспать секунду, надо написать sleep(1000);. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AlexG 1 17 сентября, 2013 Опубликовано 17 сентября, 2013 · Жалоба При портировании scmRTOS 4.0 на Xmega возникла проблема с примером 4-Debug. Пример компилируется в IAR 6.21.1 с таким предупреждением: Warning[w6]: Type conflict for external/entry "__near_memzero", in module debug against external/entry in module ?xxmemxmemzero; function types differ in parameter 1; types have different type attributes Ругань компилятора вызывает контсруктор шаблонного класса TProfiler: template < uint_fast8_t sum_shift_bits > TProfiler<sum_shift_bits>::TProfiler() : Counter ( ) , Result ( ) { } а именно : Counter ( ) , Result ( ) Не сталкивался раньше с подобным, это баг компилятора или в коде профайлера scmRTOS что-то не учтено? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 119 17 сентября, 2013 Опубликовано 17 сентября, 2013 · Жалоба Поскольку в исходниках ОС нет явного вызова __near_memzero, значит его вызывает сам компилятор и значит да - это бага компилятора. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dxp 32 17 сентября, 2013 Опубликовано 17 сентября, 2013 · Жалоба При портировании scmRTOS 4.0 на Xmega возникла проблема с примером 4-Debug. Пример компилируется в IAR 6.21.1 с таким предупреждением: Warning[w6]: Type conflict for external/entry "__near_memzero", in module debug against external/entry in module ?xxmemxmemzero; function types differ in parameter 1; types have different type attributes По всему видно, что библиотечный модуль ?xxmemxmemzero собран с другими опциями, нежели собирается проект (модуль debug). Почему так - надо смотреть настройки проекта/тулчейна, почему-то не та библиотека линкуется. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AlexG 1 18 сентября, 2013 Опубликовано 18 сентября, 2013 · Жалоба По всему видно, что библиотечный модуль ?xxmemxmemzero собран с другими опциями, нежели собирается проект (модуль debug). Почему так - надо смотреть настройки проекта/тулчейна, почему-то не та библиотека линкуется. Чтобы исключить влияние каких-то неучтенных настроек создал проект заново, получил то-же самое сообщение об ошибке, но более развернутое: Warning[w6]: Type conflict for external/entry "__near_memzero", in module debug against external/entry in module ?xxmemxmemzero; function types differ in parameter 1; types have different type attributes /* In module debug: */ /* Function, args 2, attr 0 */ void (__version_3 __near_memzero)(void volatile *, unsigned int); /* In module ?xxmemxmemzero: */ /* Function, args 2, attr 0 */ void (__version_3 __near_memzero)(void *, __near_size_t); typedef unsigned int __near_size_t; Прикладываю проект (в составе порта) scmRTOS.4.00.avr.iar.xmega.zip Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
сарматъ 0 19 сентября, 2013 Опубликовано 19 сентября, 2013 · Жалоба понимаю что не по делу но может с xмеги на арм пересесть stm32f(1/3) очень приятные изделия, последний раз когда сталкивался с аврами периферия работала совсем не так как описано в даташитах цена практически та же но 32 разряда плюс внутрисхемная отладка плюс свободные средства разработки плюс рабочие порты Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AlexG 1 20 сентября, 2013 Опубликовано 20 сентября, 2013 · Жалоба понимаю что не по делу но может с xмеги на арм пересесть stm32f(1/3) очень приятные изделия, последний раз когда сталкивался с аврами периферия работала совсем не так как описано в даташитах цена практически та же но 32 разряда плюс внутрисхемная отладка плюс свободные средства разработки плюс рабочие порты Зачем мне ARM? У меня и на Xmega все работает :) Включая scmRTOS. Периферия у Xmega мне нравится на порядок больше чем у STM32F1, особенно система событий позволяющая кучу работы сделать аппаратно без участия программы и встроенный EEPROM. Внутрисхемная отладка и у AVR есть, без нее приходится отлаживать программы только для старья вроде ATmega8 и ATtiny15. Свободные средства разработки тоже есть, не так как у STM8. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
WHILE 0 9 декабря, 2013 Опубликовано 9 декабря, 2013 · Жалоба Есть несколько вопросов по scmRTOS под АРМ. 1.Вопрос по приоритетам. При работе с АВР приоритеты без вариантов рулятся только на уровне оси. А вот как быть с АРМ-ами? Пока в голову приходит следующее: Выставить всем осевым прерываниям одинаковый приоритет в контроллере прерываний, чуть выше системного таймера. А какой приоритет в контроллере прерываний ставить внеосевым прерываниям? 2. Я использую версию оси 3.11,т.к версии 4.0 для AT91SAM7 нет. Для 3-й версии scmRTOS нет описания.Есть для версий 2 и 4. Какое будет актульнее для 3-й? 3.Столкнувшись с глюками под отладчиком,к своему удивлению не обнаружил в версии 3.хх поддержки режима отладки .Бегло глянул версию 4.0 под GCC и там не увидел тоже. А без нее реально под jtag-ом глючит-периодически улетает неведомо куда и сваливается в исключения. Я добавил в __low_level_init() #ifdef DEBUG AT91C_BASE_AIC->AIC_DCR = AT91C_AIC_DCR_PROT; // Enable Debug mode #endif и в cstartup.s resetVector: LDR pc, =resetHandler ; Reset LDR pc, Undefined_Addr ; Undefined instructions LDR pc, SWI_Addr ; Software interrupt (SWI/SYS) LDR pc, Prefetch_Addr ; Prefetch abort LDR pc, Abort_Addr ; Data abort B . ; RESERVED #ifdef DEBUG LDR pc, =irqHandler #else LDR PC,[PC,#-0x20] ; LDR pc, FIQ_Addr ; FIQ irqHandler: STMFD SP!, {r5,r6,r7} ; LDR r5, =AT91C_BASE_AIC ; LDR r6, [r5, #AIC_IVR] ; STR r5, [r5, #AIC_IVR] ;Write in the IVR to support Protect Mode STR r6, [SP, #8] ; LDMFD SP!, {r5,r6,PC} ну и в scmRTOS_config.h если нужна отладка определить #define DEBUG С уважением. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mdmitry 0 9 декабря, 2013 Опубликовано 9 декабря, 2013 · Жалоба 2. Я использую версию оси 3.11,т.к версии 4.0 для AT91SAM7 нет. Для 3-й версии scmRTOS нет описания.Есть для версий 2 и 4. Какое будет актульнее для 3-й? А в trunk лежит не то, что Вам нужно? Порт только для GCC. Для отладки в 4.0 пример Debug с применением Extensions. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
WHILE 0 9 декабря, 2013 Опубликовано 9 декабря, 2013 · Жалоба А в trunk лежит не то, что вам нужно? Порт только для GCC. Я прикидывал затраты на перепиливание существующей версии 3.11 под текущий iar и портирование под IAR GCC-ный порт 4.0. С учетом моего нулевого опыта с АРМ-ами первый вариант мне показался проще. Но сейчас проблема не в порте,а в подходе к написанию кода. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Alex_rav 0 25 февраля, 2014 Опубликовано 25 февраля, 2014 · Жалоба Доброго времени суток. Давно используем ScmRTOS в своих проектах. До этого работали на LPC2148/2368/2387. В новом проекте используем LPC4330, да к тому же переходим на новую среду разработки (был IAR, а стал Eclipse+CodeSourcery). В данный момент перенес порт для Cortex-M4 в готовый, работающий проект для LPC4330. Прерывания от системного таймера и PendSV приходят, но ось раз за разом падает в HardFault. Причем падает после отработки по разу всех процессов, т.е. когда все процессы перешли в sleep. падает на строках void TKernel::sched() { uint_fast8_t NextPrty = highest_priority(ReadyProcessMap); if(NextPrty != CurProcPriority) { SchedProcPriority = NextPrty; raise_context_switch(); do // <--------------------------- вот здесь { enable_context_switch(); DUMMY_INSTR(); disable_context_switch(); } while(CurProcPriority != SchedProcPriority); // until context switch done } } Я использую стартап и ld-скрипт от библиотеки CMSIS. С стартапом понятно, там переделал названия прерываний и все, а подскажите пожалуйста с ld-скриптом. Сейчас он выглядит вот так: OUTPUT_FORMAT ("elf32-littlearm", "elf32-bigarm", "elf32-littlearm") ENTRY(_start) SEARCH_DIR(.) GROUP(-lgcc -lc -lcs3 -lcs3unhosted -lcs3micro) MEMORY { rom (rx) : ORIGIN = 0x10000000, LENGTH = 128K ram (rwx) : ORIGIN = 0x10008000, LENGTH = 32K } /* These force the linker to search for particular symbols from * the start of the link process and thus ensure the user's * overrides are picked up */ EXTERN(__cs3_reset_cortex_m) EXTERN(__cs3_interrupt_vector_cortex_m) EXTERN(__cs3_start_c main __cs3_stack __cs3_stack_size __cs3_heap_end) PROVIDE(__cs3_stack = __cs3_region_start_ram + __cs3_region_size_ram); PROVIDE(__cs3_stack_size = __cs3_region_start_ram + __cs3_region_size_ram - _end); PROVIDE(__cs3_heap_start = _end); PROVIDE(__cs3_heap_end = __cs3_region_start_ram + __cs3_region_size_ram); SECTIONS { .text : { CREATE_OBJECT_SYMBOLS __cs3_region_start_rom = .; *(.cs3.region-head.rom) __cs3_interrupt_vector = __cs3_interrupt_vector_cortex_m; *(.cs3.interrupt_vector) /* Make sure we pulled in an interrupt vector. */ ASSERT (. != __cs3_interrupt_vector_cortex_m, "No interrupt vector"); *(.rom) *(.rom.B) __cs3_reset = __cs3_reset_cortex_m; *(.cs3.reset) /* Make sure we pulled in some reset code. */ ASSERT (. != __cs3_reset, "No reset code"); *(.text .text.* .gnu.linkonce.t.*) *(.plt) *(.gnu.warning) *(.glue_7t) *(.glue_7) *(.vfp11_veneer) *(.rodata .rodata.* .gnu.linkonce.r.*) *(.ARM.extab* .gnu.linkonce.armextab.*) *(.gcc_except_table) *(.eh_frame_hdr) *(.eh_frame) . = ALIGN(4); KEEP(*(.init)) . = ALIGN(4); __preinit_array_start = .; KEEP (*(.preinit_array)) __preinit_array_end = .; . = ALIGN(4); __init_array_start = .; KEEP (*(SORT(.init_array.*))) KEEP (*(.init_array)) __init_array_end = .; . = ALIGN(0x4); KEEP (*crtbegin.o(.ctors)) KEEP (*(EXCLUDE_FILE (*crtend.o) .ctors)) KEEP (*(SORT(.ctors.*))) KEEP (*crtend.o(.ctors)) . = ALIGN(4); KEEP(*(.fini)) . = ALIGN(4); __fini_array_start = .; KEEP (*(.fini_array)) KEEP (*(SORT(.fini_array.*))) __fini_array_end = .; KEEP (*crtbegin.o(.dtors)) KEEP (*(EXCLUDE_FILE (*crtend.o) .dtors)) KEEP (*(SORT(.dtors.*))) KEEP (*crtend.o(.dtors)) . = ALIGN(4); __cs3_regions = .; LONG (0) LONG (__cs3_region_init_ram) LONG (__cs3_region_start_ram) LONG (__cs3_region_init_size_ram) LONG (__cs3_region_zero_size_ram) } /* .ARM.exidx is sorted, so has to go in its own output section. */ __exidx_start = .; .ARM.exidx : { *(.ARM.exidx* .gnu.linkonce.armexidx.*) } >rom __exidx_end = .; .text.align : { . = ALIGN(8); _etext = .; } >rom __cs3_region_size_rom = LENGTH(rom); __cs3_region_num = 1; .data : { __cs3_region_start_ram = .; *(.cs3.region-head.ram) KEEP(*(.jcr)) *(.got.plt) *(.got) *(.shdata) *(.data .data.* .gnu.linkonce.d.*) *(.ram) . = ALIGN (8); _edata = .; } >ram AT>rom .bss : { __bss_start__ = .; *(.shbss) *(.bss .bss.* .gnu.linkonce.b.*) *(COMMON) *(.ram.B) . = ALIGN (8); _end = .; __end = .; __bss_end__ = .; } >ram AT>rom .heap : { *(.heap) } >ram .stack (__cs3_stack - __cs3_stack_size) : { *(.stack) } >ram __cs3_region_init_ram = LOADADDR (.data); __cs3_region_init_size_ram = _edata - __cs3_region_start_ram; __cs3_region_zero_size_ram = _end - _edata; __cs3_region_size_ram = LENGTH(ram); __cs3_region_num = 1; .stab 0 (NOLOAD) : { *(.stab) } .stabstr 0 (NOLOAD) : { *(.stabstr) } /* DWARF debug sections. * Symbols in the DWARF debugging sections are relative to the beginning * of the section so we begin them at 0. */ /* DWARF 1 */ .debug 0 : { *(.debug) } .line 0 : { *(.line) } /* GNU DWARF 1 extensions */ .debug_srcinfo 0 : { *(.debug_srcinfo) } .debug_sfnames 0 : { *(.debug_sfnames) } /* DWARF 1.1 and DWARF 2 */ .debug_aranges 0 : { *(.debug_aranges) } .debug_pubnames 0 : { *(.debug_pubnames) } /* DWARF 2 */ .debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) } .debug_abbrev 0 : { *(.debug_abbrev) } .debug_line 0 : { *(.debug_line) } .debug_frame 0 : { *(.debug_frame) } .debug_str 0 : { *(.debug_str) } .debug_loc 0 : { *(.debug_loc) } .debug_macinfo 0 : { *(.debug_macinfo) } /* SGI/MIPS DWARF 2 extensions */ .debug_weaknames 0 : { *(.debug_weaknames) } .debug_funcnames 0 : { *(.debug_funcnames) } .debug_typenames 0 : { *(.debug_typenames) } .debug_varnames 0 : { *(.debug_varnames) } .note.gnu.arm.ident 0 : { KEEP (*(.note.gnu.arm.ident)) } .ARM.attributes 0 : { KEEP (*(.ARM.attributes)) } /DISCARD/ : { *(.note.GNU-stack) } } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 119 25 февраля, 2014 Опубликовано 25 февраля, 2014 · Жалоба Причем падает после отработки по разу всех процессов, т.е. когда все процессы перешли в sleep.У меня такое поведение наблюдается когда обработчик прерывания системного таймера не попадает в таблицу векторов и вместо него попадает либо 0 либо default_handler. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Alex_rav 0 25 февраля, 2014 Опубликовано 25 февраля, 2014 · Жалоба Странно, но в Hardfault падает после перехода в процесс TIdleProc. template<> void TIdleProc::exec() { for(;;) { #if scmRTOS_IDLE_HOOK_ENABLE == 1 idle_process_user_hook(); \\ <------------------заходит сюда и потом падает в HardFault #endif #if scmRTOS_TARGET_IDLE_HOOK_ENABLE == 1 idle_process_target_hook(); #endif } } Прерывания системного таймера происходят, вижу это в отладчике. Чувствую что где-то что-то просто пропустил при переносе, но не пойму пока что. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 119 25 февраля, 2014 Опубликовано 25 февраля, 2014 · Жалоба idle_process_user_hook() - ваша функция. Может стека для TIdleProc мало выделили и она складывая в стек содержимое LR что-то портит? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Alex_rav 0 26 февраля, 2014 Опубликовано 26 февраля, 2014 · Жалоба idle_process_user_hook() - ваша функция. Может стека для TIdleProc мало выделили и она складывая в стек содержимое LR что-то портит? Размер для стека : #define scmRTOS_IDLE_PROCESS_STACK_SIZE (100 * sizeof(stack_item_t)) Мне тоже кажется что что-то не ладно со стеком. Буду разбираться с скриптами и памятью. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться