任务内核
portDISABLE_INTERRUPTS() portENABLE_INTERRUPTS()
关闭FreeRTOS可管理的5-15优先级的中断
开启FreeRTOS可管理的5-15优先级的中断
taskENTER_CRITICAL() taskEXIT_CRITICAL()
任务中进入临界段
任务中退出临界段
taskENTER_CRITICAL() ;
{
… … /* 临界区 */
}
taskEXIT_CRITICAL() ;
taskENTER_CRITICAL_FROM_ISR() taskEXIT_CRITICAL_FROM_ISR()
中断中进入临界段
中断中退出临界段
uint32_t save_status;
save_status = taskENTER_CRITICAL_FROM_ISR() ;
{
… … /* 临界区 */
}
taskEXIT_CRITICAL_FROM_ISR(save_status );
vTaskSuspendAll() xTaskResumeAll()
实现任务调度器挂起与恢复
vTaskSuspendAll() ;
{
… … /* 内容 */
}
xTaskResumeAll();
void vTaskStartScheduler()
vTaskStartScheduler();
任务创建与删除
1.xTaskCreate
参数和返回值
BaseType_t xTaskCreate
(
TaskFunction_t pxTaskCode, /* 指向任务函数的指针 */
const char * const pcName, /* 任务名字,最大长度 configMAX_TASK_NAME_LEN */
const configSTACK_DEPTH_TYPE usStackDepth, /* 任务堆栈大小,注意字为单位 */
void * const pvParameters, /* 传递给任务函数的参数 */
UBaseType_t uxPriority, /* 任务优先级,范围: 0 ~ configMAX_PRIORITIES - 1 */
TaskHandle_t * const pxCreatedTask /* 任务句柄,就是任务的任务控制块 */
)
返回:
pdPASS 任务创建成功
errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY 任务创建失败
实现例程
#define START_TASK_STACK_SIZE 128 //栈大小
#define START_TASK_PRIO 1 //优先级
TaskHandle_t start_task_handle; //句柄
void startTask(void* pvParamenters);
#define TASK1_STACK_SIZE 128
#define TASK1_PRIO 2
TaskHandle_t task1_handle;
void task1(void* pvParamenters);
void freertos_demo(void)
{
xTaskCreate( (TaskFunction_t ) startTask,
(char * ) "startTask",
(configSTACK_DEPTH_TYPE) START_TASK_STACK_SIZE,
(void * ) NULL,
(UBaseType_t ) START_TASK_PRIO,
(TaskHandle_t * ) &start_task_handle );
vTaskStartScheduler();
}
void startTask(void* pvParamenters)
{
taskENTER_CRITICAL();
xTaskCreate( (TaskFunction_t ) task1, //任务函数
(char * ) "task1", //任务名
(configSTACK_DEPTH_TYPE) TASK1_STACK_SIZE, //任务堆栈
(void * ) NULL, //任务函数参数
(UBaseType_t ) TASK1_PRIO, //优先级
(TaskHandle_t * ) &task1_handle ); //任务句柄(就是指向任务控制块头的指针)
vTaskDelete(start_task_handle);
taskEXIT_CRITICAL();
}
void task1(void* pvParamenters){
while(1){
}
}
2.xTaskCreateStatic
参数和返回值
TaskHandle_t xTaskCreateStatic
(
TaskFunction_t pxTaskCode, /* 指向任务函数的指针 */
const char * const pcName, /* 任务函数名 */
const uint32_t ulStackDepth, /* 任务堆栈大小注意字为单位 */
void * const pvParameters, /* 传递的任务函数参数 */
UBaseType_t uxPriority, /* 任务优先级 */
StackType_t * const puxStackBuffer, /* 任务堆栈,一般为数组,由用户分配 */
StaticTask_t * const pxTaskBuffer /* 任务控制块指针,由用户分配 */
);
返回:
NULL 用户没有提供相应的内存,任务创建失败
其他值 任务句柄,任务创建成功
实现例程
#define START_TASK_STACK_SIZE 128
#define START_TASK_PRIO 1
TaskHandle_t start_task_handle;
StackType_t start_task_stack[START_TASK_STACK_SIZE];
StaticTask_t start_task_buffer;
void startTask(void* pvParamenters);
#define TASK1_STACK_SIZE 128
#define TASK1_PRIO 2
TaskHandle_t task1_handle;
StackType_t task1_stack[TASK1_STACK_SIZE];
StaticTask_t task1_buffer;
void task1(void* pvParamenters);
/*空闲任务配置*/
StaticTask_t idle_task_tcb;
StackType_t idle_task_stack[configMINIMAL_STACK_SIZE];
/*软件定时器任务配置*/
StaticTask_t timer_task_tcb;
StackType_t timer_task_stack[configTIMER_TASK_STACK_DEPTH];
/*空闲任务内存分配*/
void vApplicationGetIdleTaskMemory( StaticTask_t ** ppxIdleTaskTCBBuffer,
StackType_t ** ppxIdleTaskStackBuffer,
uint32_t * pulIdleTaskStackSize )
{
*ppxIdleTaskTCBBuffer = &idle_task_tcb;
*ppxIdleTaskStackBuffer = idle_task_stack;
*pulIdleTaskStackSize = configMINIMAL_STACK_SIZE;
}
/*软件定时器内存分配*/
void vApplicationGetTimerTaskMemory( StaticTask_t ** ppxTimerTaskTCBBuffer,
StackType_t ** ppxTimerTaskStackBuffer,
uint32_t * pulTimerTaskStackSize )
{
*ppxTimerTaskTCBBuffer = &timer_task_tcb;
*ppxTimerTaskStackBuffer = timer_task_stack;
*pulTimerTaskStackSize = configTIMER_TASK_STACK_DEPTH;
}
void freertos_demo(void)
{
start_task_handle = xTaskCreateStatic( (TaskFunction_t) startTask,
(char* ) "startTask",
(uint32_t ) START_TASK_STACK_SIZE,
(void* ) NULL,
(UBaseType_t ) START_TASK_PRIO,
(StackType_t* ) start_task_stack,
(StaticTask_t* ) &start_task_buffer );
vTaskStartScheduler();
}
void startTask(void* pvParamenters)
{
taskENTER_CRITICAL();
task1_handle = xTaskCreateStatic( (TaskFunction_t) task1,
(char* ) "task1",
(uint32_t ) TASK1_STACK_SIZE,
(void* ) NULL,
(UBaseType_t ) TASK1_PRIO,
(StackType_t* ) task1_stack,
(StaticTask_t* ) &task1_buffer );
vTaskDelete(start_task_handle);
taskEXIT_CRITICAL();
}
void task1(void* pvParamenters)
{
while(1)
{
}
}
3.vTaskDelete
void vTaskDelete(TaskHandle_t xTaskToDelete);//xTaskToDelete 待删除任务的任务句柄
任务挂起与恢复
1.vTaskSuspend
void vTaskSuspend( TaskHandle_t xTaskToSuspend );
vTaskSuspend(任务句柄);
vTaskSuspend(NULL);//挂起本任务
2.vTaskResume
void vTaskResume( TaskHandle_t xTaskToResume );
vTaskResume(任务句柄);
3.xTaskResumeFromISR
BaseType_t xTaskResumeFromISR( TaskHandle_t xTaskToResume );
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
BaseType_t xYieldRequired;
switch(GPIO_Pin)
{
case GPIO_PIN_0:
delay_ms(20); /* 消抖 */
flag2_suspend++;
if(flag2_suspend%2==1) vTaskSuspend(task2_handle);
else xYieldRequired = xTaskResumeFromISR(task2_handle);
portYIELD_FROM_ISR( xYieldRequired ); //任务恢复后需要进行任务切换
break;
}
}
列表与列表项
1.vListInitialise
初始化列表
| |
2.vListInitialiseItem
初始化列表项
| |
3.vListInsertEnd
列表末尾插入列表项
| |
4.vListInsert
列表插入列表项
| |
5.uxListRemove
列表移除列表项
| |
插入删除实验
| |
任务相关API

1.uxTaskPriorityGet
获取任务优先级
打开宏INCLUDE_uxTaskPriorityGet
//xTask要查找的任务句柄, NULL 代表任务自身
UBaseType_t uxTaskPriorityGet( const TaskHandle_t xTask )
//返回无符号整数,为任务优先级
2.vTaskPrioritySet
改变任务优先级
宏 INCLUDE_vTaskPrioritySet 为 1
//xTask任务句柄 uxNewPriority优先级
void vTaskPrioritySet( TaskHandle_t xTask , UBaseType_t uxNewPriority )
3.uxTaskGetNumberOfTasks
此函数用于获取系统中任务的任务数量
UBaseType_t uxTaskGetNumberOfTasks( void )
4.uxTaskGetSystemState
获取系统中所有任务的任务状态信息
消息队列API
例子
| |