任务的创建与删除

Q: 什么是任务?

A: 任务可以理解为进程/线程,创建一个任务,就会在内存开辟一个空间。

比如: 玩游戏,打篮球,开车,都可以视为任务。

Windows 系统中的 MarkText 、谷歌浏览器、记事本,都是任务。

任务通常都含有 while(1) 死循环。

任务创建与删除相关函数

  • xTaskCreate()动态方式创建任务
  • xTaskCreateStatic()静态方式创建任务
  • vTaskDelete()删除任务

任务动态创建与静态创建的区别:

动态 创建任务的 堆栈 由系统分配 ,而静态 创建任务的 堆栈用户自己传递通常情况下使用动态方式创建任务

xTaskCreate 函数原型

  1. pvTaskCode:指向任务函数的指针,任务必须实现为永不返回(即连续循环);

  2. pcName:任务的名字,主要是用来调试,默认情况下最大长度是16;

  3. pvParameters:指定的任务栈的大小;

  4. uxPriority:任务优先级,数值越大,优先级越大 ;(和中断优先级的概念相反)

  5. pxCreatedTask:用于返回已创建任务的句柄可以被引用。

官方案例:

vTaskDelete 函数原型

只需将待删除的任务句柄传入该函数,即可将该任务删除。

当传入的参数为NULL,则代表删除任务自身(当前正在运行的任务)。

实操演示

C:\mjm_CubeMX_proj 路径下,复制一份Cube的母版并重命名为 :mjm_freeRTOS_credel_Task:

打开相应的Cube文件,找到左侧的Middleware --> FREERTOS,然后在下方找到"Task and Queues":

可见,系统已经默认创建了一个任务"defaultTask",点击可以编辑:

在这个弹窗里的选项,其实就对应了刚刚上面 xTaskCreate 函数传入参数:

此处,如果想要动态的创建一个任务,并保持一般的优先级的话,就只需要修改"Task Name "和"Entry Function":

以同样的方式,再创建一个任务:(注意,此时的默认优先级是IDLE,即最低,所以要把他改成normal):

创建完成两个任务:

在GPIO中,设置PB8和PB9并拉高:

然后生成代码,打开Keil:

打开左侧的freertos.c:

可以找到刚刚定义的入口函数和任务函数:

但是注意到,创建任务的函数却不是xTaskCreate 函数:

但是实际上,如果跳转这个所谓的osThreadCreate函数就会发现,这是Cube自动封装的一个函数,里面本质上还是在调用xTaskCreate 函数:

可见,就是两个if,区分了是否 动态创建 的情况而已。

而观察传入****xTaskCreate 函数 的参数可知,Cube还封装了一个叫"osThreadDef_t"的结构体,其中的成员正是 xTaskCreate的传入参数:

那么显而易见,任务的代码就写在任务函数中:

cpp 复制代码
void StartTaskLED_1(void const * argument)
{
  for(;;) //相当于一个while(1)
  {
	HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_8);//翻转LED1的状态
    osDelay(500); //一个Cube封装的Delay函数,毫秒为单位
  }
}


void StartTaskLED_2(void const * argument)
{
  for(;;)
  {
	HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_9);//翻转LED2的状态
    osDelay(1000);
  }
}

实现效果:

可见,LED1和LED2各自按照Delay的时间,以不同的频率闪烁。

这看似是一件很正常的事情,实际上,这解决了一个很大的痛点,在之前使用STM32裸机开发时,经常会碰到" 遇到一个while(1),程序就会卡死***"的问题,为了解决这个问题,使用了中断,但是中断也只是暂时的打断,如果中断中有while(1),程序同样也会卡死。***

但是,通过FreeRTOS创建两个任务,这就使得同时运行两个 while(1)成为了现实!

相关推荐
爱吃生蚝的于勒2 小时前
C语言内存函数
c语言·开发语言·数据结构·c++·学习·算法
失落的香蕉5 小时前
C语言串讲-2之指针和结构体
java·c语言·开发语言
追梦少年时7 小时前
STM32-Flash闪存
stm32·单片机·嵌入式硬件·51单片机
ChoSeitaku7 小时前
链表循环及差集相关算法题|判断循环双链表是否对称|两循环单链表合并成循环链表|使双向循环链表有序|单循环链表改双向循环链表|两链表的差集(C)
c语言·算法·链表
DdddJMs__1357 小时前
C语言 | Leetcode C语言题解之第557题反转字符串中的单词III
c语言·leetcode·题解
weixin_452600697 小时前
《青牛科技 GC6125:驱动芯片中的璀璨之星,点亮 IPcamera 和云台控制(替代 BU24025/ROHM)》
人工智能·科技·单片机·嵌入式硬件·新能源充电桩·智能充电枪
娃娃丢没有坏心思8 小时前
C++20 概念与约束(2)—— 初识概念与约束
c语言·c++·现代c++
ahadee9 小时前
蓝桥杯每日真题 - 第11天
c语言·vscode·算法·蓝桥杯
weixin_452600699 小时前
【青牛科技】14W 高保真音频放大电路——D2030
科技·单片机·嵌入式硬件·音视频·电动工具·智能电表
No0d1es10 小时前
2024年9月青少年软件编程(C语言/C++)等级考试试卷(九级)
c语言·数据结构·c++·算法·青少年编程·电子学会