STM32CubeMX之FreeRTOS


参考资料:

  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
  • 9
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
纯人工翻译中文版本,STM32CubeMX用户手册中文版,STM32CubeMX用户手册中文版UM1718-翻译版.菜鸟到高手,显得有些霸气哈,不过的确如此,官方带给我们一个比较实用的stm32的工具。这个工具就是STM32CubeMX,昨天玩freeRTOS的时候就提到过。说到freeRTOS,这里就多说两句。全局变量,在任务间相互访问的时候也是需要临界保护的,不然可能会出现奇怪的问题。不过我们可以关掉时间片调度,任务间可以访问全局变量而不用加保护(不等于菜鸟可以随意代码)。关闭了时间片调度,只有发生vTaskDelay的时候才会上下文切换。只要代码合理访问全局变量可以不加保护的。因此代码也不是可以任意书写的,关于freeRTOS的问题,多看看源码,一切都会有答案。源码较少,这里就不过多介绍。关闭时间片不是网上说的configUSE_TIME_SLICING这个宏定义,老鸟发现这个宏压根没用哈,嘿嘿。阅读源码可以找到相关宏配置。不过不建议关闭,时间片调度也可以让一个任务在执行一定时间后切换到其他就绪任务去执行。如果有freeRTOS相关问题,可以留言给我。废话说多了点哈,继续我们的STM32CubeMX。下面我们来讲讲这个工具的作用,讲完后,可以自己下载一个试试,挺简单不多介绍。 到官网下载STM32CubeMX,并安装。 1:芯片选型 打开STM32CubeMX,我们点击new project,我们就可以进行芯片选型,如果你下载了打开了这个工具,是不是很惊讶,stm32的所有产品型号都在里面,而且左下提供了资源勾选,比如你要以太网支持,勾选以太网选项,所有的支持以太网的stm32芯片才会被显示,旁边还有个max的栏目指示了芯片最多支持该功能的个数。空白的一般默认只有一个。下图是我勾选以太网的截图。 上图不仅提供了芯片,还提供了价格,是否在售,封装,存储,频率等一些列信息。 除了cpu资源可以选型外,上面还提供了脚多少,存储大小等非常灵活的选型方式。 我们选择其中一个的单片机后。右上部分给我们提供了完美的支持。 第一个选项提供了改cpu 的特性,我们可以大概的了解选中的cpu资源。 第二个选项提供该cpu框图,截图图片太大,这里就不截图了。 第三个选项提供了cpu文档,这个文档非常多也非常全面,基本不用在网上东找西找了,主要给硬件工程师用。 第四个选项提供了cpu的相关设计资源,软件编程文档,给软件工程师用,非常全面,包括网上很少用到的文档资料,比如系统移植相关的底层资料(堆栈,指令,汇编)。 第五个选项提供了芯片购买途径,这个每个人自己选择吧。 第六个选项开始工程,芯片选好了,就可以开始工程。 2:设定芯片。 芯片选好后,可以开始设定芯片。这就是软件工程师的好帮手呀。比如我要以太网功能,勾选上以太网即可,他就会自动分配出芯片对应的以太网接口。如下图: 上面我选了标准的MII接口。很多人可能就不理解,你勾了个以太网,咋报错了。老鸟告诉你为啥变红了,stm32有个复杂的功能就是io口复用,勾选mii后分配的io口和spi2以及iis口重合了,所以这个工具非常智能的提示了出来,非常神奇吧。告诉你他们不能使用了。还有些变黄了,说明他们可以选择性使用,真是太方便了,省去了查资料慢慢找io的痛苦。比如我们还要给它个外部时钟。我们勾选时钟即可,响应的时钟脚就会分配出来。 如果要将某个脚设置成输入输出那就更简单了,鼠标点选对应的io口选择对应功能即可,比如我单击PA6,它的所有功能可以轻松选择: 软件使用比较简单,不过多解释,一看就明白,设置完芯片功能后,我们就设定系统各项功能时钟。 选择时钟设置页面(clock configuration)时钟轻松设定,如下图,简单明了,不过多解释了: 时钟配置完成后,可以切换到configuration选项对功能进一步设定,里面参数都是常用的功能,设置较为简单。就不多举例了,比如网络功能里面设置mac地址等。 3:生产初始化代码 经过上面的图形化设定,我们可以直接生产初始化代码。省去我们查阅资料慢慢配置的的环节,时间更多的利用在应用层设计。点击project下面的生成代码选项。输入工程名(根据你项目需要起名),这里我就随便输入一个名字。设定好相关参数。点击ok即可。顺便说下,这个工具是配带教程的,我这里只是告诉大家有这样个工具可以加速开发,具体设置参考官方教程。 生成后打开文件夹内容如下: 上图的inc 和src文件夹里面是生成的主要代码,其他几个文件夹里面的东西,大家可以根据自己需要选择。src文件夹文件如下: 打开熟悉的main.c,可以看到如下内容: 初始化已经完成,直接写自己的功能即可了,然后就是加入到工程里面编辑,是不是非常简单。熟悉的话10来分钟一个工程构架就出来了。这样一来,stm32就变成最简单的单片机了,有木有,这个是基于库函数的,io操作直接可以查看库函数手册完成。这个工具主要是加速底层开发。轻松弄出自己的应用程序。对于新入手stm32来说,用这个库函数,让开发变得简单。减少定时器,can,ad,line等外围配置花去的时间,图像化配置,秒变高手。最主要的是功能直观可见,编辑性好,可导入工程编辑。修改配置也简单

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值