第三章 FreeRTOS任务基础知识

第三章 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) ;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章