CMSIS-RTOS RTX 配置
文件"RTX_Config.h"定义了CMSIS-RTOS RTX的配置参数,并且必须是使用CMSIS-RTOS RTX内核的每个项目的一部分。 文件"RTX_Config.c"包含可以适应应用程序需求的osRtxIdleThread和osRtxErrorNotify函数的存根。
配置文件使用配置向导注释。 根据开发工具,注释可能会导致更加用户友好的图形表示设置。 下面的屏幕截图是μVision配置向导视图的截图
配置选项在这些页面上进行说明
- System Configuration
- Thread Configuration
- Timer Configuration
- Event Flags Configuration
- Mutex Configuration
- Semaphore Configuration
- Memory Pool Configuration
- Message Queue Configuration
系统配置涵盖全局内存池,滴答时钟频率,ISR事件缓冲区和循环线程切换的系统范围设置。
系统配置选项
Name | #define | Description |
---|---|---|
Global Dynamic Memory size [bytes] | OS_DYNAMIC_MEM_SIZE | 定义全局内存池的全局动态内存大小。 默认值为4096.值范围为0-1073741824字节,为8字节的倍数。 |
Kernel Tick Frequency (Hz) | OS_TICK_FREQ | 以Hz为单位定义延迟和超时的基准时间单位。 默认值:1000Hz = 1ms周期。 |
Round-Robin Thread switching | OS_ROBIN_ENABLE | 启用循环线程切换。 |
Round-Robin Timeout | OS_ROBIN_TIMEOUT | 定义线程在线程切换之前执行多长时间。 默认值为5.值范围为1-1000。 |
ISR FIFO Queue | OS_ISR_FIFO_QUEUE | RTOS从ISR调用的函数将请求存储到此缓冲区。 默认值为16个条目。 值范围是4的倍数4-256项。 |
全局动态内存
请参阅全局内存池。
循环线程切换
RTX5可以配置为使用循环多任务线程切换。 循环允许并行执行相同优先级的几个线程。 线程并不是真正执行,而是被安排在可用的CPU时间被分成时间片,并且RTX5为每个线程分配一个时间片。 因为时间片通常很短(只有几毫秒),所以似乎线程同时执行。
循环线程切换功能如下:
- 当线程切换发生时,刻度线将被预加载超时值
- 如果同一个线程仍在执行,则每个系统的tick会递减(如果不是零)
- 当刻度达到0时,表示发生超时。 如果有另一个线程准备好相同的优先级,那么系统切换到该线程,并且tick再次预先加载超时。
- 换句话说,线程在其时间片段的持续时间内执行(除非线程的时间片被放弃)。 然后,RTX切换到处于READY状态并且具有相同优先级的下一个线程。 如果没有其他具有相同优先级的线程准备运行,当前正在运行的线程将恢复执行。
注意
- 切换到较高优先级的线程时,重置循环超时值。
- Round-Robin多任务通过#define OS_ROBIN_ENABLE来控制。 在#define OS_ROBIN_TIMEOUT中配置时间片周期(RTX定时器时钟)。
ISR FIFO队列
RTX函数(来自中断服务例程的调用)当从中断处理程序调用时,将请求类型和可选参数存储到ISR FIFO队列缓冲区中,以便稍后处理中断处理程序退出后处理。
IRQ处理程序完成执行后立即激活调度程序,以处理存储到FIFO队列缓冲区的请求。 此缓冲区所需的大小取决于在中断处理程序中调用的函数数。 osRtxErrorNotify将捕获不足的队列大小,错误代码为osRtxErrorISRQueueOverflow。
线程配置
RTX5提供了几个参数来配置线程管理功能。
线程配置选项
Option | #define | Description |
---|---|---|
Object specific Memory allocation | OS_THREAD_OBJ_MEM | 启用对象特定的内存分配。 请参阅对象特定的内存池。 |
Number of user Threads | OS_THREAD_NUM | 定义可以同时处于活动状态的最大用户线程数。 适用于使用系统提供的控制块内存的用户线程。 默认值为1.值范围为1-1000。 |
Number of user Threads with default Stack size | OS_THREAD_DEF_STACK_NUM | 定义具有默认堆栈大小的最大用户线程数,并适用于指定0堆栈大小的用户线程。 值范围为0-1000。 |
Total Stack size [bytes] for user Threads with user-provided Stack size | OS_THREAD_USER_STACK_SIZE | 使用用户提供的堆栈大小定义用户线程的组合堆栈大小。 默认值为0.值范围为0-1073741824字节,以8的倍数。 |
Default Thread Stack size [bytes] | OS_STACK_SIZE | 为指定零堆栈大小的线程定义堆栈大小。 默认值为200.值范围是96-1073741824字节,以8的倍数。 |
Idle Thread Stack size [bytes] | OS_IDLE_THREAD_STACK_SIZE | 定义空闲线程的堆栈大小。 默认值为200.值范围是72-1073741824个字节,以8的倍数。 |
Stack overrun checking | OS_STACK_CHECK | 在线程切换启用堆栈溢出检查。 |
Stack usage watermark | OS_STACK_WATERMARK | 使用水印模式初始化线程堆栈,以分析堆栈使用情况。 启用此选项会大大增加线程创建的执行时间。 |
Processor mode for Thread execution | OS_PRIVILEGE_MODE | 控制处理器模式。 默认值为特权模式。 价值范围是0 =无特权; 1 =特权模式。 |
线程数和堆栈空间的配置
RTX5内核为每个线程使用单独的堆栈空间,并提供了两种定义堆栈要求的方法:
- 静态分配:当osThreadAttr_t stack_mem和osThreadAttr_t stack_size指定用于线程堆栈的内存区域时。
- 动态分配:当osThreadAttr_t为NULL或osThreadAttr_t stack_mem为NULL时,系统将从以下位置分配堆栈内存:
- 启用“对象特定内存分配”并且“默认堆栈大小的用户线程数”不为0且osThreadAttr_t stack_size为0(或osThreadAttr_t为NULL)时,对象特定的内存池(默认堆栈大小)。
- 启用“对象特定内存分配”并且“用户...的总堆栈大小”不为0且osThreadAttr_t stack_size不为0时,对象特定的内存池(用户提供的堆栈大小)。
- 当“对象特定内存分配”被禁用或(osThreadAttr_t stack_size不为0,“用户...的总堆栈大小为0”)或(osThreadAttr_t stack_size为0和“用户线程数为 默认堆栈大小“为0)。
- osThreadAttr_t是osThreadNew函数的参数。
注意
在使用osKernelStart()函数启动RTX内核之前,将使用在startup_device.s中定义的主栈。 主堆栈也用于:
- 使用SVC调用在线程模式下的用户应用程序调用RTX功能
- 中断/异常处理程序。
堆栈溢出检查
RTX5实现了一个软件堆栈溢出检查,捕获堆栈超限。 堆栈用于返回地址和自动变量。 广泛使用或不正确的堆栈配置可能会导致堆栈溢出。 软件堆栈溢出检查通过定义OS_STACK_CHECK进行控制。
如果检测到堆栈溢出,则调用带有错误代码osRtxErrorStackUnderflow的函数osRtxErrorNotify。 默认情况下,该函数实现为无限循环,几乎可以停止代码执行。
堆叠使用水印
创建线程时,RTX5会使用水印模式(0xCC)初始化线程堆栈。 这允许调试器确定每个线程的最大堆栈使用量。 它通常在开发期间使用,但从最终应用程序中删除。 堆栈使用水印通过定义的OS_STACK_WATERMARK进行控制。
启用此选项会显着增加osThreadNew的执行时间(取决于线程堆栈大小)。
线程执行的处理器模式
RTX5允许以非特权或特权的处理器模式执行线程。 处理器模式由定义OS_PRIVILEGE_MODE控制。
在无特权的处理器模式下,应用软件:
- 对MSR和MRS指令的访问受限,不能使用CPS指令。
- 无法访问系统定时器,NVIC或系统控制块。
- 可能会限制对内存或外设的访问。
- 在特权处理器模式下,应用软件可以使用所有的指令,并可以访问所有的资源。
定时器配置
RTX5提供了几个参数来配置定时器管理功能。
定时器配置选项
RTX_Config.h: Timer Configuration
Name | #define | Description |
---|---|---|
Object specific Memory allocation | OS_TIMER_OBJ_MEM | 启用对象特定的内存分配。 |
Number of Timer objects | OS_TIMER_NUM | 定义可以同时处于活动状态的最大对象数。 适用于具有控制块的系统提供的存储器的对象。 值范围是1-1000。 |
Timer Thread Priority | OS_TIMER_THREAD_PRIO | 定义线程的优先级。 数值范围为8-48,以8的倍数表示。数字具有以下优先级相关:8 =低; 16 =低于正常值 24 =正常; 32 =正常以上 40 =高; 48 =实时 |
Timer Thread Stack size [bytes] | OS_TIMER_THREAD_STACK_SIZE | 定义定时器线程的堆栈大小。 不使用定时器时,可能设置为0。 默认值为200.值范围为0-1073741824,为8的倍数。 |
Timer Callback Queue entries | OS_TIMER_CB_QUEUE | 并发活动定时器回调函数数。 不使用定时器时,可能设置为0。 默认值为4.值范围为0-256。 |
对象特定的内存分配
请参阅对象特定的内存池。
用户定时器线程
RTX5功能osRtxTimerThread在一段时间到期时执行回调函数。 完整RTOS系统中定时器子系统的优先级继承自osRtxTimerThread的优先级。 这由OS_TIMER_THREAD_PRIO配置。 回调函数的堆栈由osRtxTimerThread提供。 OS_TIMER_THREAD_STACK_SIZE必须满足具有最高堆栈使用率的回调函数的堆栈要求。
事件标志配置
RTX5提供了几个参数来配置事件标志功能。
事件配置选项
Name | #define | Description |
---|---|---|
Object specific Memory allocation | OS_EVFLAGS_OBJ_MEM | 启用对象特定的内存分配。 请参阅对象特定的内存池。 |
Number of Event Flags objects | OS_EVFLAGS_NUM | 定义可以同时处于活动状态的最大对象数。 适用于具有控制块的系统提供的存储器的对象。 值范围是1-1000。 |
对象特定的内存分配
当使用特定于对象的内存时,所有Event对象的池大小由OS_EVFLAGS_NUM指定。 请参阅对象特定的内 存池。
互斥配置
RTX5提供了几个参数来配置互斥管理功能。
互斥配置选项
RTX_Config.h: Mutex Configuration
Name | #define | Description |
---|---|---|
Object specific Memory allocation | OS_MUTEX_OBJ_MEM | 启用对象特定的内存分配。 请参阅对象特定的内存池。 |
Number of Mutex objects | OS_MUTEX_NUM | 定义可以同时处于活动状态的最大对象数。 适用于具有控制块的系统提供的存储器的对象。 值范围是1-1000。 |
对象特定的内存分配
当使用特定于对象的内存时,所有Mutex对象的池大小由OS_MUTEX_NUM指定。 请参阅对象特定的内存池。
信号量配置
RTX5提供了几个参数来配置信号量功能。
信号量配置选项
Name | #define | Description |
---|---|---|
Object specific Memory allocation | OS_SEMAPHORE_OBJ_MEM | 启用对象特定的内存分配。 请参阅对象特定的内存池。 |
Number of Semaphore objects | OS_SEMAPHORE_NUM | 定义可以同时处于活动状态的最大对象数。 适用于具有控制块的系统提供的存储器的对象。 值范围是1-1000。 |
对象特定的内存分配
当使用对象特定内存时,所有信号量对象的池大小由OS_SEMAPHORE_NUM指定。 请参阅对象特定的内存池。
内存池配置
RTX5提供了几个参数来配置内存池功能。
内存池配置选项
Name | #define | Description |
---|---|---|
Object specific Memory allocation | OS_MEMPOOL_OBJ_MEM | 启用对象特定的内存分配。 请参阅对象特定的内存池。 |
Number of Memory Pool objects | OS_MEMPOOL_NUM | 定义可以同时处于活动状态的最大对象数。 适用于具有控制块的系统提供的存储器的对象。 值范围是1-1000。 |
Data Storage Memory size [bytes] | OS_MEMPOOL_DATA_SIZE | 定义组合的数据存储内存大小。 适用于具有系统提供的存储器用于数据存储的对象。 默认值为0.值范围为0-1073741824,为8的倍数。 |
对象特定的内存分配
当使用特定于对象的内存时,所有MemoryPool对象的池数由OS_MEMPOOL_NUM指定。 为所有池保留的总存储空间大小在OS_MEMPOOL_DATA_SIZE中配置。 请参阅对象特定的内存池。
消息队列配置
RTX5提供了几个参数来配置消息队列功能。
MessageQueue配置选项
Name | #define | Description |
---|---|---|
Object specificMemory allocation | OS_MSGQUEUE_OBJ_MEM | 启用对象特定的内存分配。 请参阅对象特定的内存池。 |
Number of Message Queue objects | OS_MSGQUEUE_NUM | 定义可以同时处于活动状态的最大对象数。 适用于具有控制块的系统提供的存储器的对象。 值范围是1-1000。 |
Data Storage Memory size [bytes] | OS_MSGQUEUE_DATA_SIZE | 定义组合的数据存储内存大小。 适用于具有系统提供的存储器用于数据存储的对象。 默认值为0.值范围为0-1073741824,为8的倍数。 |
对象特定的内存分配
当使用对象特定内存时,所有消息队列对象的队列数由OS_MSGQUEUE_NUM指定。 为所有队列保留的总存储大小在OS_MSGQUEUE_DATA_SIZE中配置。 请参阅对象特定的内存池。