本帖最后由 我于nano 于 2022-7-25 10:38 编辑
#技术资源#
# FreeRTOS操作系统学习
# 前言
FreeRTOS操作系统的学习正式开始
# 一、了解FreeRTOS
FreeRTOS共有32个优先级(0~31)使用时0和31不使用
优先级规则:数字越大优先级越高
任务实现即创建这个任务是干什么的
vTaskDelay();延迟函数也称任务调度函数
如果需要退出调用vTaskDelet(NULL);函数
TypedeftskTCB_t; 两种方法创建任务:动态和静态
任务堆栈字节 X*4
创建任务不运行,注意任务堆栈大小
创建任务都需要指定优先级
# 二、任务创建
任务创建
本质是调用API函数
xTaskCreate(): 使用动态方法创建一个任务
xTaskCreateStatic(): 使用静态方法创建一个任务
xTaskCreateRestricted(): 创建一个使用MPU进行限制的任务,相关内存使用动态内存分配
vTaskDelete():删除一个任务
## 1.动态任务创建
经常使用
1、函数 xTaxkCreate()
<font color=#999AAA >函数原型如下:
```c
BaseType_t xTaskCreate( TaskFunction_t pxTaskCode,
const char * const pcName,
const uint16_t usStackDepth,
void * const pvParameters,
UBaseType_t uxPriority,
TaskHandle_t * const pxCreatedTask )
```
参数:
pxTaskCode: 任务函数。
pcName: 任务名字,一般用于追踪和调试,任务名字长度不能超过。
configMAX_TASK_NAME_LEN。
usStackDepth: 任务堆栈大小,注意实际申请到的堆栈是 usStackDepth 的 4 倍。其中空闲任
务的任务堆栈大小为 configMINIMAL_STACK_SIZE。
pvParameters: 传递给任务函数的参数。
uxPriotiry: 任务优先级,范围 0~ configMAX_PRIORITIES-1。
pxCreatedTask: 任务句柄,任务创建成功以后会返回此任务的任务句柄,这个句柄其实就是
任务的任务堆栈。此参数就用来保存这个任务句柄。其他 API 函数可能会使
用到这个句柄
## 2.静态任务创建
不常用(这里就不过多介绍)
## 3.动态任务创建实战
一些重要的注释都在代码里,代码如下
![在这里插入图片描述](?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5oiR5LiObmFubw==,size_20,color_FFFFFF,t_70,g_se,x_16)
![在这里插入图片描述](?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5oiR5LiObmFubw==,size_18,color_FFFFFF,t_70,g_se,x_16)
```c
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "FreeRTOS.h"
#include "task.h"
#define rtosdz 120 //¶ÑÕ»´óС
#define rtosyxj 1 //ÓÅÏȼ¶0ºÍ31²»ÄÜÓà 0~31 Ô½´óÓÅÏȼ¶Ô½¸ß //´´½¨ÈÎÎñʱ»á×Ô¶¯´´½¨¿ÕÏÐÈÎÎñ
TaskHandle_t rtosjb; //ÈÎÎñ¾ä±ú
#define rtos1dz 120
#define rtos1yxj 2
TaskHandle_t rtos1jb;
#define rtos2dz 120
#define rtos2yxj 3
TaskHandle_t rtos2jb;
void rtos(void * pvParameters);//ÈÎÎñº¯ÊýÉùÃ÷
void rtos1(void * pvParameters);
void rtos2(void * pvParameters);
int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);//ÉèÖÃϵͳÖжÏÓÅÏȼ¶·Ö×é4
delay_init(); //ÑÓʱº¯Êý³õʼ»¯
uart_init(115200); //³õʼ»¯´®¿Ú
LED_Init();
//while(1)
//{
//²»Ê¹ÓòÙ×÷ϵͳ
//}
//ʹÓòÙ×÷ϵͳ
xTaskCreate((TaskFunction_t) rtos, //ÈÎÎñº¯Êý
(const char *) "rtos",//ÈÎÎñÃû³Æ
(const uint16_t) rtosdz, //¶ÑÕ»´óС
(void * )NULL,//²ÎÊýת»¯
(UBaseType_t) rtosyxj,//ÓÅÏȼ¶
(TaskHandle_t *) &rtosjb );//ÈÎÎñ¾ä±ú£¬ÒªÓеØÖ··û
vTaskStartScheduler();//¿ªÆôÈÎÎñµ÷¶ÈÆ÷£¬·ñÔò´úÂë²»ÄÜÖ´ÐÐ
}
void rtos(void * pvParameters)
{ //´´½¨LED0
xTaskCreate((TaskFunction_t) rtos1, //ÈÎÎñº¯Êý
(const char *) "LED0",//ÈÎÎñÃû³Æ
(const uint16_t) rtos1dz, //¶ÑÕ»´óС
(void * )NULL,//²ÎÊýת»¯
(UBaseType_t) rtos1yxj,//ÓÅÏȼ¶
(TaskHandle_t *) &rtos1jb );//ÈÎÎñ¾ä±ú£¬ÒªÓеØÖ··û
//´´½¨LED1
xTaskCreate((TaskFunction_t) rtos2, //ÈÎÎñº¯Êý
(const char *) "LED1",//ÈÎÎñÃû³Æ
(const uint16_t) rtos2dz, //¶ÑÕ»´óС
(void * )NULL,//²ÎÊýת»¯
(UBaseType_t) rtos2yxj,//ÓÅÏȼ¶
(TaskHandle_t *) &rtos2jb );//ÈÎÎñ¾ä±ú£¬ÒªÓеØÖ··û
vTaskDelete(rtosjb);//ɾ³ý¿ªÊ¼ÈÎÎñ NULLɾ³ý×Ô¼º À¨ºÅÀïÌîɾ³ýÈÎÎñµÄ¾ä±ú
}
void rtos1(void * pvParameters)
{
int i=0;
while(1)
{
i++;
LED0=~LED0;
if(i==5)
{
vTaskDelete(rtos2jb);//ÈÎÎñÒ»Ö´ÐÐ5´Îɾ³ýÈÎÎñ¶þ
}
vTaskDelay(500);//ÑÓʱ500ms
}
}
void rtos2(void * pvParameters)
{
while(1)
{
LED1=0;
vTaskDelay(500);//ÑÓʱ500ms
LED1=1;
vTaskDelay(1000);//ÑÓʱ500ms
}
}
```
创建任务需要六个参数
1、任务函数(这个任务要执行什么功能在任务函数里写)
2、函数名称
3、堆栈大小
4、参数转化
5、优先级
6、任务句柄
后面再写功能时,和正常32一样去写就可以
# 总结
开始了FreeRTOS操作系统的学习,知道了一丢丢,FreeRTOS操作系统可以控制所有实时任务协调一致工作,多个任务同时运行。比普通的32流水线工作要更加便捷。
***学而不思则罔,思而不学则殆*** |