【FreeRTOS】使用CubeMX快速移植FreeRTOS工程到蓝桥杯开发板(STM32G431RBT6)

使用CubeMX快速创建FreeRTOS工程到蓝桥杯开发板(STM32G431RBT6)

  • CubeMX配置
    • CubeMX基础工程的配置
    • ☆FreeRTOS相关配置
    • FreeRTOS配置选项卡的解释
  • 软件工程架构与程序设计
  • 小综合:任务的创建删除、挂起与恢复设计
    • cubexMX配置创建任务
    • 软件程序设计

  随着CubeMX软件的不断推广使用,STM32HAL库的使用也不断增加,并且某些系列开发板只支持HAL开发。最近参加完蓝桥杯后,继续深入学习FreeRTOS操作系统,但在移植RTOS的时候,大多数教程都是基于正点原子F系列开发板根据固件库或者HAL例程进行移植,移植过程相对比较复杂,因此特此整理一篇直接通过CubeMX生成的FreeRTOS工程教程到蓝桥杯的STM32G431RB系列的开发板中,方便后续通过蓝桥杯开发板深入学习RTOS操作系统。

  • 对于手动移植过程复杂且繁琐,对新手不友好。如有需要手动移植,可参照以下文章:
    1. FreeRTOS移植到STM32
    2. FreeRTOS移植stm32详细步骤介绍

CubeMX配置

对于CubeMX创建基础工程这里仅进行简单概述,详细步骤可参考:

1. STM32 CubeMX新建工程+GPIO的研究

2. Cubemx新建工程引脚配置与点亮LED

CubeMX基础工程的配置

使能外部高速时钟:

配置LED与按键引脚

配置开启调试串口

工程相关配置


☆FreeRTOS相关配置

更改/配置时钟源:

  1. 在 SYS 选项里,将 Debug 设为 Serial Wire,并且将 Timebase Source 设为TIM6(其它定时器也行)。
  2. 裸机的时钟源默认是 SysTick,但是开启FreeRTOS后,FreeRTOS会占用SysTick(用来生成1ms 定时,用于任务调度),所以需要需要为其他总线提供另外的时钟源。

使能FREERTOS选项
将 Interface 配置为CMSIS_V1,V2的内核版本更高,功能更多,在大多数情况下V1版本的内核完全够用

创建第二个任务

至此,FreeRTOS多任务工程已配置完毕,可直接生成工程代码!!!


FreeRTOS配置选项卡的解释

FreeRTOS 各配置选项卡的解释

  • Events:事件相关的创建
  • Task and Queues: 任务与队列的创建
  • Timers and Semaphores: 定时器和信号量的创建
  • Mutexes: 互斥量的创建
  • FreeRTOS Heap Usage: 用于查看堆使用情况
  • config parameters: 内核参数设置,用户根据自己的实际应用来裁剪定制FreeRTOS 内核
  • Include parameters: FreeRTOS 部分函数的使能
  • User Constants: 相关宏的定义,可以自建一些常量在工程中使用
  • Advanced settings:高级设置

内核配置、函数使能的一些翻译

查看用户堆的使用情况

FreeRTOS部分函数使能配置

内核参数设置,用户可根据自己的实际应用来裁剪定制FreeRTOS 内核

内核参数的理解内容非常多,可以参考以下文章:FreeRTOS内核配置说明

软件工程架构与程序设计

软件工程架构

主函数中初始化RTOS并且开启内核任务调度:

在app_freertos.c中创建任务,并实现对任务的具体实现

程序设计
通过CubeMX生成的FreeRTOS工程创建了2个任务,通过程序设计实现对两个LED灯分别以不同的时间周期进行闪烁。

LED翻转功能函数

void led_toggle(uint8_t led)
{HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_8<<(led-1));HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);
}

任务的具体实现

