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

 
 
> Переключение контекста
juvf
сообщение Dec 14 2013, 19:53
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 1 261
Регистрация: 14-05-09
Из: Челябинск
Пользователь №: 49 045



Порт FreeRTOS для stm32 IAR. Обнаружил зависание одной самой приоритетной задачи. Статус READY, но на неё переключения нет.

Оставил одну задачу в проекте с приоритетом 3. запускаю в дебаге.... задача в блокированном состоянии, ждет байт в очереди.

в прерывании выдаю посылаю байт в очередь.

Код
void USART1_IRQHandler(void)
{
    static uint8_t byte;
    static portBASE_TYPE xHigherPriorityTaskWoken;
    xHigherPriorityTaskWoken = pdFALSE;
    if(USART1_SR_bit.RXNE == 1)
    { //прерывание по приему
        byte = USART1_DR; //флаг прерывания сбрасывается при чтении регистра USART1_DR
        xQueueSendToBackFromISR(uart485Queue, &byte, &xHigherPriorityTaskWoken);
    }
    //portEND_SWITCHING_ISR(xHigherPriorityTaskWoken == pdTRUE );
}


До первого входа в прерывание задача в блокированном состоянии. После выдачи байта в очередь xQueueSendToBackFromISR(uart485Queue...) задача сразу переходит в состояние READY. Если в конце прерывания вызвать принудительное переключение контекста, то переключение происходит. Если не вызывать, то теоретически, переключение контекста должно произойти во время системного тика, но переключения не происходит. Всегда крутится задача IDLE, а моя задача находится в состоянии готовности и не выполняется. Посмотрел исходник обработчика системного тика - там только переключение на задачи, которые задержаны функциями delay. А где вызов планировщика и проверка приоритетных задач на готовность? Где переключение контекста?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
juvf
сообщение Dec 15 2013, 15:26
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 261
Регистрация: 14-05-09
Из: Челябинск
Пользователь №: 49 045



Цитата
Какой приоритет (в ядре cortex m3) у прерывания USART1_IRQHandler ?
44 dec

Цитата
Не увидел где очередь создается!

Код
...
xQueueHandle uart485Queue;
...
uart485Queue = xQueueCreate( 10, sizeof(char));


И всё таки..... где в фриртос 7.6.0 вызов планировщика в прерывании системого таймера?
Go to the top of the page
 
+Quote Post
Lagman
сообщение Dec 16 2013, 14:43
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 875
Регистрация: 28-10-05
Пользователь №: 10 245



http://www.freertos.org/RTOS-Cortex-M3-M4.html
Цитата(juvf @ Dec 15 2013, 19:26) *
И всё таки..... где в фриртос 7.6.0 вызов планировщика в прерывании системого таймера?

Код
void xPortSysTickHandler( void )
{
    /* The SysTick runs at the lowest interrupt priority, so when this interrupt
    executes all interrupts must be unmasked.  There is therefore no need to
    save and then restore the interrupt mask value as its value is already
    known. */
    ( void ) portSET_INTERRUPT_MASK_FROM_ISR();
    {
        /* Increment the RTOS tick. */
        if( xTaskIncrementTick() != pdFALSE )
        {
            /* A context switch is required.  Context switching is performed in
            the PendSV interrupt.  Pend the PendSV interrupt. */
            portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT;
        }
    }
    portCLEAR_INTERRUPT_MASK_FROM_ISR( 0 );
}

xPortPendSVHandler
Код
xPortPendSVHandler:
    mrs r0, psp                        
    ldr    r3, =pxCurrentTCB            /* Get the location of the current TCB. */
    ldr    r2, [r3]                        

    stmdb r0!, {r4-r11}                /* Save the remaining registers. */
    str r0, [r2]                    /* Save the new top of stack into the first member of the TCB. */

    stmdb sp!, {r3, r14}
    mov r0, #configMAX_SYSCALL_INTERRUPT_PRIORITY
    msr basepri, r0
    bl vTaskSwitchContext            
    mov r0, #0
    msr basepri, r0
    ldmia sp!, {r3, r14}

    ldr r1, [r3]                    
    ldr r0, [r1]                    /* The first item in pxCurrentTCB is the task top of stack. */
    ldmia r0!, {r4-r11}                /* Pop the registers. */
    msr psp, r0                        
    bx r14

PendSV
Я ARM не знаю, но вам эти слова должны быть понятны.
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 24th July 2025 - 22:57
Рейтинг@Mail.ru


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