如何使用STM32CubeMX创建工程并加入Keil RTX操作系统

绪论

在学习FreeRTOS的时候,就了解到Keil有一个RTX操作系统,听说其配合Keil 的Event Recorder调试非常好用。它的中断延迟很低,关键还和FreeRTOS一样,免费的。
在网上找了一些资料之后,大都是直接使用Keil进行添加,于是结合官方资料和网上的资料,尝试在使用STM32CubeMX生成的工程中添加RXT操作系统。

STM32CubeMX配置部分

STM32CubeMX的配置和平时没有什么不同,主要有两个需要注意的地方,一个是Timebase Source的配置,这个是HAL库的基础时钟,默认是SysTick,但是操作系统默认使用这个时钟,所以需要将HAL库的基础时钟换为TIMER,这里我选择TIM2.
HAL库的时钟配置
然后是时钟树的配置,注意先选择外部高速时钟,设置频率,然后设置HCLK就会自动配置所有时钟。
时钟树配置
第二点需要注意的就是,点击NVIC配置,点击Code generation选择,将SVC, PendSV和SysTick这三个中断的Generate IRQ handler选项去掉,因为Keil的RTX系统要用到这三个中断。在这里插入图片描述
配置完成之后,就可以生成代码。接下来就是Keil需要配置的部分。

Keil配置部分

生成工程之后,点击 Manage Run-Time Environment 按钮,进行RTX和Event Recorder的配置。
加入RTX

  1. 展开CMSIS,勾选CORE,展开RTOS2,勾选Keil RTX5,后面强烈推荐采用源码方式,方面后面查看源码。
    勾选之后,可以看到下面有一个警告,这个我们忽略掉它,这个是STM32F4的启动代码,STM32CubeMX已经进了了配置,再次勾选就会冲突。
  2. RTX配置完成后,就配置Event Recorder,这是一个调试组件,配合上RTX简直是调试的利器。展开Compiler,勾选Event Recorder,我们调试的时候需要用到printf,所以将下面的STDOUT也勾选,然后后面选择EVR,将printf重定向到Event Recorder。
  3. 最后需要注意的各个组件的版本,推荐使用最新版本。

RTX和Event Recorder配置
完成之后需要对RTX进行一个配置,展开右侧的CMSIS,双击,RTX_Config.h,点击下面的Configuration Wizard按钮,给操作系统分配内存,在这里我一共分配了32*1024 一共32KB的内存。其它的默认即可。
RTX配置文件

代码部分

完成以上部分之后,还需要添加一些代码,来对RTX进行初始化,首先是添加头文件。
main函数配置
然后就是添加RTX的初始化函数,其中Thread_Init()为创建线程的函数,需要用户自己编写。其它函数看名字应该都知道是干嘛的。

  #ifdef RTE_Compiler_EventRecorder
    EventRecorderInitialize(EventRecordAll, 1);
  #endif    
  SystemCoreClockUpdate();
  osKernelInitialize();                
  Thread_Init();
	
  osKernelStart();  

main函数配置
这个文件是我们自己手动编写,我在此处使用的是CMSIS-RTOS C API v2

例程中一共创建了两个线程,分别是Thread1和Thread2.其中,Thread1的名字为Thread1,优先级为osPriorityLow3(比osPriorityLow4低),给它分配了256*4个Byte的堆栈。Thread2同理。

在两个线程中,首先添加了printf函数,打印任务运行情况,然后在while中添加了Event Recorder的时间测量函数,HAL库的延时函数(基于TIM2),这个延时不会被RTOS打断,以及RTOS的延时函数,会引起调度。

完成之后,编译,进行Debug,查看运行结果。

创建任务

工程测试

编译完成之后就可以进行测试,我使用的是DAP下载器,注意将Trace的时钟改为168,也就是系统系统内核时钟。
在这里插入图片描述
然后依次打开 Debug (printf)Viewer窗口。
在这里插入图片描述
Event Statistics窗口
在这里插入图片描述
以及RTX RTOS窗口。
在这里插入图片描述
最后点击RUN开始运行。
在这里插入图片描述

测试结果

进入Debug模式后,打开Debug (printf) Viewer 窗口,然后运行程序,可以看到,两个线程均已运行,而且由于Thread2的优先级高,所以它优先执行。
printf信息
然后就是Event Recorder调试组件,可以看到,在Event Recorder中,可以看到很多系统信息,包括系统的内存使用情况,每个任务的栈使用情况、优先级、运行状态、Flag等等,可以说调试起来非常方便。
RTX系统信息
再看看Event Recorder的时间测量,可以看到Event Recorder在传输数据过程中出现了一些错误,但是其时间测量还是比较准的。

Thread1的时间测量从开始到停止理论上一共消耗220ms,实测平均值221.58ms。
Thread2的时间测量从开始到停止理论上一共消耗110ms,实测平均值110.81ms。

Thread1的运行时间理论上为20ms,实测平均值23.738ms,阻塞理论上200ms,实测平均值201ms。
Thread2的运行时间理论上为10ms,实测平均值10.735ms,阻塞理论上100ms,实测平均值101.59ms。

可以看到,排除掉一些错误的数据,实际测量值符合理论值。
在这里插入图片描述

附录

整个工程

CSDN
自建的gits
每天早上9点到晚上23点59分开

测试软件版本

STM32CubeMX版本
STM32CubeMX版本
测试所用单片机为STM32F407ZGT6,固件包为1.25.0
STM32型号固件版本号
Keil版本为V5.29.0.0
Keil版本信息

posted @ 2022-04-19 19:47  san_si  阅读(1077)  评论(0编辑  收藏  举报