RTX_Congig.h包含以下内容:
System Configuration(非常重要)
Thread Configuration(非常重要)
Timer Configuration(简单)
Event Flags Configuration(简单)
Mutex Configuration(简单)
Semaphore Configuration(简单)
Memory Pool Configuration(简单)
Event Record Configuration(跟RTX5内核没关系,调试工具)
1、System Configuration配置:
此项用于配置线程内存池,滴答定时器频率,中断回调函数ISR事件buffer,时间片轮转调度;
ISR FIFO Queue:针对这个功能我是这样测试的,在串口中断回调函数里打了一个断点,让程序卡死在串口中断回调函数里。接着,继续通过串口助手往单片机发送字符,再一次触发串口中断回调函数。(相当于触发了两次串口中断,但CPU卡在第一次串口中断上,导致第二次串口中断无法正常执行)。
2、Thread Configuration配置:
2.1、Object specific Memory allocation为每一个RTX5的对象创建一个专用的固定大小的内存块,可以有效防止内存碎片化,并简化内存不足情况的处理。并且,在专用的内存里创建对象与删除对象的时间都是完全确定的。
2.2、默认的配置下,不勾选Object Specific Memory allocation。此时,当我们创建RTX5的对象时,会在全局内存池里申请一段内存。有线程对象,有消息队列对象,有信号量对象等等,按申请内存的时间顺序一个个放入Global Memory Pool(全局内存池)里。这种情况下,内存肯定会有一点乱。
2.3、Object Memory usage counters(对象内存使用计数器)总得来说,就是在系统运行的过程中,计算线程,消息队列等对象的生存情况。上面英文的最后一句话很重要,中文意思:对于需要安全性认真的应用程序来说,这个功能是必需的。勾选这个选项后,通过DEBUG模式下的RTX RTOS调试窗口可以看到Object Memory Usage Counter选项。
2.4、Stack overrun checking (堆栈溢出检查):一定要勾选,堆栈真的很容易溢出;
2.5、Stack usage watermark(堆栈使用水印)使用水印模式初始化线程堆栈以分析堆栈使用情况。 启用此选项会显着增加线程创建的执行时间。我觉得没必要勾选这一项,在DEBUG模式下,使用Keil的RTX RTOS也能看到堆栈的使用情况;
2.6、Processor mode for Thread execution(线程执行的处理器模式):必须使用privileged mode,不然功能可能会受到限制:
3、软件定时器配置:
代码中没用到这里不做解释
4、其他RTX5对象配置:
剩下的消息队列设置,互斥量设置,信号量设置,内存池设置,消息队列设置,都只有一个Object specific Memory allocation了。跟线程的Object specific Memory allocation一样,这里都不做配置
5、工作中踩过的坑:
5.1、STM32H743上运行RTX5系统,必须将内存池分配在128KB的DTCM(紧密耦合内存)上,因为CPU在DTCM内存读写数据的速度等于CPU的主频(480M),其他的SRAM内存读写数据的速度仅仅只有200M(当然,配置Cache后的读写速度也能提升至480M,但是操作比较麻烦)。在Keil上很方便将默认内存设置为128KB的DTCM(如下图所示),使用STM32CubeIDE的话,默认内存一开始就是128KB的DTCM了(就是不用管的意思)。
5.2、所有配置中的Object Specific Memory allocation都不需要配置,因为咱们用的都是Global Memory Pool(全局内存池);
5.3、Thread TrustZone Module Identifier(线程信任区域模块标识符),因为Armv8-M/v8.1-M架构的单片机才有,特定的Cortex-M内核才有,STM32F407与STM32H743与STM32F103都没有这个功能。。