Jump to content

    

Igor_F

Участник
  • Content Count

    5
  • Joined

  • Last visited

Community Reputation

0 Обычный
  1. Листинг выглядит следующим образом: 00002C66 BC01 POP {R0} 00002C68 4700 BX R0 00002C6A 0000 LSL R0, R0, #0 static void prvInitialiseTaskLists( void ) { Next label is a Thumb label prvInitialiseTaskLists: 00002C6C B510 PUSH {R4, LR} for( uxPriority = 0; uxPriority <configMAX_PRIORITIES; uxPriority++ ) 00002C6E 2000 MOV R0, #0 00002C70 1C04 MOV R4, R0 for( uxPriority = 0; uxPriority <configMAX_PRIORITIES; uxPriority++ ) 00002C72 2CFF CMP R4, #255 00002C74 D207 BCS 0x002C86 vListInitialise( ( xList * ) &( pxReadyTasksLists[ uxPriority ] ) ); 00002C76 2014 MOV R0, #20 00002C78 4360 MUL R0, R4 00002C7A 4962 LDR R1, [PC,#0x188] ; [0x2E04] =pxReadyTasksLists (0x2037E8) 00002C7C 1808 ADD R0, R1, R0 00002C7E F7FF ; pre BL/BLX 00002C80 FADB BL vListInitialise ; 0x2238 for( uxPriority = 0; uxPriority <configMAX_PRIORITIES; uxPriority++ ) 00002C82 1C64 ADD R4, R4, #1 00002C84 E7F5 B 0x002C72 vListInitialise( ( xList * ) &xDelayedTaskList1 ); 00002C86 480C LDR R0, [PC,#0x030] ; [0x2CB8] =xDelayedTaskList1 (0x204BD4) 00002C88 F7FF ; pre BL/BLX 00002C8A FAD6 BL vListInitialise ; 0x2238
  2. Не знаю какая разница "unsigned char uxPriority" и "char uxPriority" ведь у нас явное присвоение "0", а не 255 или -1. Так что хоть раз должен был зайти в цикл. Так что указание знаковая она или беззнаковая роли не играет. Но на всякий случай она "unsigned"
  3. Подскажите, сталкивался ли кто-нибудь с подобной проблемой: при проверки условий "больше-меньше" (видим это в отладчике) программа явно неправильно проверяет эти условия в for-ах, if-ах и т.п. Например: for( uxPriority = 0; uxPriority <configMAX_PRIORITIES; uxPriority++ ) // здесь configMAX_PRIORITIES=255 { vListInitialise( ( xList * ) &( pxReadyTasksLists[ uxPriority ] ) ); } В отладчике видим, что uxPriority дествительно =0, но в цикл мы не попадаем. С подобной проблемой сталкиваемся постоянно в разных частях программы, хотя вся оптимизация выключена. Если кто-то встречался с данной проблемой, подскажите, как с ней бороться.
  4. Помогите, пожалуйста, разобраться. Работаем с процессором AT91SAM7X256, компилятор IAR. Есть два обработчика IRQ. Первый из них: ////////////////////////////////////////// IRQ_Handler_Entry: ;------------------------- ;- Manage Exception Entry ;------------------------- ;- Adjust and save LR_irq in IRQ stack sub lr, lr, #4 stmfd sp!, {lr} ;- Save r0 and SPSR (need to be saved for nested interrupt) mrs r14, SPSR stmfd sp!, {r0,r14} ;- Write in the IVR to support Protect Mode ;- No effect in Normal Mode ;- De-assert the NIRQ and clear the source in Protect Mode ldr r14, =AT91C_BASE_AIC ldr r0 , [r14, #AIC_IVR] str r14, [r14, #AIC_IVR] ;- Enable Interrupt and Switch in Supervisor Mode msr CPSR_c, #ARM_MODE_SVC ;- Save scratch/used registers and LR in User Stack stmfd sp!, { r1-r3, r12, r14} ;---------------------------------------------- ;- Branch to the routine pointed by the AIC_IVR ;---------------------------------------------- mov r14, pc bx r0 ;---------------------------------------------- ;- Manage Exception Exit ;---------------------------------------------- ;- Restore scratch/used registers and LR from User Stack ldmia sp!, { r1-r3, r12, r14} ;- Disable Interrupt and switch back in IRQ mode msr CPSR_c, #I_BIT | ARM_MODE_IRQ ;- Mark the End of Interrupt on the AIC ldr r14, =AT91C_BASE_AIC str r14, [r14, #AIC_EOICR] ;- Restore SPSR_irq and r0 from IRQ stack ldmia sp!, {r0,r14} msr SPSR_cxsf, r14 ;- Restore adjusted LR_irq from IRQ stack directly in the PC ldmia sp!, {pc}^ /////////////////////////////////////////// И второй, который вызывается по следующей команде: LDR PC, [PC, #-0xF20] ; Jump directly to the address given by the AIC Вот этот обработчик: vPortPreemptiveTick: portSAVE_CONTEXT ; Save the context of the current task. LDR R0, =vTaskIncrementTick ; Increment the tick count - this may wake a task. mov lr, pc BX R0 LDR R0, =vTaskSwitchContext ; Select the next task to execute. mov lr, pc BX R0 LDR R14, =AT91C_BASE_PITC ; Clear the PIT interrupt LDR R0, [R14, #PITC_PIVR ] LDR R14, =AT91C_BASE_AIC ; Mark the End of Interrupt on the AIC STR R14, [R14, #AIC_EOICR] portRESTORE_CONTEXT ; Restore the context of the selected task. При этом первый из них нормально обрабатывает прерывания USART-а, но при переключении между задачами программа вылетает в исключение Data Abort. При использовании второго обработчика переключение между задачами происходит корректно, но другие прерывания (USART, таймеры) не работают (тоже происходит исключение Data Abort). Подскажите, как можно объединить два эти обработчика. И, если не трудно, оставьте ссылку на data sheet с описанием ассемблера AT91SAM7X256.
  5. На этом самом ките(AT91SAM7X-EK) пример не идет, он где то в неопределенности находится :07: . Хотя в симуляторе на main попадет и дальше идет :05: . Может у кого-нибудь есть работающие примеры freeRTOS для этого кита под IAR