创建第一个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实验现象



目录
相关文章
|
2月前
|
存储 API
|
2月前
|
Java C# 开发工具
第一个C#程序
第一个C#程序
|
7月前
|
监控 安全 API
6.9 Windows驱动开发:内核枚举进线程ObCall回调
在笔者上一篇文章`《内核枚举Registry注册表回调》`中我们通过特征码定位实现了对注册表回调的枚举,本篇文章`LyShark`将教大家如何枚举系统中的`ProcessObCall`进程回调以及`ThreadObCall`线程回调,之所以放在一起来讲解是因为这两中回调在枚举是都需要使用通用结构体`_OB_CALLBACK`以及`_OBJECT_TYPE`所以放在一起来讲解最好不过。
72 1
6.9 Windows驱动开发:内核枚举进线程ObCall回调
|
9月前
|
API 调度
FreeRTOS学习笔记—任务创建和删除
本文学习了如何创建和删除任务。最后,分析解决了遇到的问题。
67 0
|
测试技术 编译器 API
13-FreeRTOS任务创建与删除
13-FreeRTOS任务创建与删除
|
编解码 数据可视化 编译器
11-FreeRTOS配置函数 FreeRTOSConfig.h(上)
11-FreeRTOS配置函数 FreeRTOSConfig.h
|
存储 缓存 安全
11-FreeRTOS配置函数 FreeRTOSConfig.h(下)
11-FreeRTOS配置函数 FreeRTOSConfig.h
|
消息中间件 存储
STM32FreeRTOS队列的简介及操作
STM32FreeRTOS队列的简介及操作
93 0
|
小程序 开发工具 开发者
【小程序】第一个小程序——创建小程序项目
【小程序】第一个小程序——创建小程序项目
120 0
【小程序】第一个小程序——创建小程序项目