创建第一个FreeRTOS任务

简介: 创建第一个FreeRTOS任务

一.序言

其实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之间变化。

image.png

FreeRTOS实验现象



目录
相关文章
|
算法 物联网 开发工具
开放下载!《平头哥剑池CDK快速上手指南》
自定义自己平台的 SDK,平头哥芯片开放社区第三本系列电子书《平头哥剑池CDK快速上手指南》现已开放下载,立即下载阅读吧!
30192 0
开放下载!《平头哥剑池CDK快速上手指南》
蓝桥杯之单片机学习(十八)——555定时器与频率测量
蓝桥杯之单片机学习(十八)——555定时器与频率测量
1347 0
蓝桥杯之单片机学习(十八)——555定时器与频率测量
|
物联网 开发工具 芯片
剑池CDK开发工具介绍 | 《平头哥剑池CDK快速上手指南》第一章
剑池CDK是平头哥推出的一款专业面向IoT开发领域的集成开发环境,该集成开发环境围绕平头哥“1天上手,5天出原型,20天出产品”1520技术理念,为开发者提供简洁统一的图形开发界面,帮助开发者进行应用开发。该开发环境目前已支持平头哥自研指令集C-SKY架构和RISC-V架构的芯片的开发。
剑池CDK开发工具介绍  |  《平头哥剑池CDK快速上手指南》第一章
|
搜索推荐 Python
使用Python自动化生成物业通知单
本文介绍如何使用Python结合Pandas和python-docx库自动化生成物业通知单。通过读取Excel数据并填充至Word模板,实现高效准确的通知单批量制作。包括环境准备、代码解析及效果展示,适用于物业管理场景。
357 14
|
7月前
|
Go 开发者
Go语言内存共享与扩容机制 -《Go语言实战指南》
本文深入探讨了Go语言中切片的内存共享机制与自动扩容策略。切片作为动态数组的抽象,其底层结构包含指针、长度和容量。多个切片可能共享同一底层数组,修改一个切片可能影响其他切片。当切片容量不足时,`append`会触发扩容,新容量按指数增长以优化性能。为避免共享导致的副作用,可通过`copy`创建独立副本或在函数中使用只读方式处理。最后总结了最佳实践,帮助开发者高效使用切片,写出更优代码。
201 10
|
自然语言处理 算法 物联网
【技术前沿】智能反向寻车解决方案:提升停车场用户体验与运营效率
本文介绍了一种智能反向寻车解决方案,通过集成物联网(IoT)、大数据分析及用户友好的移动应用,利用蓝牙信标或RFID标签实现车辆厘米级定位。车主仅需输入车牌号或停车位编号,即可获得最佳寻车路径。该方案不仅大幅缩短寻车时间,还提升了停车场运营效率。以合肥骆岗公园为例,应用后车主平均寻车时间从10分钟缩短至2分钟内,用户满意度显著提高。
622 1
【技术前沿】智能反向寻车解决方案:提升停车场用户体验与运营效率
|
机器学习/深度学习 数据采集 分布式计算
构建一个高效的机器学习工作流:技术实践与优化策略
【8月更文挑战第12天】构建一个高效的机器学习工作流是一个复杂而持续的过程,需要综合考虑数据、模型、算法、平台等多个方面。通过遵循上述步骤和优化策略,可以显著提高机器学习项目的开发效率和质量,为业务带来更大的价值。未来,随着技术的不断进步和应用场景的不断拓展,我们有理由相信机器学习工作流将变得更加高效、智能和灵活。
如何使用Beyond Compare软件进行代码比对
如何使用Beyond Compare软件进行代码比对
565 2
|
Docker 容器
本地镜像推送到Harbor
本地镜像推送到Harbor
438 0
|
SQL 关系型数据库 数据库
Flink CDC数据同步问题之处理更新业务失败如何解决
Flink CDC数据同步是指利用Flink CDC实现不同数据源之间的实时数据同步任务;本合集旨在提供Flink CDC数据同步的操作指南、性能优化建议和常见问题处理,助力用户高效实施数据同步。