Цитата(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