CubeMX配置FreeRTOS跑多线程任务

前言:想起以前用标准库做RTOS的时候一大堆操作就很烦,还好MX支持了直接配置生成RTOS工程很方便,最近发现一些很久以前买的模块没用上放着占地方然后顺便拿出来做了个小遥控器玩玩,下面给遥控器配个RTOS跑跑。

软件:

STM32CubeMX V5.3.0  

固件库版本:
STM32Cube FW_F1 V1.8.0

硬件:

STM32F103C8T6

0.96寸IIC接口OLED

双通道遥感电位器

正文:

1、接着用上次配的工程,打开RTOS,配置内核时钟

CubeMX配置FreeRTOS跑多线程任务_第1张图片

配置时基产生定时器

CubeMX配置FreeRTOS跑多线程任务_第2张图片

HAL库函数如CAN通讯用的是HAL_IncTick(),而HAL_IncTick()是CubeMX的TimeBase配置的,这个时候如果需要实时响应,则TimeBase最好为最高优先级0,即根据CubeMX推荐的设置TimeBase为TIM1提供。而原先裸机的HAL系统时钟用的Systick,现在Systick用到FreeRTOS上的调度,所以要求Systick为最低优先级15,这样可以保证systick不会对进程造成影响,仅存在延时。而消除延时的手段并不是提高systick的优先级,而是让中断服务程序更快。

CubeMX配置FreeRTOS跑多线程任务_第3张图片

2、配置Config parameters,这里大部分是默认参数,然后因为后面要开三个任务,默认堆栈大小不够,修改了一个总堆栈大小

CubeMX配置FreeRTOS跑多线程任务_第4张图片

关于里面参数的相关含义这里有一篇介绍得很好的文章https://blog.csdn.net/zhzht19861011/article/details/50134883

现在把部分重要的参数整理成表格如下:

参数名称 参数取值 参数含义说明
  USE_FREEMPTION Enabled/Disnable Enabled–抢占式调度器:优先级高的任务优先执行。
Disnable–协作式调度器:不考虑优先级,所有任务轮流执行。
  CPU_CLOCK_HZ SystemCoreClock CPU 时钟频率。STM32F1 默认只能使用主系统时钟频率。
  TICK_RATE_HZ 1–1000 tick 中断的频率,单位为Hz。
直接影响到计时的分辨率,精度越高,占用CPU时间越多。
  MAX_PRIORITIES 4–255 能够分配给任务的最大优先级。占内存尽量低
  MINIMAL_STACK_SIZE 128k 分配给空闲任务的最小栈空间,单位为字,对于 STM32 而言一个字为 32bit。
应该考虑线程的数量、总堆大小和系统栈大小。当动态分配时,最大值= configTOTAL_HEAP_SIZE/4;当静态分配时,最大值= MCU ram size/4。
  MAX_TASK_NAME_LEN 12–255 任务名的最大(ASCII)字符数,包括字符串结束符NULL(’\0’)。
  USE_16_BIT_TICKS Enabled/Disnable 定义系统节拍计数器的变量类型,即定义portTickType是表示16位变量还是32位变量。
  IDLE_SHOULD_YIELD Enabled/Disnable 当任务具有空闲优先级且内核系统使用了抢占式调度器,则
Disnable–阻止空闲任务为其它具有空闲优先级的任务让出CPU,只有当空闲任务离开运行状态才能被抢占。
Enabled–如果有另外一个空闲优先级的任务在准备状态,则空闲任务立刻让出CPU,让该任务运行。
  USE_MUTEXES Enabled/Disnable 是否使用互斥量
  USE_RECURSIVE_MUTEXES Enabled/Disnable

当USE_MUTEXES=1才有意义。

是否使用递归互斥量

  USE_COUNTING_SEMAPHORES Enabled/Disnable 是否使用计数信号量
  QUEUE_REGISTRY_SIZE 0–255 队列记录有2个用途,都与操作系统内核的调试器有关:
1、它允许文本名称与队列关联,便于在调试GUI中识别队列。
2、它包含调试器所需的信息来定位每个已注册的队列和信号量。
如果想使用内核调试器查看队列和信号量信息,必须先将这些队列和信号量进行注册。参见vQueueAddToRegistry()和vQueueUnregisterQueue()。
  USE_APPLICATION_TASK_TAG Enabled/Disnable Enabled–vTaskSetApplicationTaskTag 函数有效。仅用于高级用户。可以为每个任务分配一个“tag”值。 此值仅用于应用程序,RTOS 内核本身并不以任何方式使用它。
  ENABLE_BACKWARD_COMPATIBILITY Enabled/Disnable

用于选择执行的任务的方法:通用方法和特定于硬件的方法

一般设置成Disnable,效率略低于特定方法,但是没有什么限制条件

  USE_PORT_OPTIMISED_TASK_SELECTION Enabled/Disnable 头文件 FreeRTOS.h 包含一系列 #define 宏定义,这些宏将 FreeRTOS 8.0.0 版本之前使用的数据类型的名称映射到版本 8.0.0 中使用的名称。
这些宏可以确保RTOS内核升级到V8.0.0版本时,之前的应用代码不用做任何修改。
  USE_TICKLESS_IDLE Enabled/Disnable 低功耗模式是否开启。
  USE_TASK_NOTIFICATIONS Enabled/Disnable 每个RTOS任务具有一个32位的通知值,RTOS任务通知相当于直接向任务发送一个事件,接收到通知的任务可以解除任务的阻塞状态(因等待任务通知而进入阻塞状态)。相对于以前必须分别创建队列、二进制信号量、计数信号量或事件组的情况,使用任务通知显然更灵活。更好的是,相比于使用信号量解除任务阻塞,使用任务通知可以快45%
  RECORD_STACK_HIGH_ADDRESS Enabled/Disnable 这个似乎与代码指向堆栈最高地址有关

3、配置Include parameters,用于裁剪内核,定制一个合适大小的内核,设置关闭某些没必要的API可以减轻内核大小。

CubeMX配置FreeRTOS跑多线程任务_第5张图片

4、在TaskAndQueues任务列表中添加自己的任务任务及队列的配置。

TaskName是任务名称,一个字符串而已。下面是优先级配置,再往下是任务堆栈大小。EntryFunction是任务函数名。CodeGenerationOption是选择自动生成代码是否声明成weak。Allocation是配置内存是否动态分配,此处CUbeMX默认动态分配不给更改。

CubeMX配置FreeRTOS跑多线程任务_第6张图片

5、生成代码,在freertos.c文件里面可以看到刚刚我们定义函数名字的函数生成了,但是还是空函数,可以自己添加逻辑和算法处理函数。

CubeMX配置FreeRTOS跑多线程任务_第7张图片

我们做好逻辑和算法处理函数之后直接在这个文件里面调用即可,main.c文件不需要做其他操作

CubeMX配置FreeRTOS跑多线程任务_第8张图片

在main函数里面做完底层初始化之后就开始初始化RTOS,然后开启任务调度,这就实现了一个多线程的过程。

这里分别设置了三个线程,OLED显示刷新、LED闪烁、ADC数据处理。

CubeMX配置FreeRTOS跑多线程任务_第9张图片

 

 

你可能感兴趣的:(STM32)