|
|
  |
SAM7S + Keil + FreeRTOS прощу помощи |
|
|
|
Nov 25 2008, 11:54
|

Частый гость
 
Группа: Свой
Сообщений: 169
Регистрация: 17-09-07
Из: Красноярск
Пользователь №: 30 600

|
Впервые для себя портирую ОС. Так как этой комбинации порта не прилагается, то с горем пополам собрал из имеющихся портов своё. Код static void prvSetupTimerInterrupt( void ) { AT91PS_PITC pxPIT = AT91C_BASE_PITC;
extern void ( vPortPreemptiveTick )( void ); AT91F_AIC_ConfigureIt( AT91C_BASE_AIC, AT91C_ID_SYS, AT91C_AIC_PRIOR_HIGHEST, portINT_LEVEL_SENSITIVE, ( void (*)(void) ) vPortPreemptiveTick );
pxPIT->PITC_PIMR = portPIT_ENABLE | portPIT_INT_ENABLE | portPIT_COUNTER_VALUE;
AT91F_AIC_EnableIt( AT91C_BASE_AIC, AT91C_ID_SYS ); } Код 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. Запуск приложения Код static void vHW( void *pvParameters ) { ( void ) pvParameters;
for(;; ) { var++; } }
int main (void) { xTaskCreate(vHW, "Hi", 512, NULL, tskIDLE_PRIORITY + 1, NULL ); vTaskStartScheduler(); } При запуске в симуляторе Tick вызывается как и следует, всё остальное время выполнение висит на IRQ_Handler. В IdleTask дабагер не видит следов. Где искать проблему? Заранее спасибо!
|
|
|
|
|
Nov 25 2008, 13:43
|

Частый гость
 
Группа: Свой
Сообщений: 169
Регистрация: 17-09-07
Из: Красноярск
Пользователь №: 30 600

|
Цитата(aaarrr @ Nov 25 2008, 19:16)  В симуляторе, ИМХО. Можете посмотреть в AIC_IPR, кто это прерывание (якобы) держит. В асмовский код я практически не вникал ( переносил его с IAR порта ) и пока что вообще мало вникал в низкоуровневый механизм ядра. Поэтому мало вериться что грешить в этом случае будет симулятор, ну это так, на уровне правды жизни  Еденички AIC_IPR в мониторе AIC стоят на напротив: Fast External Int External Int 1 External Int 2 что вроде как галочками от юзера и определяется... но от их перестановки ничего не меняется
|
|
|
|
|
Nov 25 2008, 14:08
|

Частый гость
 
Группа: Свой
Сообщений: 169
Регистрация: 17-09-07
Из: Красноярск
Пользователь №: 30 600

|
Цитата(aaarrr @ Nov 25 2008, 20:48)  Симулятор может и будет грешить, ибо его основная обязанность - симулировать ядро, а не периферию (как то контроллер прерываний, таймеры и прочую чепуху). Угу. А что в AIC_IMR? 0x00000002 От SYSIRQ еденичка как и должно быть, вроде как
|
|
|
|
|
Nov 25 2008, 16:38
|

Частый гость
 
Группа: Свой
Сообщений: 169
Регистрация: 17-09-07
Из: Красноярск
Пользователь №: 30 600

