打印
[uCOS/RTOS]

freertos——创建任务(一)

[复制链接]
946|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 我于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流水线工作要更加便捷。
***学而不思则罔,思而不学则殆***

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

9

主题

9

帖子

1

粉丝