当前位置: 首页 > news >正文

FreeRTOS任务相关API函数

任务创建和删除API函数

xTaskCreate()

创建任务。RAM

BaseType_t xTaskCreate( TaskFunction_t               pxTaskCode, //任务函数const char* const           pcName,       //任务名字const uint16_t                usStackDepth,//任务堆栈大小void * const                    pvParameters,//传递给任务函数的参数UBaseType_t                 uxPriority,        //任务优先级TaskHandle_t* const      pxCreateTask //任务句柄。任务的任务堆栈)

xTaskCreateStatic()

创建任务。RAM

BaseType_t xTaskCreateStatic( TaskFunction_t               pxTaskCode, //任务函数const char* const           pcName,       //任务名字const uint16_t                usStackDepth,//任务堆栈大小void * const                    pvParameters,//传递给任务函数的参数UBaseType_t                 uxPriority,        //任务优先级StackType_t * const       puxStackBuffer,//任务堆栈StackType_t * const       pxTaskBuffer //任务控制块)

xTaskCreateRestricted()

创建任务。MPU

BaseType_t xTaskCreateRestricted( const TaskParameters_t * const     pxTaskDefinition,//一个结构体,描述了任务函数、堆栈大小、优先级等TaskHandle_t *                               pxCreatedTask  //任务句柄)

vTaskDelete()

删除创建的任务。被删除的任务不再存在。用户分配的内存需要用户自行释放掉,不然会导致内存泄漏。

vTaskDelete( TaskHandle_t xTaskToDelete //要删除的任务的句柄)

任务创建和删除实验

实验目的

使用xTaskCreate() 和vTaskDelete()两个函数的使用

实验设计

start_task:用来创建其他两个任务
task1_task:当此任务运行5以后调用删除任务函数删除task2_task,控制LED0的闪烁
task2_task:控制LED1的闪烁,并周期性的刷新LCD指定区域的背景颜色。

main.c

#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "timer.h"
#include "timer.h"
#include "lcd.h"
#include "FreeRTOS.h"
#include "task.h"//任务优先级
#define START_TASK_PRIO		1
//任务堆栈大小	
#define START_STK_SIZE 		128  
//任务句柄
TaskHandle_t StartTask_Handler;
//任务函数
void start_task(void *pvParameters);//任务优先级
#define TASK1_TASK_PRIO		2
//任务堆栈大小	
#define TASK1_STK_SIZE 		128  
//任务句柄,任务控制块,包含任务属性的结构体
TaskHandle_t Task1Task_Handler;
//任务函数
void task1_task(void *pvParameters);//任务优先级
#define TASK2_TASK_PRIO		3
//任务堆栈大小	
#define TASK2_STK_SIZE 		128  
//任务句柄
TaskHandle_t Task2Task_Handler;
//任务函数
void task2_task(void *pvParameters);//LCD刷屏时使用的颜色
int lcd_discolor[14]={	WHITE, BLACK, BLUE,  BRED,      GRED,  GBLUE, RED,   MAGENTA,       	 GREEN, CYAN,  YELLOW,BROWN, 			BRRED, GRAY };int main(void)
{NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);//设置系统中断优先级分组4	 delay_init();	    				//延时函数初始化	 uart_init(115200);					//初始化串口LED_Init();		  					//初始化LEDLCD_Init();							//初始化LCDPOINT_COLOR = RED;LCD_ShowString(30,10,200,16,16,"ATK STM32F103/F407");	LCD_ShowString(30,30,200,16,16,"FreeRTOS Examp 6-1");LCD_ShowString(30,50,200,16,16,"Task Creat and Del");LCD_ShowString(30,70,200,16,16,"ATOM@ALIENTEK");LCD_ShowString(30,90,200,16,16,"2016/11/25");//创建开始任务xTaskCreate((TaskFunction_t )start_task,            //任务函数(const char*    )"start_task",          //任务名称(uint16_t       )START_STK_SIZE,        //任务堆栈大小(void*          )NULL,                  //传递给任务函数的参数(UBaseType_t    )START_TASK_PRIO,       //任务优先级(TaskHandle_t*  )&StartTask_Handler);   //任务句柄              vTaskStartScheduler();          //开启任务调度
}//开始任务任务函数
void start_task(void *pvParameters)
{taskENTER_CRITICAL();           //进入临界区//创建TASK1任务xTaskCreate((TaskFunction_t )task1_task,             (const char*    )"task1_task",           (uint16_t       )TASK1_STK_SIZE,        (void*          )NULL,                  (UBaseType_t    )TASK1_TASK_PRIO,        (TaskHandle_t*  )&Task1Task_Handler);   //创建TASK2任务xTaskCreate((TaskFunction_t )task2_task,     (const char*    )"task2_task",   (uint16_t       )TASK2_STK_SIZE,(void*          )NULL,(UBaseType_t    )TASK2_TASK_PRIO,(TaskHandle_t*  )&Task2Task_Handler); vTaskDelete(StartTask_Handler); //删除开始任务taskEXIT_CRITICAL();            //退出临界区
}//task1任务函数
void task1_task(void *pvParameters)
{u8 task1_num=0;POINT_COLOR = BLACK;LCD_DrawRectangle(5,110,115,314); 	//画一个矩形	LCD_DrawLine(5,130,115,130);		//画线POINT_COLOR = BLUE;LCD_ShowString(6,111,110,16,16,"Task1 Run:000");while(1){task1_num++;	//任务执1行次数加1 注意task1_num1加到255的时候会清零!!LED0=!LED0;printf("任务1已经执行:%d次\r\n",task1_num);if(task1_num==5) {if(Task2Task_Handler != NULL)		//任务2是否存在?	{vTaskDelete(Task2Task_Handler);	//任务1执行5次删除任务2Task2Task_Handler=NULL;			//任务句柄清零printf("任务1删除了任务2!\r\n");}}LCD_Fill(6,131,114,313,lcd_discolor[task1_num%14]); //填充区域LCD_ShowxNum(86,111,task1_num,3,16,0x80);	//显示任务执行次数vTaskDelay(1000);                           //延时1s,也就是1000个时钟节拍	,调用这个函数会进入阻塞,这样就可以让下一个任务开始了。}
}//task2任务函数
void task2_task(void *pvParameters)
{u8 task2_num=0;POINT_COLOR = BLACK;LCD_DrawRectangle(125,110,234,314); //画一个矩形	LCD_DrawLine(125,130,234,130);		//画线POINT_COLOR = BLUE;LCD_ShowString(126,111,110,16,16,"Task2 Run:000");while(1){task2_num++;	//任务2执行次数加1 注意task1_num2加到255的时候会清零!!LED1=!LED1;printf("任务2已经执行:%d次\r\n",task2_num);LCD_ShowxNum(206,111,task2_num,3,16,0x80);  //显示任务执行次数LCD_Fill(126,131,233,313,lcd_discolor[13-task2_num%14]); //填充区域vTaskDelay(1000);                           //延时1s,也就是1000个时钟节拍	}
}

任务挂起和恢复实验

实验目的

学习使用任务挂起和恢复相关API函数,包括vTaskSuspend(),vTaskResume()和xTaskResumeFromISR()

实验设计

start_task:用来创建其他3个任务。
key_task:按键服务任务。
task1_task:任务1。
task2_task:任务2。
KEY0:中断模式,恢复任务2运行
KEY1:输入模式,恢复任务1运行
KEY2:输入模式,挂起任务2的运行
KEY_UP:输入模式,挂起任务1的运行

main.c

#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "timer.h"
#include "lcd.h"
#include "key.h"
#include "exti.h"
#include "FreeRTOS.h"
#include "task.h"//任务优先级
#define START_TASK_PRIO		1
//任务堆栈大小	
#define START_STK_SIZE 		128  
//任务句柄
TaskHandle_t StartTask_Handler;
//任务函数
void start_task(void *pvParameters);//任务优先级
#define KEY_TASK_PRIO		2
//任务堆栈大小	
#define KEY_STK_SIZE 		128  
//任务句柄
TaskHandle_t KeyTask_Handler;
//任务函数
void key_task(void *pvParameters);//任务优先级
#define TASK1_TASK_PRIO		3
//任务堆栈大小	
#define TASK1_STK_SIZE 		128  
//任务句柄
TaskHandle_t Task1Task_Handler;
//任务函数
void task1_task(void *pvParameters);//任务优先级
#define TASK2_TASK_PRIO		4
//任务堆栈大小	
#define TASK2_STK_SIZE 		128  
//任务句柄
TaskHandle_t Task2Task_Handler;
//任务函数
void task2_task(void *pvParameters);//LCD刷屏时使用的颜色
int lcd_discolor[14]={	WHITE, BLACK, BLUE,  BRED,      GRED,  GBLUE, RED,   MAGENTA,       	 GREEN, CYAN,  YELLOW,BROWN, 			BRRED, GRAY };int main(void)
{NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);//设置系统中断优先级分组4	 delay_init();	    				//延时函数初始化	 uart_init(115200);					//初始化串口LED_Init();		  					//初始化LEDKEY_Init();							//初始化按键EXTIX_Init();						//初始化外部中断LCD_Init();							//初始化LCDPOINT_COLOR = RED;LCD_ShowString(30,10,200,16,16,"ATK STM32F103/407");	LCD_ShowString(30,30,200,16,16,"FreeRTOS Examp 6-3");LCD_ShowString(30,50,200,16,16,"Task Susp and Resum");LCD_ShowString(30,70,200,16,16,"ATOM@ALIENTEK");LCD_ShowString(30,90,200,16,16,"2016/11/25");//创建开始任务xTaskCreate((TaskFunction_t )start_task,            //任务函数(const char*    )"start_task",          //任务名称(uint16_t       )START_STK_SIZE,        //任务堆栈大小(void*          )NULL,                  //传递给任务函数的参数(UBaseType_t    )START_TASK_PRIO,       //任务优先级(TaskHandle_t*  )&StartTask_Handler);   //任务句柄              vTaskStartScheduler();          //开启任务调度
}//开始任务任务函数
void start_task(void *pvParameters)
{taskENTER_CRITICAL();           //进入临界区//创建KEY任务xTaskCreate((TaskFunction_t )key_task,             (const char*    )"key_task",           (uint16_t       )KEY_STK_SIZE,        (void*          )NULL,                  (UBaseType_t    )KEY_TASK_PRIO,        (TaskHandle_t*  )&KeyTask_Handler);  //创建TASK1任务xTaskCreate((TaskFunction_t )task1_task,             (const char*    )"task1_task",           (uint16_t       )TASK1_STK_SIZE,        (void*          )NULL,                  (UBaseType_t    )TASK1_TASK_PRIO,        (TaskHandle_t*  )&Task1Task_Handler);   //创建TASK2任务xTaskCreate((TaskFunction_t )task2_task,     (const char*    )"task2_task",   (uint16_t       )TASK2_STK_SIZE,(void*          )NULL,(UBaseType_t    )TASK2_TASK_PRIO,(TaskHandle_t*  )&Task2Task_Handler); vTaskDelete(StartTask_Handler); //删除开始任务taskEXIT_CRITICAL();            //退出临界区
}//key任务函数
void key_task(void *pvParameters)
{u8 key,statflag=0;while(1){key=KEY_Scan(0);switch(key){case WKUP_PRES:statflag=!statflag;if(statflag==1){vTaskSuspend(Task1Task_Handler);//挂起任务printf("挂起任务1的运行!\r\n");}else if(statflag==0){vTaskResume(Task1Task_Handler);	//恢复任务1printf("恢复任务1的运行!\r\n");}		break;case KEY1_PRES:vTaskSuspend(Task2Task_Handler);//挂起任务2printf("挂起任务2的运行!\r\n");break;}vTaskDelay(10);			//延时10ms }
}//task1任务函数
void task1_task(void *pvParameters)
{u8 task1_num=0;POINT_COLOR = BLACK;LCD_DrawRectangle(5,110,115,314); 	//画一个矩形	LCD_DrawLine(5,130,115,130);		//画线POINT_COLOR = BLUE;LCD_ShowString(6,111,110,16,16,"Task1 Run:000");while(1){task1_num++;	//任务执1行次数加1 注意task1_num1加到255的时候会清零!!LED0=!LED0;printf("任务1已经执行:%d次\r\n",task1_num);LCD_Fill(6,131,114,313,lcd_discolor[task1_num%14]); //填充区域LCD_ShowxNum(86,111,task1_num,3,16,0x80);	//显示任务执行次数vTaskDelay(1000);                           //延时1s,也就是1000个时钟节拍	}
}//task2任务函数
void task2_task(void *pvParameters)
{u8 task2_num=0;POINT_COLOR = BLACK;LCD_DrawRectangle(125,110,234,314); //画一个矩形	LCD_DrawLine(125,130,234,130);		//画线POINT_COLOR = BLUE;LCD_ShowString(126,111,110,16,16,"Task2 Run:000");while(1){task2_num++;	//任务2执行次数加1 注意task1_num2加到255的时候会清零!!LED1=!LED1;printf("任务2已经执行:%d次\r\n",task2_num);LCD_ShowxNum(206,111,task2_num,3,16,0x80);  //显示任务执行次数LCD_Fill(126,131,233,313,lcd_discolor[13-task2_num%14]); //填充区域vTaskDelay(1000);                           //延时1s,也就是1000个时钟节拍	}
}
http://www.lryc.cn/news/90053.html

相关文章:

  • VBA之正则表达式(42)-- 提取代码中变量名称
  • Unity Lightmapping Setting
  • Android 12.0Camera2 静音时拍照去掉快门声音
  • Win11硬盘分区
  • 访客管理系统:Lobby Track Crack
  • Lidar AI Solution环境配置
  • 子串--子字符串 0528
  • 大数据教程【01.04】--excel的使用
  • Java输入输出流
  • 1688商品ID采集一件代发详情页面数据
  • 丽江“美丽县城”建设,高精度地籍免像控案例分享
  • 我是如何精通软件工程的
  • 如何使用 Python Nornir 实现基于 CLI 的网络自动化?
  • 并发编程的三大特性之有序性
  • LeetCode:相交链表(java)
  • 利用PHP导出MySQL数据表结构和SQL文件
  • 接口测试框架分析
  • spring boot日志
  • 【Vue2.0源码学习】虚拟DOM篇-Vue中的DOM-更新子节点
  • rsync
  • javascript:void(0)
  • ThingsBoard教程(五三):规则节点解析 Kafka Node, MQTT Node
  • 基于PHP实现的网上留言管理系统的设计
  • 【9 Vue全家桶 – Vuex状态管理】
  • Oracle游标学习
  • 几种常用的正则表达式
  • 华为OD机试真题 Java 实现【快速开租建站】【2023Q1 200分】,附详细解题思路
  • 照片中对象识别模型YOLOv3在iOS项目中的浅析与使用
  • Caffeine 本地高速缓存工具类
  • 加密解密软件VMProtect教程(八)许可制度之序列号生成器