创建第一个FreeRTOS任务

news/2024/11/16 9:33:41/

创建第一个FreeRTOS任务

  • 一.序言
  • 二.创建任务
    • 2.1 句柄
    • 2.2 创建任务函数
  • 三.代码实例
  • 四.实验现象

一.序言

其实FreeRTOS也没大家现象的那么困难,跟着博主的思路其实也挺容易上手的。前面几篇博客已经教大家搭建好FreeRTOS。这篇文章就是教大家实战,创建你们的第一个任务。所谓说实践是检验理论的唯一标志。那我们开始吧。

二.创建任务

2.1 句柄

什么是句柄呢,句柄有什么作用呢?我的理解是这样,创建任务之前,我们需要定义一个句柄,然后我们创建任务的时候将任务和句柄绑定。后序我们就可以通过操作这个句柄来操作任务(如删除任务,我们只需要删除句柄)。句柄定义如下:

TaskHandle_t Demo1_Task_Handle=NULL;

2.2 创建任务函数

任务创建函数如下,这里有5个参数,分别是任务函数,任务名,任务栈大小,任务优先级,任务句柄。

xTaskCreate((TaskFunction_t)Demo1_Task, //任务函数(const char *)"Demo1TaskCreate", //任务名(uint16_t)128,(void *)NULL,  //任务栈大小(UBaseType_t)1,                //任务优先级(TaskHandle_t *)&Demo2_Task_Handle); //任务句柄

三.代码实例

这里有一个简单的代码实例,通过创建二个任务。一个任务是flag在1和0之间来回切换,一个任务是flag2在0和1之间来回切换。这边也是解释一下vTaskDelay()函数 相较于裸机的延时。FreeRTOS中的vTaskDelay()在延时过程中,会进行任务切换,延时结束后,再会切换到当前任务。所以尽管Demo1_Task任务优先级较低,但是仍然能执行。
注意:由于我这里没有重定向printf函数这里会有很多关于printf的警告,但是不影响实验结果。

#include "stm32f10x.h" 
#include "FreeRTOS.h"
#include "task.h"static TaskHandle_t Demo2_Task_Handle=NULL;
static TaskHandle_t Demo1_Task_Handle=NULL;static void Demo2_Task(void * pvParameters);
static void Demo1_Task(void * pvParameters);//static void BSP_init(void );BaseType_t flag=1;
BaseType_t flag2=1;int main(void)
{BaseType_t xReturn =pdPASS; //创建任务返回值xReturn=xTaskCreate((TaskFunction_t)Demo2_Task, //任务函数(const char *)"Demo2TaskCreate", //任务名(uint16_t)128,(void *)NULL,  //任务栈大小(UBaseType_t)1,                //任务优先级(TaskHandle_t *)&Demo1_Task_Handle); //任务控制块指针xReturn=xTaskCreate((TaskFunction_t)Demo1_Task, //任务函数(const char *)"Demo1TaskCreate", //任务名(uint16_t)128,(void *)NULL,  //任务栈大小(UBaseType_t)1,                //任务优先级(TaskHandle_t *)&Demo2_Task_Handle); //任务控制块指针if(xReturn==pdPASS) //如果创建成功{     vTaskStartScheduler(); //启动任务,开启调度}else return -1;while(1);}static void Demo2_Task(void *parameter)
{while(1){flag2=0;vTaskDelay(500);flag2=1;vTaskDelay(500); }}static void Demo1_Task(void * parameter)
{while(1){flag=1;vTaskDelay(500);   flag=0;   vTaskDelay(500);}}

四.实验现象

我们如何观察实验现象呢,其实有二种方法,一种是通过printf串口打印(需要自己添加串口初始化代码),一种是通过软件仿真观察flag和flag2变量的值。这里我选择的是软件仿真(可以看我这篇文章:一文教你学会keil软件仿真)。实验现象是flag和flag2同时在进行0到1之间变化。

FreeRTOS实验现象


http://www.ppmy.cn/news/598693.html

相关文章

建立无需build的vue单页面应用SPA框架

vue、react这种前端渲染的框架,比较适合做SPA(Single Page Application)。如果用ejs做SPA,js代码控制好全局变量冲突不算严重,但dom元素用jquery操作会遇到很多的名称上的冲突(tag、id、name)。…

MySQL 逻辑备份mysqldump

逻辑备份mysqldump MySQL 自带的逻辑备份工具。可以保证数据的一致性和服务的可用性原理是通过协议连接到 MySQL 数据库,将需要备份的数据查询出来,将查询出的数据转换成对应的 insert 语句,当我们需要还原这些数据时,只要执行这些…

H3C官网-inode客户端下载

打开 新华三官网 ,点击登录,用户名:yx800,密码:01230123 MacOS 安装 iNode Client 的事故与故事,提示【“libCoreUtils.dylib”将对您的电脑造成伤害】 - 知乎 怎么用mac通过inode上网? - 知…

【解决】萤石云接入视频报错视频编码类型非H264

说在前面 项目视频监控设备接入了萤石云,部分视频无法正常加载,报错页面如下: 原因分析 视频监控视频编码目前有H265和H264两种,萤石云仅支持H264的编码格式,所以对于接入的视频流才会出现这种错误。 解决方案 方案…

视频编解码 — 码控算法

目录 码控算法 码控算法的类型 具体操作过程如下 复杂度求解 帧组级 帧级 GOM级 码控算法 用算法来控制编码器输出码流的大小,码控就是为一帧图像选择一个合适的QP值的过程。 一帧图像的画面确定了之后,画面的复杂度和QP值几乎决定了编码之后的…

视频编解码器的现状 (2022)

在这个 2022 年的编解码器进展中,编解码器有很多:H.264、VP9、HEVC、AV1、多功能视频编码(VVC)、低复杂度增强型视频编码(LCEVC)和基本视频编码(EVC)。但篇幅有限,所以本…

新一代视频编解码标准正式公布!

作者 | 马超 责编 | 王晓曼 封图 | CSDN付费下载自东方IC 出品 | CSDN(ID:CSDNnews) 近日,新一代国际视频编解码标准(H.266/VVC)正式出炉,其中VVC是JVET(Joint Video Exploration Te…

视频编解码——编码流程介绍

为什么需要编码? 原始视频数据很庞大,比如一个150分钟,30FPS,分辨率为720✖480的彩色电影需要占用280GB。无论是物理存储还是网络传输,这都是难以负担的。所以需要编码进行压缩。 编码方式 一般有两种编码方式&…