FreeRTOS笔记①

1.FreeRTOS的任务状态
(1)运行态:处理器当前正在执行的任务
(2)就绪态:依旧准备就绪,尚未运行,有一个同优先级或者高优先级的任务运行
(3)阻塞态:任务等一个事件尚未发生,进入阻塞态,等发生,延时也进入阻塞态
(4)挂起态:暂停运行,不能被任务调度器调用进入运行态,需要调用函数解挂
2.任务优先级:
(1)FreeRTOS的优先级数字越低,任务优先级越低。空闲任务优先级为0
(2)当宏configUSE_TIME_SLIGING定义为1时,多个任务可以共用一个优先级,默认为1,此时处于就绪态相同优先级任务会使用时间片轮转调度器获取运行时间。
3.FreeRTOS的任务堆栈
(1)FreeRTOS在创建任务时,每一个任务都有一个自己的专属的任务堆栈,用来保存现场和恢复现场

4.RTOS动态创建任务

/开始任务创建****/
#define START_STK_SIZE 120 //定义堆栈大小
#define START_TASK_PRIO 1 //设置任务优先级
TaskHandle_t StartTask_Handler; //任务句柄创建
void start_task( void * pvParameters ); //任务函数声明

/主函数结构****//
int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);//设置系统中断优先级分组
delay_init(); //延迟函数初始化
uart_init(115200); //串口初始化
LED_Init(); //初始化LED
//需要建立一个开始任务,将所有运行的任务导入
xTaskCreate((TaskFunction_t ) start_task, //开始任务函数
(char * ) “start_task”, //任务名字
(uint16_t ) START_STK_SIZE, //堆栈大小
(void * ) NULL, //函数参数,无参数用NULL
(UBaseType_t ) START_TASK_PRIO, //任务优先级
(TaskHandle_t * ) &StartTask_Handler ); //任务句柄
vTaskStartScheduler(); //开启任务调度器
}
/开始任务函数/
void start_task( void * pvParameters )
{
//创建任务1
xTaskCreate((TaskFunction_t ) task1_task, //任务1的函数名,
(char * ) “task1_task”, //任务名字
(uint16_t ) TASK1_STK_SIZE, //定义堆栈大小
(void * ) NULL, //任务函数的参数
(UBaseType_t ) TASK1_TASK_PRIO, //定义任务优先级
(TaskHandle_t * ) &Task1Task_Handler ); //任务1句柄

	//定义任务2	
xTaskCreate((TaskFunction_t		) task2_task,				//任务2函数名
			(char * 			) "task2_task",				//任务2句柄
			(uint16_t			) TASK2_STK_SIZE,			//任务2堆栈大小
			(void * 			) NULL,					//任务参数
			(UBaseType_t 	) TASK2_TASK_PRIO,		//任务2优先级
			(TaskHandle_t * 	) &Task2Task_Handler );		//任务2句柄

vTaskDelete(StartTask_Handler);		//因为任务1和任务2只需要创建一次,所以创建之后删除开始任务。

}

/任务1变量定义和函数声明*****/
#define TASK1_STK_SIZE 50 //任务堆栈大小
#define TASK1_TASK_PRIO 2 //任务优先级
TaskHandle_t Task1Task_Handler;
void task1_task( void * pvParameters );//任务1函数声明

/任务2变量定义和函数声明*****/
#define TASK2_STK_SIZE 50 //任务堆栈大小
#define TASK2_TASK_PRIO 3 //任务优先级
TaskHandle_t Task2Task_Handler;
void task2_task( void * pvParameters );//任务2函数声明
/任务1函数****/
void task1_task( void * pvParameters )
{
while(1)
{
LED0=~LED0;
vTaskDelay(1000);
}
}
/任务2函数****/
void task2_task( void * pvParameters )
{
while(1)
{
LED1=~LED1;
vTaskDelay(1000);
}
}
5.FreeRTOS任务挂起与恢复
(1)挂起vTaskSuspend()、恢复vTaskResume()、中断服务函数中恢复vTaskResumeFrmlISR()
(2)挂起与删除的区别
①挂起不会删除任务堆栈,可以恢复现场,继续运行
②删除任务会删除堆栈,无法恢复现场,继续运行
void task3_task( void * pvParameters )
{
u8 key_flag;
while(1)
{
key_flag=KEY_Scan(0);
switch(key_flag)
{
case KEY1_PRES: //如果按键1按下,则挂起任务1
vTaskSuspend(Task1Task_Handler);
printf(“Task1 SUSPEND”);
case WKUP_PRES://如果按键2按下,则恢复任务1
vTaskResume(Task1Task_Handler);
printf(“Task1 RESUME”);
}
vTaskDelay(10);
}
}
③如果要在中断中恢复任务,需要调用xTaskRrsumeFromISR();这个函数。这个函数是有返回值的,
·pdTRUE说明当前任务的优先级比运行态任务的优先级高
▲如果优先级比运行态优先级高,需要进行任务调度
·设置一个变量记录返回值YieldRequired=xTaskResumeFromISR();
·if(YieldRequired==pdTRUE)
{
PortYIELD_FROM_ISR(YieldRequired); //进行任务调度
}
·pdFALSE说明当前任务的优先级比运行态任务的优先级低

你可能感兴趣的:(嵌入式开发学习笔记,堆栈,操作系统,嵌入式)