第三章 FreeRTOS任务基础知识
1、任务特性
- 1、简单
- 2、没有使用限制
- 3、支持抢占
- 4、支持优先级设置
- 5、每个任务都有堆栈导致RAM(运行内存)的增大
- 6、如果使用抢占的话必须仔细的考虑重入的问题
2、任务状态
1、运行态:在当前状态下运行的任务
2、就绪态:处于准备好的任务,等待运行态任务结束运行
3、阻塞态:等待某个触发的时间时,称之为阻塞态
4、挂起态:暂停运行某个任务
3、任务优先级
任务优先级决定了任务的执行优先级级别,在FreeRTOS中,任务优先级的可选范围为:
0~configMAX_PRIORITIES-1
注:数字越大,优先级越高,0优先级我们不能使用,留给系统的滴答定时器内核使用。
4、任务实现
/*任务实现的基本框架 */
void vATaskFunction(void *pvParameters)
{
while(1)
{
task_func();//注:这个代表的是自己编写的一些任务函数,不是仅仅一个函数
vTaskDelay();//任务delay函数,当执行完上述程序以后,此时可以进行任务切换,并且任务是内部自动切换任务,无需自己切换
}
vTaskDelete(NULL);
}
// 注: vTaskDelay();可以引起(触发)任务调度函数的切换。
5、任务控制块
描述任务属性的数据结构称之为任务控制块,为TCB_t.
typedef struct tskTaskControlBlock
{
volatile StackType_t *pxTopOfStack;
#if(portUSING_MPU_WRAPPERS==1)
xMPU_STTINGS xMPUSettings;
#endif
ListItem_t xStateListItem ;
...
...
} taskTCB ;
typedef taskTCB TCB_t;
5、任务堆栈
堆栈:保存一个任务的内存或者寄存器的但前的情况,如果在一个任务中定义的有大量寄存器的值和定义的变量的值,那么堆栈的空间需要更大一些,否则会出现错误或者死机的情况。
举例说明:
在一个任务中要定义以下基本框架
//任务优先级
#define LED1_TASK_PRIO 3
//任务堆栈大小
#define LED1_STK_SIZE 50 //注:1个size是4个字节,所以这里是4*50=200字节
//任务句柄
TaskHandle_t LED1Task_Handler;
//任务函数
void led1_task(void *pvParameters) ;