CMSIS-RTOS2 应用笔记 六 RTX 配置

xiaoxiao2021-02-28  152

CMSIS-RTOS RTX 配置

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

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

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

System ConfigurationThread ConfigurationTimer ConfigurationEvent Flags ConfigurationMutex ConfigurationSemaphore ConfigurationMemory Pool ConfigurationMessage Queue Configuration

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

RTX_Config.h: System Configuration Name #define DescriptionGlobal 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 DescriptionObject 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时,系统将从以下位置分配堆栈内存:

启用“对象特定内存分配”并且“默认堆栈大小的用户线程数”不为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 DescriptionObject 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 DescriptionObject 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 DescriptionObject 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 DescriptionObject 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 DescriptionObject 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 DescriptionObject 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中配置。 请参阅对象特定的内存池。

转载请注明原文地址: https://www.6miu.com/read-27813.html

最新回复(0)