CMSIS-RTOS2 应用笔记 六 RTX 配置

CMSIS-RTOS RTX 配置


文件"RTX_Config.h"定义了CMSIS-RTOS RTX的配置参数,并且必须是使用CMSIS-RTOS RTX内核的每个项目的一部分。 文件"RTX_Config.c"包含可以适应应用程序需求的osRtxIdleThread和osRtxErrorNotify函数的存根。


配置文件使用配置向导注释。 根据开发工具,注释可能会导致更加用户友好的图形表示设置。 下面的屏幕截图是μVision配置向导视图的截图


配置选项在这些页面上进行说明



系统配置

系统配置涵盖全局内存池,滴答时钟频率,ISR事件缓冲区和循环线程切换的系统范围设置。

系统配置选项


RTX_Config.h: System Configuration
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 switchingOS_ROBIN_ENABLE启用循环线程切换。
Round-Robin TimeoutOS_ROBIN_TIMEOUT定义线程在线程切换之前执行多长时间。 默认值为5.值范围为1-1000。
ISR FIFO QueueOS_ISR_FIFO_QUEUERTOS从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提供了几个参数来配置线程管理功能。


线程配置选项


RTX_Config.h: Thread Configuration


Option #define Description
Object specific Memory allocationOS_THREAD_OBJ_MEM启用对象特定的内存分配。 请参阅对象特定的内存池。
Number of user ThreadsOS_THREAD_NUM定义可以同时处于活动状态的最大用户线程数。 适用于使用系统提供的控制块内存的用户线程。 默认值为1.值范围为1-1000。
Number of user Threads with default Stack sizeOS_THREAD_DEF_STACK_NUM定义具有默认堆栈大小的最大用户线程数,并适用于指定0堆栈大小的用户线程。 值范围为0-1000。
Total Stack size [bytes] for user Threads with user-provided Stack sizeOS_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 checkingOS_STACK_CHECK在线程切换启用堆栈溢出检查。
Stack usage watermarkOS_STACK_WATERMARK使用水印模式初始化线程堆栈,以分析堆栈使用情况。 启用此选项会大大增加线程创建的执行时间。
Processor mode for Thread executionOS_PRIVILEGE_MODE控制处理器模式。 默认值为特权模式。 价值范围是0 =无特权;  1 =特权模式。

线程数和堆栈空间的配置

RTX5内核为每个线程使用单独的堆栈空间,并提供了两种定义堆栈要求的方法:

  • 静态分配:当osThreadAttr_t  stack_mem和osThreadAttr_t  stack_size指定用于线程堆栈的内存区域时。
  • 动态分配:当osThreadAttr_t为NULL或osThreadAttr_t  stack_mem为NULL时,系统将从以下位置分配堆栈内存:

  1. 启用“对象特定内存分配”并且“默认堆栈大小的用户线程数”不为0且osThreadAttr_t  stack_size为0(或osThreadAttr_t为NULL)时,对象特定的内存池(默认堆栈大小)。
  2. 启用“对象特定内存分配”并且“用户...的总堆栈大小”不为0且osThreadAttr_t  stack_size不为0时,对象特定的内存池(用户提供的堆栈大小)。
  3. 当“对象特定内存分配”被禁用或(osThreadAttr_t  stack_size不为0,“用户...的总堆栈大小为0”)或(osThreadAttr_t  stack_size为0和“用户线程数为 默认堆栈大小“为0)。
  4. 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 allocationOS_TIMER_OBJ_MEM启用对象特定的内存分配。
Number of Timer objectsOS_TIMER_NUM定义可以同时处于活动状态的最大对象数。 适用于具有控制块的系统提供的存储器的对象。 值范围是1-1000。
Timer Thread PriorityOS_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 entriesOS_TIMER_CB_QUEUE并发活动定时器回调函数数。 不使用定时器时,可能设置为0。 默认值为4.值范围为0-256。

对象特定的内存分配

请参阅对象特定的内存池。



用户定时器线程

RTX5功能osRtxTimerThread在一段时间到期时执行回调函数。 完整RTOS系统中定时器子系统的优先级继承自osRtxTimerThread的优先级。 这由OS_TIMER_THREAD_PRIO配置。 回调函数的堆栈由osRtxTimerThread提供。  OS_TIMER_THREAD_STACK_SIZE必须满足具有最高堆栈使用率的回调函数的堆栈要求。



事件标志配置

RTX5提供了几个参数来配置事件标志功能。

事件配置选项


RTX_Config.h: Event Flags Configuration
Name #define Description
Object specific Memory allocationOS_EVFLAGS_OBJ_MEM启用对象特定的内存分配。 请参阅对象特定的内存池。
Number of Event Flags objectsOS_EVFLAGS_NUM定义可以同时处于活动状态的最大对象数。 适用于具有控制块的系统提供的存储器的对象。 值范围是1-1000。

对象特定的内存分配

当使用特定于对象的内存时,所有Event对象的池大小由OS_EVFLAGS_NUM指定。 请参阅对象特定的内 存池。



互斥配置



RTX5提供了几个参数来配置互斥管理功能。

互斥配置选项


RTX_Config.h: Mutex Configuration

Name #define Description
Object specific Memory allocationOS_MUTEX_OBJ_MEM启用对象特定的内存分配。 请参阅对象特定的内存池。
Number of Mutex objectsOS_MUTEX_NUM定义可以同时处于活动状态的最大对象数。 适用于具有控制块的系统提供的存储器的对象。 值范围是1-1000。

对象特定的内存分配
当使用特定于对象的内存时,所有Mutex对象的池大小由OS_MUTEX_NUM指定。 请参阅对象特定的内存池。


信号量配置

RTX5提供了几个参数来配置信号量功能。

信号量配置选项


RTX_Config.h: Semaphore Configuration
Name #define Description
Object specific Memory allocationOS_SEMAPHORE_OBJ_MEM启用对象特定的内存分配。 请参阅对象特定的内存池。
Number of Semaphore objectsOS_SEMAPHORE_NUM定义可以同时处于活动状态的最大对象数。 适用于具有控制块的系统提供的存储器的对象。 值范围是1-1000。

对象特定的内存分配
当使用对象特定内存时,所有信号量对象的池大小由OS_SEMAPHORE_NUM指定。 请参阅对象特定的内存池。


内存池配置

RTX5提供了几个参数来配置内存池功能。

内存池配置选项


RTX_Config.h: Memory Pool Configuration
Name #define Description
Object specific Memory allocationOS_MEMPOOL_OBJ_MEM启用对象特定的内存分配。 请参阅对象特定的内存池。
Number of Memory Pool objectsOS_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配置选项


RTX_Config.h: Message Queue Configuration
Name #define Description
Object specificMemory allocationOS_MSGQUEUE_OBJ_MEM启用对象特定的内存分配。 请参阅对象特定的内存池。
Number of Message Queue objectsOS_MSGQUEUE_NUM定义可以同时处于活动状态的最大对象数。 适用于具有控制块的系统提供的存储器的对象。 值范围是1-1000。
Data Storage Memory size [bytes]OS_MSGQUEUE_DATA_SIZE定义组合的数据存储内存大小。 适用于具有系统提供的存储器用于数据存储的对象。 默认值为0.值范围为0-1073741824,为8的倍数。

对象特定的内存分配
当使用对象特定内存时,所有消息队列对象的队列数由OS_MSGQUEUE_NUM指定。 为所有队列保留的总存储大小在OS_MSGQUEUE_DATA_SIZE中配置。 请参阅对象特定的内存池。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值