RTX5 | 配置文件RTX_Config.h(一)

一、前言

使用RTX5开发项目之前,一定要先把RTX5系统配置文件RTX_Config.h弄明白。在学习RTX5的配置文件后,我认为RTX5的系统配置文件比FreeRTOS与ucosIII的系统配置文件都要简单。我在STM32F103与STM32H743都移植了RTX5,配置文件使用默认配置也能正常工作(FreeRTOS在移植后需要认真配置中断相关的配置,不然会让中断回调函数卡死整个RTOS系统)。在RTX5上都变得简单,System Configuration使用默认配置也能正常体验RTX5系统。
FreeRTOS | STM32H7串口中断调用FreeRTOS API,导致程序卡死

RTX_Congig.h包含以下内容:

  1. System Configuration(非常重要)
  2. Thread Configuration(非常重要)
  3. Timer Configuration(简单)
  4. Event Flags Configuration(简单)
  5. Mutex Configuration(简单)
  6. Semaphore Configuration(简单)
  7. Memory Pool Configuration(简单)
  8. Event Record Configuration(跟RTX5内核没关系,调试工具)
    在这里插入图片描述

二、System Configuration(系统设置)

在这里插入图片描述
以下摘自官方手册:

The system configuration covers system-wide settings for the global memory pool, tick frequency, ISR event buffer and round-robin thread switching.

总的来说,System Configuration用于配置内存池,滴答定时器的频率,中断回调函数ISR的事件Buffer,时间片轮转调度
在这里插入图片描述

2.1、Global Dynamic memory size(内存池的大小)

在这里插入图片描述
内存池的大小默认值是32768个字节,相当于32K的RAM内存。每一款单片机都有RAM内存,只是大小或数量不一样而已。以STM32F103为例子,在《STM32F10xx参考手册》上查到STM32F103的系统架构。从系统架构看来STM32F103只有一个SRAM,这个SRAM的大小62K。当RTX5的内存池大小是默认的32K时,表示RTX5将占用STM32F103上RAM内存的一半以上。此外,也可以通过Keil查看当前工程分配RAM的大小。
在这里插入图片描述
在这里插入图片描述

STM32H743属于Cortex-M7内核,拥有相当充裕的RAM内存。在STM32H743上运行RTX5系统,必须将内存池分配在128KB的DTCM(紧密耦合内存)上,因为CPU在DTCM内存读写数据的速度等于CPU的主频(480M),其他的SRAM内存读写数据的速度仅仅只有200M(当然,配置Cache后的读写速度也能提升至480M,但是操作比较麻烦)。在Keil上很方便将默认内存设置为128KB的DTCM(如下图所示),使用STM32CubeIDE的话,默认内存一开始就是128KB的DTCM了(就是不用管的意思)。
在这里插入图片描述
在这里插入图片描述

2.2、Kernel Tick Frequency[Hz](内核滴答时钟的频率)

在这里插入图片描述
摘自官方文档:

Defines base time unit for delays and timeouts in Hz. Default: 1000Hz = 1ms period

总的来说,就是提供时间基准给osDelay( )与osDelayUntil( ),还有超时计算。Kernel Tick Frequency频率越高就更占用CPU的资源,一般项目直接使用1000Hz即可。

2.3、Round-Robin Thread switching(时间片轮转调度)

在这里插入图片描述
摘自官方文档:

RTX5 may be configured to use round-robin multitasking thread switching. Round-robin allows quasi-parallel execution of several threads of the same priority. Threads are not really executed concurrently, but are scheduled where the available CPU time is divided into time slices and RTX5 assigns a time slice to each thread. Because the time slice is typically short (only a few milliseconds), it appears as though threads execute simultaneously.

总的来说,就是RTX5也提供时间片轮转调度的功能。有了这个功能后,系统就允许有两个以上的线程使用同一个优先级。为同一个优先级下的线程划分时间片进行调度,时间片的长度可以通过Round-Robin Timeout设置(5等于5个Tick)。关于时间片轮转调度的详细资料可以查看《安富莱_STM32-V7开发板ThreadX内核教程(V0.6)》第13章,还有《嵌入式实时操作系统uC/OS-III》第7.3章节。

时间片轮转调度适用于不要求任务实时响应的情况。我的实际项目都是工业控制机器人控制,对实时性都有要求。所以,一般我都会禁止时间片轮转调度功能,取消勾选Round-Robin Thread switching这个选项。我的项目都是使用抢占式的方式进行调度(各个线程的优先级不一样)。

2.4、ISR FIFO Queue(中断回调请求FIFO队列)

在这里插入图片描述
摘自官方文档:

The RTX functions (Calls from Interrupt Service Routines), when called from and interrupt handler, store the request type and optional parameter to the ISR FIFO queue buffer to be processed later, after the interrupt handler exits.
The scheduler is activated immediately after the IRQ handler has finished its execution to process the requests stored to the FIFO queue buffer. The required size of this buffer depends on the number of functions that are called within the interrupt handler. An insufficient queue size will be caught by osRtxErrorNotify with error code osRtxErrorISRQueueOverflow.

总的来说,RTX5能缓存Cortex-M内核的中断回调函数ISR的请求与参数。针对这个功能我是这样测试的,在串口中断回调函数里打了一个断点,让程序卡死在串口中断回调函数里。接着,继续通过串口助手往单片机发送字符,再一次触发串口中断回调函数。(相当于触发了两次串口中断,但CPU卡在第一次串口中断上,导致第二次串口中断无法正常执行)。
在这里插入图片描述
在这里插入图片描述

2.5、Object Memory usage counters(对象内存使用计数器)

摘自官方文档:

Object memory usage counters help to evaluate the maximum memory pool requirements for each object type, just like stack watermarking does for threads. The initial setup starts with a global memory pool for all object types. Consecutive runs of the application with object memory usage counters enabled, help to introduce object specific memory pools for each object type. Normally, this is required for applications that require a functional safety certification as global memory pools are not allowed in this case.

总得来说,就是在系统运行的过程中,计算线程,消息队列等对象的生存情况。上面英文的最后一句话很重要,中文意思:对于需要安全性认真的应用程序来说,这个功能是必需的。勾选这个选项后,通过DEBUG模式下的RTX RTOS调试窗口可以看到Object Memory Usage Counter选项。当前的程序只创建了4个线程与3个消息队列,在这个Counter上能看到。其中Start线程会在程序启动后的5S时间将线程退出,所以Free等于1了。
在这里插入图片描述

  • 4
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wallace Zhang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值