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

 
 
> Переключение контекста в FreeRTOS, возникает data abort
xelax
сообщение Dec 7 2007, 11:54
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 370
Регистрация: 7-11-06
Пользователь №: 22 035



sam7x gcc

Собственно проблема в следующем. При сохраннении контекста в прерывании от PIT таймера (на нём переключение между задачами висит в preemptive mode) происходит data abort. 07.gif Как такое может быть?????

При чём смотрю стек вызовов в arm-elf-gdb(Eclipse) вижу следующую картину


data abort
vPreemptiveTick
vPreemptiveTick

То есть либо vPreemptiveTick два раза вызывалось, либо глюк gdb.

Вообще очень непонятный случай. Как такое может быть? И как с этим бороться?

Код
void vPreemptiveTick( void ) __attribute__((naked));
    void vPreemptiveTick( void )
    {
        /* Save the context of the current task. */
        portSAVE_CONTEXT();   <----- происходит data abort            

        /* Increment the tick count - this may wake a task. */
        vTaskIncrementTick();

        /* Find the highest priority task that is ready to run. */
        vTaskSwitchContext();
        
        /* wdt firing verification */
        halWdtHandler();
        
        /* End the interrupt in the AIC. */
        AT91C_BASE_AIC->AIC_EOICR = AT91C_BASE_PITC->PITC_PIVR;;
        
        portRESTORE_CONTEXT();
    }
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
xelax
сообщение Dec 11 2007, 10:38
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 370
Регистрация: 7-11-06
Пользователь №: 22 035



Обнаружил проблему.
Был вход и выход в\из критической секции в прерывании, в итоге разрешались прерывания в режиме IRQ. Ну а дальше вложенные прерывания убивали всё остальное напроч.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Dec 11 2007, 13:10
Сообщение #3


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(xelax @ Dec 11 2007, 12:38) *
Был вход и выход в\из критической секции в прерывании, в итоге разрешались прерывания в режиме IRQ.
Перепешите процедуры вход а выхода. После выхода состояние разрешения прерываний должно быть таким же, как и перед входом. Иначе как организовывать вложенные критические секции?


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
xelax
сообщение Dec 11 2007, 15:35
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 370
Регистрация: 7-11-06
Пользователь №: 22 035



Цитата(Сергей Борщ @ Dec 11 2007, 16:10) *
Перепешите процедуры вход а выхода. После выхода состояние разрешения прерываний должно быть таким же, как и перед входом. Иначе как организовывать вложенные критические секции?


Я не силён в ассемблере, как в локальную переменную адрес, которой заранее не известен сохранить значение CPSR регистра.???
Код
uint32_t  temp;

asm volatile (
        "STMDB    SP!, {R0}            \n\t"      /* Push R0. */
        "MRS    R0, CPSR             \n\t"       /* Get CPSR. */
        "ORR    R0, R0, #0xC0               \n\t"    /* Disable IRQ, FIQ. */
        "MSR    CPSR, R0            \ n\t"      /* Write back modified value. */
        "LDMIA    SP!, {R0}" );                  /* Pop R0. */



            /* Enable interrupts as per portEXIT_CRITICAL(). */
            asm volatile (
                "STMDB    SP!, {R0}        \n\t"    /* Push R0. */    
                "MRS    R0, CPSR        \n\t"     /* Get CPSR. */    
                "BIC    R0, R0, #0xC0    \n\t"           /* Enable IRQ, FIQ. */    
                "MSR    CPSR, R0        \n\t"     /* Write back modified value.    */    
                "LDMIA    SP!, {R0}" );             /* Pop R0.
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 21st August 2025 - 08:14
Рейтинг@Mail.ru


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