STM32CubeMX之FreeRTOS

2023-05-16

文章目录

  • 1 STM32CubeMX参数配置及其说明
    • 1.1 FreeRTOS Mode
    • 1.2 Config parameters
      • 1.2.1 Kernel setting
      • 1.2.2 Memory management setting
      • 1.2.3 Hook function related definitions
    • 1.3 创建任务Task和队列Queue
      • 1.3.1 创建任务Task
      • 1.3.2 创建队列Queue
    • 1.4 FreeRTOS Heap Usage
    • 1.5 FreeRTOS时钟和HAL timebase Source
      • 1.5.1 FreeRTOS时钟和HAL timebase 使用同一时钟源
      • 1.5.1 FreeRTOS时钟和HAL timebase 使用不同时钟源

参考资料:

  1. 《STM32F103 FreeRTOS开发手册V1.1》

1 STM32CubeMX参数配置及其说明

1.1 FreeRTOS Mode

这里有两种选项
在这里插入图片描述
参考文章:FreeRTOS选项中Disable、CMSIS_V1和CMSIS_V2的区别
这里做实验使用的单片机是STM32F1系列,内核为Cortex - M3,所以选择CMSIS_V1即可。

1.2 Config parameters

1.2.1 Kernel setting

在这里插入图片描述

  1. USE_PREEMPTION
    为1时使用抢占是调度器,为0时使用协程。

  2. TICK_RATE_HZ
    系统时钟节拍频率,单位为HZ。值设置为1000,即周期就是1ms。

  3. MAX_PRIORITIES
    设置任务的优先级数量,设置好以后任务就可以使用从0到(MAX_PRIORITIES - 1)的优先级,其中0位最低优先级,(MAX_PRIORITIES - 1)为最高优先级。

  4. MINIMAL_STACK_SIZE
    设置空闲任务的最小任务堆栈大小,以字为单位,而不是字节。如该值设置为128 Words,那么真正的堆栈大小就是 128*4 = 512 Byte

  5. MAX_TASK_NAME_LEN
    设置任务名最大长度

  6. IDLE_SHOULD_YIELD
    定义了与空闲任务(idle Task)处于同等优先级的其他用户任务的行为,当为0时空闲任务不会为其他处于同优先级的任务让出CPU使用权;当为1时空闲任务就会为处于同优先级的任务让出CPU使用权,除非没有就绪的用户任务。建议设置为0.

  7. USE_MUTEXES
    为1时使用互斥信号量,相关的API函数会被编译。

  8. USE_RECURSIVE_MUTEXES
    为1时使用递归互斥信号量,相关的API函数会被编译。

  9. USE_COUNTING_SEMAPHORES
    为1时启用计数型信号量, 相关的API函数会被编译。

  10. QUEUE_REGISTRY_SIZE
    设置可以注册的队列和信号量的最大数量,在使用内核调试器查看信号量和队列的时候需要设置此宏,而且要先将消息队列和信号量进行注册,只有注册了的队列和信号量才会在内核调试器中看到,如果不使用内核调试器的话次宏设置为0即可。

  11. USE_APPLICATION_TASK_TAG
    为1时可以使用vTaskSetApplicationTaskTag函数。

  12. ENABLE_BACKWARD_COMPATIBILITY
    为1时可以使V8.0.0之前的FreeRTOS用户代码直接升级到V8.0.0之后,而不需要做任何修改。

  13. USE_PORT_OPTIMISED_TASK_SELECTION
    FreeRTOS有两种方法来选择下一个要运行的任务,一个是通用的方法,另外一个是特殊的方法,也就是硬件方法,使用MCU自带的硬件指令来实现。STM32有计算前导零指令吗,所以这里强制置1.

  14. USE_TICKLESS_IDLE
    为1时使能低功耗tickless模式

  15. USE_TASK_NOTIFICATIONS
    为1时使用任务通知功能,相关的API函数会被编译。开启了此功能,每个任务会多消耗8个字节。

  16. RECORD_STACK_HIGH_ADDRESS
    为1时栈开始地址会被保存到每个任务的TCB中(假如栈是向下生长的)

