Перейти к содержанию
    

SYSTICKFREQ - это частота тактирования системного таймера.

А SYSTICKINTRATE - это желаемая частота прерываний системного таймера. В герцах.

Аргумент функции sleep() - число тиков системного таймера.

То есть, скажем, если SYSTICKINTRATE = 1000, то аргумент sleep() будет в миллисекундах, и для того, чтобы проспать секунду, надо написать sleep(1000);.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

При портировании 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 что-то не учтено?

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Поскольку в исходниках ОС нет явного вызова __near_memzero, значит его вызывает сам компилятор и значит да - это бага компилятора.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

При портировании 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). Почему так - надо смотреть настройки проекта/тулчейна, почему-то не та библиотека линкуется.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

По всему видно, что библиотечный модуль ?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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

понимаю что не по делу но может с xмеги на арм пересесть stm32f(1/3) очень приятные изделия, последний раз когда сталкивался с аврами периферия работала совсем не так как описано в даташитах

 

 

цена практически та же но 32 разряда плюс внутрисхемная отладка плюс свободные средства разработки плюс рабочие порты

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

понимаю что не по делу но может с xмеги на арм пересесть stm32f(1/3) очень приятные изделия, последний раз когда сталкивался с аврами периферия работала совсем не так как описано в даташитах

 

цена практически та же но 32 разряда плюс внутрисхемная отладка плюс свободные средства разработки плюс рабочие порты

 

Зачем мне ARM? У меня и на Xmega все работает :) Включая scmRTOS.

 

Периферия у Xmega мне нравится на порядок больше чем у STM32F1, особенно система событий позволяющая кучу работы сделать аппаратно без участия программы и встроенный EEPROM.

Внутрисхемная отладка и у AVR есть, без нее приходится отлаживать программы только для старья вроде ATmega8 и ATtiny15.

Свободные средства разработки тоже есть, не так как у STM8.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Есть несколько вопросов по 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

 

С уважением.

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2. Я использую версию оси 3.11,т.к версии 4.0 для AT91SAM7 нет.

Для 3-й версии scmRTOS нет описания.Есть для версий 2 и 4.

Какое будет актульнее для 3-й?

А в trunk лежит не то, что Вам нужно? Порт только для GCC. Для отладки в 4.0 пример Debug с применением Extensions.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А в trunk лежит не то, что вам нужно? Порт только для GCC.

 

Я прикидывал затраты на перепиливание существующей версии 3.11 под текущий iar и портирование под IAR GCC-ный порт 4.0.

С учетом моего нулевого опыта с АРМ-ами первый вариант мне показался проще.

Но сейчас проблема не в порте,а в подходе к написанию кода.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Доброго времени суток.

Давно используем 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) }
}

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Причем падает после отработки по разу всех процессов, т.е. когда все процессы перешли в sleep.
У меня такое поведение наблюдается когда обработчик прерывания системного таймера не попадает в таблицу векторов и вместо него попадает либо 0 либо default_handler.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Странно, но в 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
       }
   }

 

Прерывания системного таймера происходят, вижу это в отладчике. Чувствую что где-то что-то просто пропустил при переносе, но не пойму пока что.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

idle_process_user_hook() - ваша функция. Может стека для TIdleProc мало выделили и она складывая в стек содержимое LR что-то портит?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

idle_process_user_hook() - ваша функция. Может стека для TIdleProc мало выделили и она складывая в стек содержимое LR что-то портит?

 

Размер для стека :

 

#define scmRTOS_IDLE_PROCESS_STACK_SIZE     (100 * sizeof(stack_item_t))

 

Мне тоже кажется что что-то не ладно со стеком. Буду разбираться с скриптами и памятью.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...