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

 
 
> Переключение контекста
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
Ответов
Lagman
сообщение Dec 15 2013, 12:48
Сообщение #2


Знающий
****

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



покажите как вы создаете задачу (с какими параметрами) и саму задачу.
И еще уровни приоритета прерываний. (configKERNEL_INTERRUPT_PRIORITY , configMAX_SYSCALL_INTERRUPT_PRIORITY)
Go to the top of the page
 
+Quote Post
juvf
сообщение Dec 15 2013, 14:28
Сообщение #3


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

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



Цитата(Lagman @ Dec 15 2013, 17:48) *
покажите как вы создаете задачу (с какими параметрами) и саму задачу.
И еще уровни приоритета прерываний. (configKERNEL_INTERRUPT_PRIORITY , configMAX_SYSCALL_INTERRUPT_PRIORITY)

Код
#define configUSE_PREEMPTION        1
#define configUSE_IDLE_HOOK            0
#define configUSE_TICK_HOOK            0
#define configCPU_CLOCK_HZ            ( ( unsigned long ) 22148100 )    
#define configTICK_RATE_HZ            ( ( portTickType ) 1000 )
#define configMAX_PRIORITIES        ( ( unsigned portBASE_TYPE ) 5 )
#define configMINIMAL_STACK_SIZE    ( ( unsigned short ) 80 )
#define configTOTAL_HEAP_SIZE        ( ( size_t ) 3500 )
#define configMAX_TASK_NAME_LEN        ( 16 )
#define configUSE_TRACE_FACILITY    0
#define configUSE_16_BIT_TICKS        0
#define configIDLE_SHOULD_YIELD        1

#define configUSE_MUTEXES            1
#define configCHECK_FOR_STACK_OVERFLOW        1

/* Co-routine definitions. */
#define configUSE_CO_ROUTINES         0
#define configMAX_CO_ROUTINE_PRIORITIES ( 2 )

/* Set the following definitions to 1 to include the API function, or zero
to exclude the API function. */

#define INCLUDE_vTaskPrioritySet        0
#define INCLUDE_uxTaskPriorityGet        0
#define INCLUDE_vTaskDelete                0
#define INCLUDE_vTaskCleanUpResources    0
#define INCLUDE_vTaskSuspend            0
#define INCLUDE_vTaskDelayUntil            1
#define INCLUDE_vTaskDelay                1
#define INCLUDE_uxTaskGetStackHighWaterMark 1

/* This is the raw value as per the Cortex-M3 NVIC.  Values can be 255
(lowest) to 0 (1?) (highest). */
#define configKERNEL_INTERRUPT_PRIORITY         255
/* !!!! configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to zero !!!!
See http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html. */
#define configMAX_SYSCALL_INTERRUPT_PRIORITY     191 /* equivalent to 0xb0, or priority 11. */


/* This is the value being used as per the ST library which permits 16
priority values, 0 to 15.  This must correspond to the
configKERNEL_INTERRUPT_PRIORITY setting.  Here 15 corresponds to the lowest
NVIC value of 255. */
#define configLIBRARY_KERNEL_INTERRUPT_PRIORITY    15


Код
int main()
{
    systemInit();
    portBASE_TYPE pTask;
    pTask = xTaskCreate(uartTask, (const signed char* )"uartTask", 130, 0, 3, 0);
    if(pTask == pdPASS )
        vTaskStartScheduler();
    return 0;
}


Обработчик прерывание см выше void USART1_IRQHandler(void).

Код
void uartTask(void *parametr)
{
    static uint16_t countRx;
    uint8_t byte;
    for(;;)
    {
        xQueueReceive(uart485Queue, &byte, portMAX_DELAY);
        countRx = 0;
        rxBuffer[countRx] = byte;
        if(rxBuffer[countRx++] == '#')
        {
            //Обработчик приема.
        }
        vTaskDelay(1);
    }

}


Задача блокируется га xQueueReceive(uart485Queue, &byte, portMAX_DELAY); После прихода байта из прерывания в очередь отправляется байт. Задача переходить с сотояние готовности. Но если не сделать принудительного переключения в прерывании, то задача больше ни когда не получит управления.

Пересобрал проект на фриртос 7.2.0 - всё заработало. До версии 7.4 включително должно работать. в 7.5 - уже не будет.

вот пример обработчика системного тика для АтМеги в 7.2.0
Код
vPortYieldFromTick:
    portSAVE_CONTEXT; Save the context of the current task.
    call vTaskIncrementTick; Call the timer tick function.
    call vTaskSwitchContext; Call the scheduler.
    portRESTORE_CONTEXT; Restore the context of whichever task the ...
    ret                ; ... scheduler decided should run.

а вот тот же порт, только в 7.6.0
Код
vPortYieldFromTick:
    portSAVE_CONTEXT; Save the context of the current task.
    call xTaskIncrementTick; Call the timer tick function.
    tst r16
    breq SkipTaskSwitch
    call vTaskSwitchContext; Call the scheduler.
SkipTaskSwitch:
    portRESTORE_CONTEXT; Restore the context of whichever task the ...
    ret                ; ... scheduler decided should run.

Видно, то в 7.6 вызывается xTaskIncrementTick, потом делается витвление. В 7.2 ни каких ветвлений. Жесткий вызов vTaskSwitchContext
Go to the top of the page
 
+Quote Post



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

 


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


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