1.2.2 Memory management setting

  1. TOTAL_HEAP_SIZE
    设置堆大小,如果使用了动态内存管理,FreeRTOS在创建 task, queue, mutex, software timer or semaphore的时候就会使用heap_x.c(x为1~5)中的内存申请函数来申请内存。这些内存就是从堆ucHeap[configTOTAL_HEAP_SIZE]中申请的。

1.2.3 Hook function related definitions

钩子函数(hook)也叫回调函数(callback)

1.3 创建任务Task和队列Queue

1.3.1 创建任务Task

在这里插入图片描述其中任务的堆(heap)使用计算:
FreeRTOS requires to allocate in the heap for that user task:
number of bytes = TCB size + (4 * task stack size) = 624 Bytes
Here:
TCB size = 112
task stack size = 128

1.3.2 创建队列Queue

在这里插入图片描述其中队列的堆(heap)使用计算:
FreeRTOS requires to allocate in the heap for that message queue:
number of bytes = 76 + queue_storage_area = 124 Bytes
queue_storage_area (in bytes) = (element_size * nb_elements) + 16.
Here:
element_size = 2
nb_elements = 16

1.4 FreeRTOS Heap Usage

STM32CubeMX在配置完参数后会自动计算使用堆的情况
在这里插入图片描述

1.5 FreeRTOS时钟和HAL timebase Source

1.5.1 FreeRTOS时钟和HAL timebase 使用同一时钟源

参考文章:STM32 Cubemx FreeRTOS的timebase配置
FreeRTOS默认使用SysTick作为时钟源,而如果timebase Source也选择SysTick,如下图
timebase Source则会出现如下警告
在这里插入图片描述

  1. 如果强行点击Yes
    在stm32f1xx_it.c中找到如下函数,可以看出FreeRTOS 滴答时钟HAL timebase都使用SysTick作为时钟源,强烈建议不要这样做
void SysTick_Handler(void)
{
  HAL_IncTick();   /*HAL timebase*/
#if (INCLUDE_xTaskGetSchedulerState == 1 )
  if (xTaskGetSchedulerState() != taskSCHEDULER_NOT_STARTED)
  {
#endif /* INCLUDE_xTaskGetSchedulerState */
  xPortSysTickHandler();   /*FreeRTOS 滴答时钟*/
#if (INCLUDE_xTaskGetSchedulerState == 1 )
  }
#endif /* INCLUDE_xTaskGetSchedulerState */
}

1.5.1 FreeRTOS时钟和HAL timebase 使用不同时钟源

选择TIM7作为HAL timebase 时钟源
在这里插入图片描述

  1. HAL timebase时钟源
    在生成的工程中多出了一个时基的c文件
    在这里插入图片描述

该文件将TIM7初始化为HAL的时基源,中断周期为1ms

在main.c文件中可以找到如下函数,

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
  if (htim->Instance == TIM7) {
    HAL_IncTick();
  }
}

HAL timebase最明显的使用场景是 使用HAL库的延时函数 HAL_Delay

  1. FreeRTOS的时钟源
    在cmsis_os.c文件中有如下函数
/**
* @brief  Handles the tick increment
* @param  none.
* @retval none.
*/
void osSystickHandler(void)
{
#if (INCLUDE_xTaskGetSchedulerState  == 1 )
  if (xTaskGetSchedulerState() != taskSCHEDULER_NOT_STARTED)
  {
#endif  /* INCLUDE_xTaskGetSchedulerState */  
    xPortSysTickHandler();
#if (INCLUDE_xTaskGetSchedulerState  == 1 )
  }
#endif  /* INCLUDE_xTaskGetSchedulerState */  
}

在FreeRTOSConfig.h文件中可以找到如下宏定义

