реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> SAM7S + Keil + FreeRTOS прощу помощи
Goofy
сообщение Nov 25 2008, 11:54
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 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 дабагер не видит следов.
Где искать проблему?
Заранее спасибо!
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Nov 25 2008, 12:16
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Goofy @ Nov 25 2008, 14:54) *
Где искать проблему?

В симуляторе, ИМХО. Можете посмотреть в AIC_IPR, кто это прерывание (якобы) держит.
Go to the top of the page
 
+Quote Post
Goofy
сообщение Nov 25 2008, 13:43
Сообщение #3


Частый гость
**

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



Цитата(aaarrr @ Nov 25 2008, 19:16) *
В симуляторе, ИМХО. Можете посмотреть в AIC_IPR, кто это прерывание (якобы) держит.

В асмовский код я практически не вникал ( переносил его с IAR порта ) и пока что вообще мало вникал в низкоуровневый механизм ядра. Поэтому мало вериться что грешить в этом случае будет симулятор, ну это так, на уровне правды жизни smile.gif

Еденички AIC_IPR в мониторе AIC стоят на напротив:
Fast External Int
External Int 1
External Int 2
что вроде как галочками от юзера и определяется...
но от их перестановки ничего не меняется
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Nov 25 2008, 13:48
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Goofy @ Nov 25 2008, 16:43) *
Поэтому мало вериться что грешить в этом случае будет симулятор, ну это так, на уровне правды жизни smile.gif

Симулятор может и будет грешить, ибо его основная обязанность - симулировать ядро, а не периферию (как то контроллер прерываний, таймеры и прочую чепуху).

Цитата(Goofy @ Nov 25 2008, 16:43) *
Еденички AIC_IPR в мониторе AIC стоят на напротив:
Fast External Int
External Int 1
External Int 2

Угу. А что в AIC_IMR?
Go to the top of the page
 
+Quote Post
Goofy
сообщение Nov 25 2008, 14:08
Сообщение #5


Частый гость
**

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



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


0x00000002
От SYSIRQ еденичка
как и должно быть, вроде как
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Nov 25 2008, 14:15
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Если (AIC_IMR & AIC_IPR) == 0, то процессор не должен валиться на IRQ_Handler.
Go to the top of the page
 
+Quote Post
Goofy
сообщение Nov 25 2008, 16:38
Сообщение #7


Частый гость
**

Группа: Свой
Сообщений: 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
эта команда статус регист не обновляет.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Nov 25 2008, 16:58
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Goofy @ Nov 25 2008, 19:38) *
Насколько важно в момент первого "восстановления контекста" ещё незапущенной задачи иметь режим супервизора?

Принципиально важно.
Go to the top of the page
 
+Quote Post
Goofy
сообщение Nov 25 2008, 17:28
Сообщение #9


Частый гость
**

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



Цитата(aaarrr @ Nov 25 2008, 23:58) *
Принципиально важно.


Как это по уму организовать?
Не входить в юзер мод вообще?
Беглый взгяд на все порты арм7 говорит что там всё именно так.
Или я не прав?

Чем грозит такой подход в общем случае? (опять же, если я прав)
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Nov 25 2008, 17:40
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Goofy @ Nov 25 2008, 20:28) *
Не входить в юзер мод вообще?

Да, не входить вообще.

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

Ничем не грозит.
Go to the top of the page
 
+Quote Post
Goofy
сообщение Nov 25 2008, 17:45
Сообщение #11


Частый гость
**

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



Всё заработало!
Спасибо большое!
Прикрепленные файлы
Прикрепленный файл  SAM7S_RV.rar ( 6.81 килобайт ) Кол-во скачиваний: 53
 
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 17th June 2025 - 00:50
Рейтинг@Mail.ru


Страница сгенерированна за 0.0146 секунд с 7
ELECTRONIX ©2004-2016