|
Ситуация проясняется То что программа перескачила в ту область - чистое совпадение (см значение для R14) А вот почему в РС попадает значение этого поля, а не предыдущего ( ( portSTACK_TYPE ) pxCode + portINSTRUCTION_SIZE ) я понять не могу. Код portSTACK_TYPE *pxPortInitialiseStack( portSTACK_TYPE *pxTopOfStack, pdTASK_CODE pxCode, void *pvParameters ) { portSTACK_TYPE *pxOriginalTOS;
pxOriginalTOS = pxTopOfStack;
/* Setup the initial stack of the task. The stack is set exactly as expected by the portRESTORE_CONTEXT() macro. */
/* First on the stack is the return address - which in this case is the start of the task. The offset is added to make the return address appear as it would within an IRQ ISR. */ *pxTopOfStack = ( portSTACK_TYPE ) pxCode + portINSTRUCTION_SIZE; pxTopOfStack--;
*pxTopOfStack = ( portSTACK_TYPE ) 0x00000000; /* R14 */ pxTopOfStack--; *pxTopOfStack = ( portSTACK_TYPE ) pxOriginalTOS; /* Stack used when task starts goes in R13. */ pxTopOfStack--; *pxTopOfStack = ( portSTACK_TYPE ) 0x12121212; /* R12 */ pxTopOfStack--; *pxTopOfStack = ( portSTACK_TYPE ) 0x11111111; /* R11 */ pxTopOfStack--; *pxTopOfStack = ( portSTACK_TYPE ) 0x10101010; /* R10 */ pxTopOfStack--; *pxTopOfStack = ( portSTACK_TYPE ) 0x09090909; /* R9 */ pxTopOfStack--; *pxTopOfStack = ( portSTACK_TYPE ) 0x08080808; /* R8 */ pxTopOfStack--; *pxTopOfStack = ( portSTACK_TYPE ) 0x07070707; /* R7 */ pxTopOfStack--; *pxTopOfStack = ( portSTACK_TYPE ) 0x06060606; /* R6 */ pxTopOfStack--; *pxTopOfStack = ( portSTACK_TYPE ) 0x05050505; /* R5 */ pxTopOfStack--; *pxTopOfStack = ( portSTACK_TYPE ) 0x04040404; /* R4 */ pxTopOfStack--; *pxTopOfStack = ( portSTACK_TYPE ) 0x03030303; /* R3 */ pxTopOfStack--; *pxTopOfStack = ( portSTACK_TYPE ) 0x02020202; /* R2 */ pxTopOfStack--; *pxTopOfStack = ( portSTACK_TYPE ) 0x01010101; /* R1 */ pxTopOfStack--;
/* When the task starts is will expect to find the function parameter in R0. */ *pxTopOfStack = ( portSTACK_TYPE ) pvParameters; /* R0 */ pxTopOfStack--;
*pxTopOfStack = ( portSTACK_TYPE ) portINITIAL_SPSR;
*pxTopOfStack = portNO_CRITICAL_SECTION_NESTING;
return pxTopOfStack; } Ответ здесь, но мои знания АСМа не позволяют воспринять. Код LDR R1, =pxCurrentTCB LDR R0, [R1] LDR LR, [R0]
; The critical nesting depth is the first item on the stack. ; Load it into the ulCriticalNesting variable. LDR R0, =ulCriticalNesting LDMFD LR!, {R1} STR R1, [R0]
; Get the SPSR from the stack. LDMFD LR!, {R0} MSR SPSR_cxsf, R0
; Restore all system mode registers for the task. LDMFD LR, {R0-R14}^ NOP
; Restore the return address. LDR LR, [LR, #+60]
; And return - correcting the offset in the LR to obtain the ; correct address. SUBS PC, LR, #4 Насколько важно в момент первого "восстановления контекста" ещё незапущенной задачи иметь режим супервизора? В моём случае процессор лопатит всё в юзер мод, отсего, как я понимаю MSR SPSR_cxsf, R0 эта команда статус регист не обновляет.
|
|
|
|
|
Nov 25 2008, 17:28
|

Частый гость
 
Группа: Свой
Сообщений: 169
Регистрация: 17-09-07
Из: Красноярск
Пользователь №: 30 600

|
Цитата(aaarrr @ Nov 25 2008, 23:58)  Принципиально важно. Как это по уму организовать? Не входить в юзер мод вообще? Беглый взгяд на все порты арм7 говорит что там всё именно так. Или я не прав? Чем грозит такой подход в общем случае? (опять же, если я прав)
|
|
|
|
|
Nov 25 2008, 17:40
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(Goofy @ Nov 25 2008, 20:28)  Не входить в юзер мод вообще? Да, не входить вообще. Цитата(Goofy @ Nov 25 2008, 20:28)  Чем грозит такой подход в общем случае? (опять же, если я прав) Ничем не грозит.
|
|
|
|
|
Nov 25 2008, 17:45
|

Частый гость
 
Группа: Свой
Сообщений: 169
Регистрация: 17-09-07
Из: Красноярск
Пользователь №: 30 600

|
Всё заработало! Спасибо большое!
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|