cubeIDE开发, 如何结合FreeRTOS开发STM32程序

news2024/11/15 16:26:17

一、STM32CubeIDE使用内置的FreeRTOS

        不同于STM32CubeIDE使用像RTThread这些第三方物联网系统,STM32CubeIDE在安装时就已经在MiddleWare中间件一栏直接支持了FreeRTOS操作系统。

        既然STM32CubeIDE已经把FreeRTOS深度整合到了自家的系统中,所以移植及使用FreeRTOS变得非常方便。STM32CubeMX图形配置界面的MiddleWare一栏,可以设置FreeRTOS是否开启来使用该实时系统。

二、创建使用FreeRTOS系统的STM32CubeIDE工程

        本文是基于STM32L496VGT3的MCU芯片创建一个新的STM32工程“stm32L496VGT3_CMSIS_OS_V1”,并使用FreeRTOS系统前,已经开启了lpusart串口通信及三个LED的GPIO_OUTPUT接口,及实现了串口lpusart及LED灯驱动(关于这边部分设置及实现就略过,读者可以参考本专栏的其他博文)。

        现双击(.ioc)文件进入cubeMX图像配置界面,开启使用FreeRTOS系统。在MiddleWare中间件一栏,选择FreeRTOS,在右边Interface下来框,会出现Disable、CMSIS_V1和CMSIS_V2三个选项。本文选择CMSIS_V1进行测试。

         关于CMSIS_V1和CMSIS_V2的不同,详见CMSIS ARM官方关于微控制器软件接口标准CMSIS定义(如下图)。Cortex微控制器软件接口标准(CMSIS)是独立于供应商的硬件抽象层,用于基于Arm Cortex处理器的微控制器,并且CMSIS提供了到处理器和外围设备,实时操作系统以及中间件组件的接口。不同之处简单来说,v1使得软件能够在不同的实时操作系统下运行(屏蔽不同RTOS提供的API的差别),而v2则是拓展了RTOS v1,兼容更多的CPU架构和实时操作系统,说白话就是,CMSIS_V2是在CMSIS_V1上,兼容CMSIS_V1的,具有更多功能及支持更多硬件型号。

         点击保存或生成代码按钮,会弹出下面对话框:

         这是关于freertos暴露给用户的API接口并不是原生的freertos接口,是经过cmsis-rtos进行一次包装之后的,在使用timebase源是有所冲突,编译器会建议你把timebase源切换到非systick。这是因为freertos的调度时钟是强制性使用systick的并且systick的中断优先级被设置为最低。

        而hal 库需要使用到的tick计数源,HAL标准库有很多有超时功能的函数接口都用到这个hal timebase。所以编辑器在生成代码时候就强烈建议hal timebase和freertos 使用的systick不要共用。systick已经被强制为最低优先级,hal timebase用的话就可能产生计数不准的情况。

        至于systick已经被强制为最低优先级,是因为freertos是一个嵌入式实时操作系统,要确保中断能够立马得到响应,就要把调度器的时钟优先级设置为最低就不会影响其他外设中断的及时响应。在一旦在stm32cubemx中勾选了freertos后,systick的优先级自动被设置为最低。

        freertos还有个配置优先级选项:configMAX_SYSCALL_INTERRUPT_PRIORITY高于该配置的优先级中断中都不能调用freertos的任何API,但是同时他也不会受freertos的内核影响而可以得到最实时的响应。如果在中断服务函数中需要使用freertos的API接口函数的话就要把该中断的优先级配置为小于或等于 configMAX_SYSCALL_INTERRUPT_PRIORITY。

        在stm32L0系列单片机的优先级一共有四个等级:0-3,0为最高优先级3为最低。使用freertos以后sytick就在该等级。把 configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY 配置为2,这样特别实时的中断优先级就可以配置为0或者1,而正常需要调用freertos API的中断就可以配置为2或者3优先级。

        现在按编辑器建议,去修改开启USE_NEWLIB_REENTRANT

         同时调整HAL TimeBase设置更换TimeBase源。

         再次点击保存,编辑器就无告警弹出,生成代码后,关于FreeRTOS生成代码如下:

         并在main,c主函数文件中,给出了关于FreeRTOS最简要的调用代码。

         并能编译通过。

