CubeMX配置FreeRTOS跑多线程任务

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

软件:

STM32CubeMX V5.3.0  

固件库版本:
STM32Cube FW_F1 V1.8.0

硬件:

STM32F103C8T6

0.96寸IIC接口OLED

双通道遥感电位器

正文:

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

配置时基产生定时器

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

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

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

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

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

当USE_MUTEXES=1才有意义。

是否使用递归互斥量

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

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

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

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

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

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

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

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

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

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

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

 

 

  • 9
    点赞
  • 60
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值