#define xPortSysTickHandler SysTick_Handler
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32CubeMX之FreeRTOS 的相关文章

  • FreeRTOS学习笔记 6 - 互斥量

    目录 1 创建 2 获取 3 释放 4 测试 FreeRTOS不支持调度方式的设置 所以下面2个宏定义可以随意设置值 define RTOS IPC FLAG FIFO 0x00 define RTOS IPC FLAG PRIO 0x01
  • FreeRTOS系列

    本文主要介绍如何在任务或中断中向队列发送消息或者从队列中接收消息 使用STM32CubeMX将FreeRTOS移植到工程中 创建两个任务以及两个消息队列 并开启两个中断 两个任务 Keyscan Task 读取按键的键值 并将键值发送到队列
  • FreeRTOS_中断

    传送门 博客汇总帖 传送门 Cortex M3 中断 异常 传送门 Cortex M3笔记 基础 笔记内容参考 正点原子的FreeRTOS开发手册 cortex m3权威指南 Cortex M3和Cortex M4权威指南等 文中stm32
  • Error: L6218E: Undefined symbol vApplicationGetIdleTaskMemory (referred from tasks.o).

    我用的是F103ZET6的板子 移植成功后 编译出现两个错误是关于stm32f10x it c 里 void SVC Handler void void PendSV Handler void 两个函数的占用问题 随后编译出现以下两个问题
  • FreeRTOS,串口中断接收中使用xQueueOverwriteFromISR()函数,程序卡死在configASSERT

    原因 UART的中断优先级设置的太高 高于了configMAX SYSCALL INTERRUPT PRIORITY宏定义的安全中断等级 UART的中断等级小于等于宏定义的优先等级即可
  • Linux下使用STM32CUBEMX的makefile,报multiple defination错误的解决办法

    之所以报这个错是因为stm32cubemx生成makefile的一个bug 在C SOURCES部分会重复添加Src 下的c文件 上图是没有修改makefile之前 下图为修改后 要修改的部分
  • FreeRTOS学习(三)开关中断

    声明及感谢 跟随正点原子资料学习 在此作为学习的记录和总结 环境 keil stm32f103 背景知识 Cotex M3的NVIC最多支持240个IRQ 中断请求 1个不可屏蔽 NMI 1个Systick 滴答定时器 Cortex M处理
  • 《STM32单片机开发应用教程(HAL库版)—基于国信长天嵌入式竞赛实训平台(CT117E-M4)》第四章4.8 TIM---PWM输出实验

    写在前面 STM32单片机开发应用教程 HAL库版 基于国信长天嵌入式竞赛实训平台 CT117E M4 第四章4 8 TIM PWM输出实验 讲解TIM 定时与PWM输出的STM32CubeMX配置和程序设计方法 官方例程下载 https
  • FreeRTOS笔记(十)中断

    中断 当CPU在执行某一事件A时 发生另外一个更重要紧急的事件B请求CPU去处理 产生了中断 于是CPU暂时中断当前正在执行的事件A任务而对对事件B进行处理 CPU处理完事件B后再返回之前中断的位置继续执行原来的事件A 这一过程统称为中断
  • freeRTOS出现任务卡死的情况。

    最近在做一个产品二代升级的项目 代码是上一任工程师留下的 很多BUG 而且融合了HAL库和LL库 以及github上下载的GSM源码 很不好用 我这边是将2G模块换成了4G 且添加了单独的BLE模块 因此只在源码的基础上 去除2G和BLE代
  • 【STM32CubeMX】位置式PID调节控制输出电压(超详解)

    本文将借助STM32CubeMX来配置ADC DMA DAC USART 并利用PID位置式算法实现对输出电压进行AD采集通过PID算法调节DAC 获取到我们想要的电压值 讲解的主要知识 何为PID以及为何需要PID STM32CubeMX
  • FreeRTOS笔记(二)

    FreeRTOS笔记 二 静态任务 文章目录 FreeRTOS笔记 二 静态任务 一 任务定义 二 任务创建 2 1 定义任务栈 2 2 定义任务函数 2 3 定义任务控制块 2 4 实现任务创建函数 三 实现就绪列表 3 1 定义就绪列表
  • STM32CubeMX学习六 之ADC配置

    文章目录 前言 一 本地环境 二 开始 1 定时器配置 2 引脚配置 在这里插入图片描述 https img blog csdnimg cn e5b6f155a1b8468cb15046a0a9d031cd png 3 内部时钟配置 4 A
  • FreeRTOS临界段

    1 临界段 在访问共享资源时不希望被其他任务或者中断打断的代码 这段要执行的代码称为临界段代码 2 设置临界段的目的 保护共享资源 例如 全局变量 公共函数 不可重入函数 函数里面使用 了一些静态全局变量 malloc 等 保护外设的实时性
  • STM32 Freertos 添加 外部sram heap_5.c

    1 添加外部SRAM 初始化 2 添加heap 5 c 3 初始化heap 5 c 外部堆栈 Define the start address and size of the two RAM regions not used by the
  • FreeRTOS多任务调度器基础

    Cortex M4中SysTick调度器核心 Cortex M4中的中断管理 Cortex M4中影子栈指针 Cortex M4中SVC和PendSV异常 1 Cortex M4中SysTick调度器核心 systick每一次中断都会触发内
  • 如何更改 FreeRTOS 中任务的最大可用堆大小?

    我通过以下方式在任务中创建元素列表 l dllist pvPortMalloc sizeof dllist dlllist 有 32 字节大 我的嵌入式系统有 60kB SRAM 所以我希望系统可以轻松处理我的 200 个元素列表 我发现在
  • 有可用的 FreeRTOS 解释语言库吗?

    我在一家公司工作 该公司使用 FreeRTOS 为多个设备创建固件 最近 我们对新功能的要求已经超出了我们固件工程师的工作能力 但我们现在也无力雇用任何新人 即使进行微小的更改 也需要固件人员在非常低的级别上进行修改 我一直在为 FreeR
  • GNU Arm Cortex m4 上的 C++ 异常处理程序与 freertos

    2016 年 12 月更新现在还有一个关于此行为的最小示例 https community nxp com message 862676 https community nxp com message 862676 我正在使用带有 free
  • 哪些变量类型/大小在 STM32 微控制器上是原子的?

    以下是 STM32 微控制器上的数据类型 http www keil com support man docs armcc armcc chr1359125009502 htm http www keil com support man d