三、使用FreeRTOS功能

        现在再次回到cubeMX图形编辑界面,进入FreeRTOS配置的任务与队列配置页面,添加一个LedTask(闪灯任务),修改任务名为LEDTask,修改Function名为LEDTaskFunc,注意任务名和Function名不能一样,其他保持默认。

         关于NewTask几个属性栏:

  •         Task Name: 设置任务的名称,它会基于此名字建立一个指向任务的句柄
  •         Priority: 设置任务的优先级,高优先级的任务会抢占低优先级的任务
  •         Stack Size: 设置任务栈的大小,用于储存任务相关的变量,关于堆栈详细内容请参考
  •         Entry Function:设置任务的入口函数,这个函数便是开发者实现任务功能的地方
  •         Code Generation Option: IDE自动生产初始代码的选项,这里选择默认设置
  •         Parameter: 传递给任务的参数
  •         Allocation: 选择动态的话是生成在堆中,选择静态的话则生成在静态区
  •         Buffer Name和ControlBlock Name:在Allocation选择静态时生效。

        配置好这个LedTask后,保存生成输出代码,去FreeRTOS的用户可编译源文件freertos.c中,找到LEDTaskFunc函数,这就是我们在cubeMX图形界面配置的任务入口,可以在这里修改实现自己任务内容。

         例如本文在源码文件引入"../../ICore/led/led.h"驱动头文件,该LEDTaskFunc函数循环体内加上闪灯功能Toggle_led0()。

         关于LEDTaskFunc函数调用,在主函数中初始化先调用FreeRTOS初始化API:“MX_FREERTOS_Init()”,然后在调用osKernelStart()启用。MX_FREERTOS_Init函数是图形配置生成的,在freertos.c文件中。另外为了防止主函数循环一直占用资源,调用一个延时HLA_Delay(100),防止LEDTaskFunc函数循环抢不到资源。

四、编译及测试

        【1】进入项目属性设置页面,配置工程输出文件格式支持。

         【2】配置程序运行按钮下来列表,点击“运行配置”,新建一个配置选项,默认配置即可,选择串口支持格式。或者采用其他烧写工具实现。

         本文开发板支持ST-Link加载。

         【3】点击运行按钮,完成编译下载

         【4】观察效果,只有LED0在闪烁,而代码实现中只有在LEDTaskFunc函数循环中调用了Toggle_led0(),说明FreeRTOS系统已经被争取使用:

CubeIDE调用FreeRTOS实现闪灯任务-CSDN直播

 补充,不好意思,忘了自己等级不够,放不了视频,给出图片效果如下:

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

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

相关文章

深度学习中的正则化——L1、L2 和 Dropout

正则化是一组技术,可以防止神经网络中的过度拟合,从而在面对来自问题域的全新数据时提高深度学习模型的准确性。 在本文中,我们将介绍最流行的正则化技术,称为 L1、L2 和 dropout。 文章目录1. 回顾:过拟合2.什么是正则…

【并发编程】AQS ReentrantLock 底层实现原理

