Только сегодня добрался до проекта. Работа, однако!
Итак, дело действительно было в приоритетах и только в приоритетах.
Я их поправил и всё заиграло!
И вот что я сделал по-быстрому:
1. Назначил константы регистров и констант приоритетов:
CODE
#if defined __ARM_ARCH_6M__ // Cortex-M0(+)/Cortex-M1
NVIC_SYSPRI14 EQU 0xE000ED20 // System priority register (priority 12..15).
NVIC_PENDSV_PRI EQU 0x00C00000 // PendSV priority value (lowest)
NVIC_SYSPRI15 EQU 0xE000ED20 // System priority register (priority 12..15).
NVIC_ST_PRI EQU 0xC0000000 // SysTick priority value (lowest)
#else
NVIC_SYSPRI14 EQU 0xE000ED22 // System priority register (priority 14).
NVIC_PENDSV_PRI EQU 0xFF // PendSV priority value (lowest).
NVIC_SYSPRI15 EQU 0xE000ED23 // System priority register (priority 15).
NVIC_ST_PRI EQU 0xFF // SysTick priority value (lowest).
#endif
NVIC_ST_CTRL EQU 0xE000E010 // SysTick Ctrl & Status Reg.
NVIC_ST_RELOAD EQU 0xE000E014 // SysTick Reload Value Reg.
NVIC_ST_CTRL_CLK_SRC EQU 0x00000004 // Clock Source.
NVIC_ST_CTRL_INTEN EQU 0x00000002 // Interrupt enable.
NVIC_ST_CTRL_ENABLE EQU 0x00000001 // Counter mode.
2. Поправил загрузку приоритета PendSV в os_start:
CODE
os_start
#if defined __ARM_ARCH_6M__ // Cortex-M0(+)/Cortex-M1
LDR R1, =NVIC_SYSPRI14 // Set the SysTick exception priority (lowest)
LDR R2, =NVIC_PENDSV_PRI
LDR R3, [R1]
ADD R2, R3
STR R2, [R1]
#else
LDR R1, =NVIC_SYSPRI14 // Set the PendSV exception priority (lowest)
LDR R2, =NVIC_PENDSV_PRI
STRB R2, [R1]
#endif
3. Поправил загрузку приоритета SysTick в init_system_timer:
CODE
init_system_timer
#if defined __ARM_ARCH_6M__ // Cortex-M0(+)/Cortex-M1
LDR R1, =NVIC_SYSPRI15 // Set the SysTick exception priority (lowest)
LDR R2, =NVIC_ST_PRI
LDR R3, [R1]
ADD R2, R3
STR R2, [R1]
#else
LDR R1, =NVIC_SYSPRI15 // Set the SysTick exception priority (lowest)
LDR R2, =NVIC_ST_PRI
STRB R2, [R1]
#endif
Всем спасибо!
PS Хотел сделать по-красивому, как для mx-gcc, но не пошла строчка:
CODE
" LDR R1, =os_context_switch_hook \n" // call os_context_switch_hook();
Как сделать видимой для IAR-овского встроенного ассемблера адрес функции из другого модуля?