Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Переключение контекста в FreeRTOS
Форум разработчиков электроники ELECTRONIX.ru > Cистемный уровень проектирования > Операционные системы > FreeRTOS
xelax
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();
    }
klen
а crt.s ппокажи. мож забыл перевести из режима SYSTEM в SUPERVISOR перед вызовом main. шедуллер нада запускать из под супервизора.
xelax
Цитата(klen @ Dec 7 2007, 16:47) *
а crt.s ппокажи. мож забыл перевести из режима SYSTEM в SUPERVISOR перед вызовом main. шедуллер нада запускать из под супервизора.


Да нет всё перевожу как надо...
Проект даже какое-то время работает. А потом такая фигня вылазит.
К стати когда увеличил стек задачи до 4к, стала вылазить реже.
Сдаётся мне, что где-то кто-то по стеку проходится и гадит там.
Другого вывода пока не вижу.

Не FreeRTOS же глючит smile.gif

К стати вопрос такой, а в USER моде что-нибудь крутится. Нужно ли для этого режима стек выделять?
klen
у меня он начинается с конца всех остальных стеков вниз, соответственно он "вниз" до начала блоков содержащих данные. Тоесь все что осталось от выделение всего другого.
xelax
Цитата(klen @ Dec 7 2007, 22:29) *
у меня он начинается с конца всех остальных стеков вниз, соответственно он "вниз" до начала блоков содержащих данные. Тоесь все что осталось от выделение всего другого.


То же самое и у меня...
Еще вопросец, а если закончится стек выделяемый под задачу, как себя FreeRTOS при переключения контекста поведет?
klen
Цитата(xelax @ Dec 8 2007, 09:38) *
То же самое и у меня...
Еще вопросец, а если закончится стек выделяемый под задачу, как себя FreeRTOS при переключения контекста поведет?

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

я щас для тестирования состояния стеков хочу попробывать такуй финт. прописать 0xffffffff с (конца памяти - 32байта) до конца стека крайней задачки, таким образом знаем адреса границ стеков и мониторим в пиковое использование стеков во всех задачках. Наверно есть чтото более умное но я тока щас подумал об этом
xelax
Цитата(klen @ Dec 8 2007, 13:22) *
я полагаю два варианта:
1. стек задачки самый нижний, тогда похерятся данные и когда ктонить с ними будет работать то может произойти аботр(например если там указатели были)
2. стек задачки самый не самы нижний, тогда захерится вершинка стека другой задачки, что тоже приведет к траблам - ну например она просто не сможет востановить свой контекст и будет опятже глюк

я щас для тестирования состояния стеков хочу попробывать такуй финт. прописать 0xffffffff с (конца памяти - 32байта) до конца стека крайней задачки, таким образом знаем адреса границ стеков и мониторим в пиковое использование стеков во всех задачках. Наверно есть чтото более умное но я тока щас подумал об этом


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

Как эксперимент прошёл, результаты какие?
Alechek
Цитата(klen @ Dec 8 2007, 16:22) *
Наверно есть чтото более умное но я тока щас подумал об этом

Бр... так вроде сама FreeRTOS может мониторить стеки.
хинт: vTaskList()
xelax
Цитата(Alechek @ Dec 10 2007, 10:14) *
Бр... так вроде сама FreeRTOS может мониторить стеки.
хинт: vTaskList()


Очень интересно,

Lists all the current tasks, along with their current state and stack usage high water mark.


А подробней, что содержится в отладочной информации есть информация. Что-то в описании нет ничего конкретного.
xelax
Обнаружил проблему.
Был вход и выход в\из критической секции в прерывании, в итоге разрешались прерывания в режиме IRQ. Ну а дальше вложенные прерывания убивали всё остальное напроч.
Сергей Борщ
Цитата(xelax @ Dec 11 2007, 12:38) *
Был вход и выход в\из критической секции в прерывании, в итоге разрешались прерывания в режиме IRQ.
Перепешите процедуры вход а выхода. После выхода состояние разрешения прерываний должно быть таким же, как и перед входом. Иначе как организовывать вложенные критические секции?
xelax
Цитата(Сергей Борщ @ 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.
klen
посмотрел vTaskList, а где и когда ее вызывать можно то? а то чето не все задачи в буфер кладутся...
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.