一、概述 synchronized上锁机制是通过对象头来实现的,通过锁升级的过程来完成加锁。(https://blog.csdn.net/zhangting19921121/article/details/106002751) 但是synchronized锁升级的过程犹如一个黑盒,我们无法掌控。因此&…

常见的损失函数

1. 损失函数、代价函数与目标函数 损失函数(Loss Function):是定义在单个样本上的,是指一个样本的误差。   代价函数(Cost Function):是定义在整个训练集上的,是所有样本误差的平均…

07_openstack之安全组与浮动IP

目录 一、环境准备 二、浮动IP 1、浮动IP介绍 2、创建和分配浮动IP 三、安全组 1、安全组介绍 2、创建安全组 3、给云主机绑定安全组 一、环境准备 部署openstack私有云环境:02_openstack私有云部署_桂安俊kylinOS的博客-CSDN博客 创建项目和用户&#xf…

Mac电脑系统降级至10.15 Catalina(2020末代intel)

目录起因前期准备降级系统步骤&#xff08;联网&#xff09;选定开机阶段需要按的快捷键进入简化的macOS激活锁页面macOS实用工具页面抹除磁盘安装降级系统Catalina关于从U盘重装系统相关参考博客起因 这部分碎碎念可以不看> < 20年7月买mac是为了找工作&#xff0c;找到…

[附源码]计算机毕业设计校园商铺Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

[附源码]计算机毕业设计药品仓库及预警管理系统Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

libcef.dll文件丢失怎么办?丢失对电脑有什么影响?

提到电脑中的系统文件可能大家都是不太了解的&#xff0c;毕竟平时使用电脑的时候也接触不到那些复杂的文件&#xff0c;最多大家只会使用电脑上面的各种功能&#xff0c;不过虽然接触不到但是大家也要适当的了解一下&#xff0c;就比如libcef.dll文件丢失了就会造成电脑系统出…

Word2Vec详解

Word2Vec 基本思想&#xff1a;通过训练将每一个词映射成一个固定长度的向量&#xff0c;所有向量构成一个词向量空间&#xff0c;每一个向量&#xff08;单词)可以看作是向量空间中的一个点&#xff0c;意思越相近的单词距离越近。 如何把词转换为向量&#xff1f; 通常情况…

用Python做个学生管理系统,这不简简单单

前言 最近因为疫情&#xff0c;各大高校都开始放假了&#xff0c;要不就是回家上网课 我朋友的老师真有趣&#xff0c;硬是要我朋友做个学生管理系统打包成exe文件发给他&#xff0c;才能回家 这不就找上我来了&#xff0c;我写完就顺便发篇文章咯 准备工作 环境准备 Pyth…

Java基于springboot+vue的保健用品销售购物商城系统 前后端分离

随着人们生活水平的提高&#xff0c;人们对日常的保健工作也越来越重视&#xff0c;如何拥有一个更加健康的体魄成为当下很多人的一个追求&#xff0c;尤其是我国当下人口老龄化验证&#xff0c;老人因为身体机能的下降所以也要经常补充一些蛋白核矿物质。当下的年轻人也因为生…

【Java】ArrayList扩容规则

文章目录初始大小扩容规则总结初始大小 ArrayList的初始大小由你选定的构造函数决定&#xff0c;如果你使用无参构造函数&#xff0c;那么初始大小为0&#xff0c;是一个空数组。 而如果你选用有参数的构造函数&#xff0c;那么初始大小为你输入的大小 因此如果问你ArrayLis…

[附源码]计算机毕业设计基于springboot的4s店车辆管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

货架穿梭车控制方案

穿梭车控制系统结构示意图 系统组成结构示意图穿梭车服务端模块 PLC设备输出的控制客户端4个电机动作的开关量信号 共8个开关量信号&#xff0c;PNP电路接口,接线端子Q3.0&#xff5e;Q3.7&#xff1b;每个继电器由两个开关量的值共同作用&#xff0c;其控制表如下&#xff1a…

黑马程序员课程SpringMVC听课笔记

目录 SpringMVC概述 入门案例 使用Servlet技术开发web程序流程 使用SpringMVC技术开发web程序流程 导入pom.xml文件 UserController SpringMvcConfig ServletContainersInitConfig POST请求中文乱码处理 代参数GET请求 请求参数与传递 普通参数&#xff1a;请求参数名…

python -- PyQt5(designer)中文详细教程(一)Qt的基本功能

在介绍PyQt5中文详细教程前&#xff0c;如有需要安装PyQt5的同学可以在此 PyQt5安装详细教程_M_Q_T的博客-CSDN博客参考安装&#xff0c;里面有详细的安装内容。 下一章内容python -- PyQt5&#xff08;designer&#xff09;中文详细教程(二)菜单和工具栏 ​​​​​​​http:…

技术人员创业的第一步分析

概述&#xff1a;看完了本文&#xff0c;基本上可以了解确认自己所掌握的技术是否适合创业&#xff0c;如果不适合&#xff0c;不如找个大公司长期停留&#xff0c;也挺好的&#xff0c;免得折腾&#xff01;————————————————————前几天和一个朋友聊天&…

资源管理的部分

估算资源的活动的资源目录概述需求&#xff1a;设计思路实现思路分析1.估算的资源的资源的分解结构&#xff1a;获取资源2.虚拟团队3.CPO模型4.团队的5.资源日历建设团队团队一般成长规律形成 指导型管理风格认可奖励培训指标管理团队关于授权情商&#xff0c;领导力等控制资源…

排障必用的4款工具,帮你缩减排障时间!-网络工程师

Zen Load Balancer Zen Load Balancer是一个基于 Debian 的发行版&#xff0c;主要用于实现 TCP 的负载均衡。如果你在工作中遇到需要服务器负载均衡的功能&#xff0c;但又没有预算的时候&#xff0c;这个工具就能帮到你了。 可通过定制的脚本来检查后端的运行状态&#xff0c…

【java】3-获取线程引用与线程的属性

1.获取线程的引用 在创建一个线程之后&#xff0c;我们很有必要去获取当前线程实例的引用&#xff0c;以便能够观察到线程的一些属性&#xff0c;或是对于当前线程进行一系列的操作 调用Thread类的静态方法currentThread&#xff0c;我们便能拿到当前线程的引用 Thread.curr…