随机推荐

  • Linux中系统盘空间不足和显存没有释放问题

    1 系统盘空间不足 以下两个是可以直接删除 xff0c 不影响系统运行的目录 xff0c 所以首先直接删除 du sh root miniconda3 pkgs amp amp rm rf root miniconda3 pkgs cond
  • Ubuntu KCF 代码运行

    最近刚接触kcf xff0c 在Ubuntu上运行代码 xff0c 碰到一些问题 xff0c 借鉴了网上其他人的方法 xff0c 简单记录一下过程 KCF代码下载 KCF的代码可以去作者的网站去下载 xff1a http www robot
  • PADS学习笔记之绪论

    学习目的 在学校里的时候使用一直都是AD xff0c 现在即将毕业了 xff0c 来公司实习之后发现基本不用AD xff08 可能是怕收到律师函 xff09 xff0c 公司主要用的是PADS xff0c 某些项目也会用到cadence 虽
  • 软件工程中的框架

    什么是框架 框架 Framework 是构成一类特定软件可复用设计的一组相互协作的类 框架规定了你的应用的体系结构 它定义了整体结构 xff0c 类和对象的分割 xff0c 各部分的主要责任 xff0c 类和对象怎么协作 xff0c 以及控
  • Python argparse模块详解

    argparse是python用于解析命令行参数和选项的标准模块 xff0c 用于代替已经过时的optparse模块 官方文档中讲到的 xff0c 本文基本都提到了 xff0c 但只是简要记录 xff0c 如果需要深入理解 xff0c 可查
  • Linux下实现C语言的http请求实现

    该文件为转载文章 xff0c 作为学习和个人笔记使用 xff08 原文地址 xff09 https blog csdn net songfeihu0810232 article details 54892149 前言 Linux下的http
  • float a=1.0f在内存中的表示

    http zhidao baidu com question 314282772 html 3f800000H 61 0 01111111 00000000000000000000000B xff08 注意我分成了三段 xff09 符点型数
  • 图片返回状态码403

    在public index html 头部加一行代码 在这里插入图片描述 https img blog csdnimg cn 20200323202225328 png x oss process 61 image watermark ty
  • ROS学习笔记_01:工作空间及功能包

    1 ROS安装 xff1a 每个ROS版本对应一个Ubuntu版本 UBUNTUROSEnd of time14 04 LTSindigo IglooApril xff0c 201916 04 LTSKinetic KameApril xf
  • ROS学习笔记_02: Topic 和 msg

    1 ROS通信方式 ROS有四种通信方式 xff1a Topic 主题Service 服务Parameter Service 参数服务器Actionlib 动作库 其中 xff0c topic是最常用的一种 2 Topic Topic xf
  • Ubuntu20 + KVM虚拟机

    1 命令汇总 span class token comment 查看一下linux是32位还是64位 xff1a span span class token function file span bin ls span class toke
  • 基于PX4、树莓派和Mocap(Optitrack)的室内飞行环境搭建

    基于PX4 树莓派和Mocap Optitrack的室内飞行环境搭建 前言系统结构和原理软硬件要求Mocap环境设置主机 gt 工作站设置wifiMotive设置 Mocap gt Pixhawk硬件要求 xff1a 软件要求 xff1a
  • STL map的基本用法

    begin 返回指向map头部的迭代器 clear 删除所有元素 count 返回指定元素出现的次数 empty 如果map为空则返回true end 返回指向map末尾的迭代器 equal range 返回特殊条目的迭代器对 erase
  • 自己动手写操作系统(高清图书+源代码)分享

    很喜欢 自己动手写操作系统 这本书 xff0c 但现在这本书已经绝版了 在这里分享一下这本书的高清电子版和源代码 xff0c 感兴趣的人可以下载一下 链接 xff1a https pan baidu com s 1lPXg Airu2NFj
  • 四旋翼飞行器控制pid学习笔记

    PID控制学习笔记 凡事必躬亲 xff0c 身体而力行 xff0c 化理论为实践 xff0c 方得始终 研究PID xff0c 首先应当把PID拆解开来 xff0c 便是P xff08 比例控制 xff09 I xff08 积分控制 xff
  • Ubuntu使用终端命令安装谷歌Chrome浏览器

    sudo wget http www linuxidc com files repo google chrome list P etc apt sources list d wget q O https dl google com linu
  • 为什么C/C++很多内部函数由下划线开头?关于VS中的CRT_SECURE

    以下摘自compatibility 兼容性 通用 C运行时库 UCRT 支持实现 C 43 43 一致性所需的大多数 C 标准库 它实现 C99 xff08 ISO IEC 9899 1999 xff09 库 xff0c 但有一些例外情况
  • 实现快速全自动Ubuntu批量安装的步骤

    随着使用ubuntu系统的用户越来越多 xff0c 对于一台PC机安装ubuntu系统来说并不是难事 xff0c 但是如果对于企业里新增的几十台几十台服务器 xff0c 一台一台安装 xff0c 实在是太累 xff0c 通过以下方法 xff
  • ESP32基础应用之FreeRTOS使用

    文章目录 前言1 FreeRTOS 任务的使用1 1 任务状态1 2 任务优先级1 3 创建任务 2 FreeRTOS 事件标志组的使用 参考资料 xff1a STM32F103 FreeRTOS开发手册V1 1 pdf 前言 1 Free
  • STM32CubeMX之FreeRTOS

    文章目录 1 STM32CubeMX参数配置及其说明1 1 FreeRTOS Mode1 2 Config parameters1 2 1 Kernel setting1 2 2 Memory management setting1 2 3