//任务1控制LED1小灯每秒闪烁一次
void StartDefaultTask(void const * argument)
{/* USER CODE BEGIN StartDefaultTask *//* Infinite loop */for(;;){led_toggle(1);osDelay(250);}/* USER CODE END StartDefaultTask */
}//任务2控制LED2小灯每500ms闪烁一次
void StartTask02(void const * argument)
{/* USER CODE BEGIN StartTask02 *//* Infinite loop */for(;;){led_toggle(2);osDelay(500);}/* USER CODE END StartTask02 */
}

小综合:任务的创建删除、挂起与恢复设计

通过对FreeRTOS的理论基础知识及其系统的移植,通过设计按键控制任务的创建与删除,挂起与恢复巩固系统的移植与相关理论知识的。

  • 在此之前需掌握RTOS任务的调度、任务的状态以及任务的创建与删除相关理论基础知识:RTOS理论基础知识快速入门
  • 同时需要掌握通过CubeMX移植FreeRTOS工程,因为该实验建立在上述移植的工程上进行修改

设计要求描述:
创建 4 个任务:taskLED1,taskLED2,taskKEY1,taskKEY2,任务要求如下:
taskLED1:间隔 500ms 闪烁 LED1;
taskLED2:间隔 1000ms 闪烁 LED2;
taskKEY1:如果 taskLED1 存在,则按下 KEY1 后删除 taskLED1 ,否则创建 taskLED1 ;
taskKEY2:如果 taskLED2 正常运行,则按下 KEY2 后挂起 taskLED2 ,否则恢复 taskLED2

cubexMX配置创建任务

  通过设计要求分析,在tasks选项中创建四个任务,分别为taskLED01,taskLED02,taskKEY01,以及taskKEY02,将任务优先级均设置为相同的Normal优先级,代码创建定义设置为若定义,方便后续用户在user.c内对函数进行重写,其中创建方式如下图所示。
注意:由于创建的任务过多,会使得堆空间不够,因此这里将Interface设置为CMSIS_V2版本。

软件程序设计

任务一和任务二分别控制LED小灯以不同的时间周期进行闪烁

void taskLED01(void * argument)
{uint task1_num = 0;while(1){led_toggle(1);osDelay(250);task1_num++;printf("task1 num:%d\r\n",task1_num);}
}
void taskLED02(void * argument)
{uint task2_num = 0;while(1){led_toggle(2);osDelay(500);task2_num++;printf("task2 num:%d\r\n",task2_num);}
}

按键一任务控制LED1任务的创建与删除

