2、结合STM32CubeMX学习FreeRTOS实时操作系统——任务

目录

前言

1、FreeRTOS中的任务是什么

2、创建任务

3、运行任务

[4、如果这篇文章能帮助到你,请点个赞鼓励一下吧ξ( ✿>◡❛)~](#4、如果这篇文章能帮助到你,请点个赞鼓励一下吧ξ( ✿>◡❛)~)


前言

上一章介绍了如何使用STM32CubeMX在项目中添加FreeRTOS操作系统,本文开始学习如何结合STM32CubeMX软件使用FreeRTOS中最重要的基础核心------任务。

1、FreeRTOS中的任务是什么

FreeRTOS中的任务是一个具有独立内存(堆栈)空间的无线循环的函数,需要开发者为其严格分配优先级,具有运行------阻塞------就绪------挂起四种状态。

运行态表示任务正在运行;就绪态表示任务可以运行;阻塞态表示任务正在等待某一进程,CPU可以先执行其他的任务;挂起态表示任务取消执行,除非调用解除挂起xTaskResumeAll()等函数,才能让这个任务变为就绪状态,参与到任务调度中。

如果系统中存在不同优先级的任务 ,那么在高优先级任务运行完后,一定在函数末尾要调用阻塞指令,例如osDelay(20)等函数,让任务由运行态进入阻塞态,否则高优先级任务在执行完后,会直接从运行态转换为就绪态,基于抢占调度策略不间断执行,同优先级的任务基于时间片轮转调度算法会正常执行,但优先级低于它的任务会没有权限执行。

通过STM32CubeMX软件创建FreeRTOS中的任务后,直接在app_freertos.c文件中找到对应的任务函数,在函数内编程即可,系统在创建任务时会自动把任务函数入口注册在链表中,然后使用osKernelStart()函数启动任务调度算法,实现任务的自动调用切换。这其中,开发者只需要手动编写任务函数内的执行代码,实现对应的功能。

2、创建任务

以下是与任务创建有关的选项,不理解参数意义的可以看这篇博客------《结合 STM32CubeMX 使用 FreeRTOS 实时操作系统》,里面介绍了每一个参数栏的功能。

在配置完FreeRTOS系统的参数后,需要在STM32CubeMX中点击Add添加任务实例:

其中需要重点关注任务优先级,FreeRTOS中一定要为任务分配好优先级,正常情况下,任务优先级从正常(中级)开始分配,一开始就使用高优先级来配置任务的话,不利于后续新增功能的开发。

3、运行任务

配置完成后,使用STM32CubeMX来生成项目代码,在Core目录下,找到对应的app_freertos.c文件,开发者需要在这个文件中的任务函数中,实现具体的功能。

需要开发者修改的代码在app_freertos.c文件中,这个文件中定义了任务的接口,只需要在任务函数内实现具体的功能,剩下的交给FreeRTOS系统调度算法。本例程中的任务接口如下所示:

cpp 复制代码
/**

  * @brief  Function implementing the defaultTask thread.

  * @param  argument: Not used

  * @retval None

  */

void StartDefaultTask(void const * argument)

{

  /* USER CODE BEGIN StartDefaultTask */

  /* Infinite loop */

  for(;;)         //无限循环,通过任务调度算法实现任务之间的切换

  {

       static uint8_t u8SwitchLED2 = 0;

       if(u8SwitchLED2)

           LED0_ON;

       else

           LED0_OFF;

       u8SwitchLED2 = !u8SwitchLED2;


/*延时阻塞,程序在执行到这里时,系统会将该任务由运行态切换到阻塞态,从而可以执行低优先级任务

没有延时的话,该任务阻塞态不会出现,低于该任务优先级的任务,不会被执行*/

       osDelay(100);

  }

  /* USER CODE END StartDefaultTask */

}

在main.c文件中,可以看到在硬件外设初始化完毕之后,程序调用了MX_FREERTOS_Init()函数,这是FreeRTOS的初始化函数,在函数里创建并注册开发者在CubeMX中配置的任务、定时器、互斥量、队列等内容;还有一个osKernelStart()函数,这是FreeRTOS任务调度算法启动函数,调用之后,系统开始根据时间片轮转策略和抢占优先级策略自动调用任务执行。

对应的FreeRTOS源码在系统中的FreeRTOS目录下,感兴趣的同学可以学习一下,建议结合硬件调试,看一下程序的执行逻辑和任务调度算法的实现,FreeRTOS系统核心的源码是用汇编语言实现的,所以运行效率很高,保证了系统的实时性。

LED灯闪烁运行效果图:

4、如果这篇文章能帮助到你,请点个赞鼓励一下吧ξ( ✿>◡❛)~

相关推荐
GilgameshJSS11 分钟前
STM32H743-ARM例程11-PWM
c语言·arm开发·stm32·嵌入式硬件·学习
知识分享小能手6 小时前
React学习教程,从入门到精通,React 单元测试:语法知识点及使用方法详解(30)
前端·javascript·vue.js·学习·react.js·单元测试·前端框架
rzjslSe9 小时前
【JavaGuide学习笔记】理解并发(Concurrency)与并行(Parallelism)的区别
java·笔记·学习
Cherry Zack10 小时前
了解Django模型,从基础到实战
python·学习·django
茯苓gao10 小时前
CAN总线学习(四)错误处理 STM32CAN外设一
网络·笔记·stm32·单片机·学习
RaLi和夕10 小时前
嵌入式学习笔记2.GPIO的工作模式
stm32·单片机·嵌入式硬件
学不动CV了10 小时前
FreeRTOS---任务级和中断级临界区管理使用的理解与源码分析
c语言·arm开发·stm32·单片机·嵌入式硬件·51单片机
虚行10 小时前
C#上位机 通过ProfitNet连接西门子PLC教程--系统模拟环境搭建
学习·c#·plc
jun~11 小时前
SQLMap数据库枚举靶机(打靶记录)
linux·数据库·笔记·学习·安全·web安全
月盈缺11 小时前
学习嵌入式的第四十二天——ARM——UART
arm开发·学习