void taskKEY01(void * argument)
{while(1){//按下if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0) == 0){//消抖osDelay(10);if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0) == 0){//等待抬起while(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0) == 0);printf("key1 按下\r\n");if(taskLED1Handle != NULL){//删除任务1osThreadTerminate(taskLED1Handle);taskLED1Handle = NULL;led_show(1,0);printf("taskLED01 删除成功\r\n");}else{//创建任务taskLED1Handle = osThreadNew(taskLED01, NULL, &taskLED1_attributes);if(taskLED1Handle != NULL)printf("taskLED01 创建成功\r\n");elseprintf("taskLED01 创建失败\r\n");}}}osDelay(10);}
}

按键二任务控制LED2任务的挂起与恢复

void taskKEY02(void * argument)
{static uchar key2_flag = 0;while(1){//按下if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1) == 0){//消抖osDelay(10);if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1) == 0){//等待抬起while(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1) == 0);printf("key2 按下\r\n");//挂起if(key2_flag == 0){osThreadSuspend(taskLED2Handle);printf("任务2已挂起\r\n");}//恢复else{osThreadResume(taskLED2Handle);printf("任务2已恢复\r\n");}key2_flag = !key2_flag;}}osDelay(10);}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/824270.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python怎么连接oracle

一&#xff1a;弄清版本&#xff0c;最重要&#xff01;&#xff01;&#xff01; 首先安装配置时&#xff0c;必须把握一个点&#xff0c;就是版本一致&#xff01;包括&#xff1a;系统版本&#xff0c;python版本&#xff0c;oracle客户端的版本&#xff0c;cx_Oracle的版本…

基于go+vue的多人在线聊天的im系统

基于govue的多人在线聊天的im系统 文章目录 基于govue的多人在线聊天的im系统一、前端部分二、后端部分1、中间件middleware设计jwt和cors2、配置文件设计3、Mysql和Redis连接4、路由设计5、核心功能设计 一、前端部分 打算优化一下界面&#xff0c;正在开发中。。。 二、后端…

OpenHarmony实战开发-如何使用Navigation实现多设备适配。

介绍 在应用开发时&#xff0c;一个应用需要适配多终端的设备&#xff0c;使用Navigation的mode属性来实现一套代码&#xff0c;多终端适配。 效果图预览 使用说明 将程序运行在折叠屏手机或者平板上观看适配效果。 实现思路 本例涉及的关键特性和实现方案如下&#xff1a…

【WebLogic】Oracle发布2024年第二季度中间件安全公告

Oracle于美国时间2024年4月16日发布了 WebLogic 中间件2024年第二季度的安全公告&#xff0c;涉及漏洞共计 10 个&#xff0c;涉及示例程序的高危漏洞 1 个&#xff0c;中危漏洞中有3个涉及到核心组件&#xff08;Core&#xff09;。 此外&#xff0c;Oracle JDK1.8 的小版本号…

整理Meta GDC 2024 上关于XR、空间计算相关的分享

Meta 在 GDC 2024 上的全面覆盖,涵盖了如何利用 Meta Quest 构建全息游戏以及如何利用平台为开发者创造成功的会议。 视频分为 11 个部分,每个部分都是一场独特的会议,涵盖了从构建下一代 XR 体验到如何利用 Meta Quest 建立业务等话题 比如: 1、利用 Meta Quest 构建全息…

二分法在有序数组中的应用(JavaC)

文章目录 在有序数组中确定num是否存在Java实现C语言实现 在有序数组中找>num的最左位置Java实现C语言实现 在有序数组中找<num的最右位置Java实现C语言实现 在有序数组中确定num是否存在 Java实现 public static boolean exist(int[] arr, int num) {if (arr null ||…

IAttachService

目录 1、 IAttachService 1.1、 * 分页查询附件 1.2、 * 保存附件 2、 ILogService 2.1、 * 保存操作日志 2.2、 * 获取日志分页

【C++题解】1345. 玫瑰花圃

问题&#xff1a;1345. 玫瑰花圃 类型&#xff1a;基本运算、小数运算 题目描述&#xff1a; 有一块nn&#xff08;n≥5&#xff0c;且 n 是奇数&#xff09;的红玫瑰花圃&#xff0c;由 nn 个小正方形花圃组成&#xff0c;现要求在花圃中最中间的一行、最中间的一列以及 4 个…

每天一个数据分析题(二百七十七)

检索销量表中销量最好的商品id和销量&#xff0c;下列SQL语句正确的是&#xff08;&#xff09; A. SELECT 商品id,销量 FROM 销量表 WHERE 销量MAX(销量) B. SELECT 商品id,MAX(销量) FROM 销量表 GROUP BY 销量 C. SELECT 商品id,MAX(销量) FROM 销量表 GROUP BY 商品id …

设计模式学习笔记 - 设计模式与范式 -总结:2.实际开发中如何避免过度设计,如何避免设计不足?

概述 设计模式的理论部分已经学完了。我想你一定蠢蠢欲动&#xff0c;想要赶紧实践一下&#xff0c;把这些理论知识应用到自己的项目中。不过&#xff0c;要注意下面两点&#xff1a; 一种是过度设计。在开始编写代码之前&#xff0c;花很长的时间做代码设计&#xff0c;在开…

聊聊linux的文件缓存

序 本文主要研究一下linux的文件缓存 文件缓存 linux使用page cache来缓存最近读取的文件&#xff0c;也有目录结构(dcache: Directory Entry Cache)缓存及inode缓存&#xff0c;它们都使用了LRU算法来管理这些page及dentries cache vmstat ## vmstat procs -----------me…

智享ai自动直播系统,直播界的流量增长点。

智享ai自动直播系统&#xff0c;直播界的流量增长点&#xff01; 在当今互联网时代&#xff0c;商家面临着日益激烈的竞争&#xff0c;因为一切内容如价格都变得透明&#xff0c;商家们纷纷寻求新的增长点来获取流量。在线下资源饱和的情况下&#xff0c;线上短视频平台成为商…

Acrobat Pro DC2024安装包(亲测可用)

目录 一、软件简介 二、软件下载 一、软件简介 Acrobat软件是由Adobe公司开发的一款专业的PDF&#xff08;Portable Document Format&#xff0c;便携式文档格式&#xff09;编辑和管理软件。它为用户提供了丰富的功能&#xff0c;涵盖了创建、编辑、转换和共享PDF文件、签名和…

从选品策划、变现、数据分析、App矩阵多方面,分享App蓝海精细化运营玩法

本篇分享主要分为以下两部分: 通过七麦和蝉大师等数据工具或者同行网站选出蓝海产品; 通过版本、语言、皮肤等实现 App 矩阵,获得更多用户并进行差异化变现。 文章目录 —前言—选品标准一个小案例更进阶的选品思路流量变现App 矩阵最后总结—前言— 据官方统计,App St…

使用嘉立创EDA打开JSON格式的PCB及原理图

一、将PCB和原理图放同一文件夹 并打包成.zip文件 二、打开嘉立创EDA并导入.zip文件 文件 -> 导入 -> 嘉立创EDA标准版/专业版 三、选择.zip文件并选择 “导入文件并提取库” 四、自定义工程路径 完成导入并转换为.eprj文件 五、视频教学 bilibili_使用立创EDA打开JSO…

工业自动化,3D视觉技术3C薄片自动化上料

随着制造业的快速发展&#xff0c;3C行业对薄片类零件的上料需求日益增长。传统的上料方式往往依赖于人工操作&#xff0c;效率低下且存在误差。为了解决这一问题&#xff0c;3D视觉技术应运而生&#xff0c;为3C薄片自动化上料提供了强大的技术支持。本文将探讨3D视觉技术如何…

go语言net包里面的PostForm

net包里面的http包里定义了Request结构体&#xff0c;用于http的请求&#xff0c; type Request type Request struct { // Method指定HTTP方法&#xff08;GET、POST、PUT等&#xff09;。对客户端&#xff0c;““代表GET。 Method string // URL在服务端表示被请求的URI&…

论文阅读-Federated-Unlearning-With-Momentum-Degradation

论文阅读-Federated Unlearning With Momentum Degradation 联邦忘却与动量退化 Yian Zhao IEEE Internet of Things Journal 2023 年 10 月 2 日 CCF-C momentum degradation-MoDe 动量退化 memory guidance-记忆引导 knowledge erasure-知识擦除 Deep-learning neural n…

Docker 更新容器状态 开启/关闭 开机自启动

开启&#xff08;开机 自启动 容器&#xff09; docker update --restartalways {容器ID/Name}关闭&#xff08;开机 自启动 容器&#xff09; docker update --restartno {容器ID/Name}我们下期见&#xff0c;拜拜&#xff01;

C++如何使用string类

文章目录 为什么要学习string?库中的string关于编码ASCII编码Unicode编码 迭代器Iteratorsstring常用构造接口接口声明与功能说明接口演示 string类对象的容量操作接口声明与功能说明接口演示reverse与resize在不同平台下的扩容与缩容机制 string类对象的访问及遍历操作接口声…