cmsis mail msg和msgbox的区别的区别

记录学习和工作~
CMSIS-RTOS2 文档翻译 之 参考(CMSIS-RTOS2 API 之 消息队列)
在类似 FIFO 的操作中交换线程之间的消息。更多...struct
消息队列的属性结构体。更多...
(uint32_t msg_count, uint32_t msg_size, const
*attr) 创建并初始化消息队列对象。更多... const char *
( mq_id) 获取消息队列对象的名称。更多...
( mq_id, const void *msg_ptr, uint8_t msg_prio, uint32_t timeout) 如果队列已满,请将消息放入队列或超时。更多...
( mq_id, void *msg_ptr, uint8_t *msg_prio, uint32_t timeout) 如果队列为空,则从队列获取消息或超时。更多... uint32_t
( mq_id) 在消息队列中获取最大数量的消息。更多... uint32_t
( mq_id) 获取内存池中的最大消息大小。更多... uint32_t
( mq_id) 获取消息队列中排队的消息数量。更多... uint32_t
( mq_id) 获取消息队列中消息的可用插槽数量。更多...
( mq_id) 将消息队列重置为初始空状态。更多...
( mq_id) 删除一个消息队列对象。更多... 消息传递是线程之间的另一种基本通信模型。在消息传递模型中,一个线程显式地发送数据,而另一个线程接收它。该操作更像是某种 I/O ,而不是直接访问要共享的信息。在 CMSIS-RTOS 中,这种机制被称为消息队列。数据通过类似 FIFO 的操作从一个线程传递到另一个线程。使用消息队列功能,您可以控制,发送,接收或等待消息。要传递的数据可以是整数或指针类型:CMSIS-RTOS 消息队列 与内存池相比,消息队列通常效率较低,但解决了更广泛的问题。有时,线程没有共同的地址空间,或者共享内存的使用引发了诸如互斥等问题。注意可以从中断服务例程调用osMessageQueuePut,osMessageQueueGet,osMessageQueueGetCapacity,osMessageQueueGetMsgSize,osMessageQueueGetCount,osMessageQueueGetSpace 函数。有关 RTX5 配置选项,请参阅消息队列配置。
struct osMessageQueueAttr_t
用于配置消息队列的属性。有关使用的详细信息,请参阅内存管理 数据字段const char *name消息队列的名称指向具有人类可读名称的消息队列对象的字符串。默认值:NULL 。uint32_tattr_bits属性位保留以供将来使用(设为 '0')。默认值:0 。void *cb_mem内存控制块指向消息队列控制块对象的内存位置。这可以选择用于定制内存管理系统。默认值:NULL(使用内核内存管理)。uint32_tcb_size为控制块提供的内存大小内存块的大小与 cb_mem 一起传递。必须是消息队列控制块对象的大小或更大。void *mq_mem内存数据存储指向消息队列对象数据的内存位置。默认值:NULL 。uint32_tmq_size为数据存储提供的内存大小通过 mq_mem 传递的内存大小。
osMessageQueueNew
msg_count,
[in]msg_count队列中消息的最大数量。[in]msg_size最大消息大小以字节为单位[in]attr消息队列属性; NULL:默认值。返回消息队列 ID 以供其他功能参考,或者在发生错误时为 NULL 。函数 osMessageQueueNew 创建并初始化消息队列对象,并返回指向消息队列对象标识符的指针,或者在发生错误时返回 NULL 。它可以在 RTOS 启动之前(调用 osKernelStart)安全地调用,但不能在它初始化之前(调用 osKernelInitialize)调用。注意该函数不能从中断服务程序调用。代码示例请参阅 osMessageQueuePut
const char * osMessageQueueGetName
[in]mq_id消息队列 ID 由 osMessageQueueNew 获取。返回名称为 NULL 终止的字符串。osMessageQueueGetName 函数返回指向由参数 mq_id 标识的消息队列的名称字符串的指针,或者在发生错误时返回 NULL 。注意该函数不能从中断服务程序调用。 osMessageQueuePut
const void *
[in]mq_id消息队列 ID 由 osMessageQueueNew 获取。[in]msg_ptr指向具有消息的缓冲区以放入队列。[in]msg_prio消息优先级。[in]timeout超时值或 0 在没有超时的情况下。返回状态代码,指示该功能的执行状态。阻塞函数 osMessageQueuePut 将 msg_ptr 指向的消息放入由参数 mq_id 指定的消息队列中。参数 msg_prio 用于根据插入的优先级对消息进行排序(较高的数字表示较高的优先级)。参数超时指定系统等待将消息放入队列的时间。系统等待时,调用此函数的线程将进入 BLOCKED 状态。参数超时可以有以下值:当超时为 0 时,函数立即返回(即尝试语义)。当超时设置为 osWaitForever 时,该函数将等待无限的时间直到消息被传递(即等待语义)。所有其他值都指定了内核中的超时时间(即定时等待语义)。可能的 osStatus_t 返回值:osOK: 该消息已被放入队列中。osErrorTimeout: 在给定时间内消息不能被放入队列(等待时间语义)。osErrorResource: 队列中没有足够的空间(尝试语义)。osErrorParameter: 参数 mq_id 不正确,在 ISR 中指定的非零超时。注意如果参数 timeout 设置为 0,可以从中断服务例程调用。代码示例: #include ""
void Thread_MsgQueue1 (void *argument);
void Thread_MsgQueue2 (void *argument);
tid_Thread_MsgQueue1;
tid_Thread_MsgQueue2;
#define MSGQUEUE_OBJECTS
// number of Message Queue Objects typedef struct {
uint8_t Buf[32];
uint8_t I} MSGQUEUE_OBJ_t;
int Init_MsgQueue (void) {
mid_MsgQueue = (MSGQUEUE_OBJECTS, sizeof(MSGQUEUE_OBJ_t), NULL);
if (!mid_MsgQueue) {
tid_Thread_MsgQueue1 =
(Thread_MsgQueue1, NULL, NULL);
if (!tid_Thread_MsgQueue1) return(-1);
tid_Thread_MsgQueue2 =
(Thread_MsgQueue2, NULL, NULL);
if (!tid_Thread_MsgQueue2) return(-1);
return(0);} void Thread_MsgQueue1 (void *argument) {
MSGQUEUE_OBJ_
while (1) {
msg.Buf[0] = 0x55;
(mid_MsgQueue, &msg, 0, NULL);
}} void Thread_MsgQueue2 (void *argument) {
MSGQUEUE_OBJ_
while (1) {
(mid_MsgQueue, &msg, NULL, NULL);
if (status == ) {
osMessageQueueGet
[in]mq_id消息队列 ID 由 osMessageQueueNew 获取。[out]msg_ptr指向缓冲区的消息以从队列中获取消息。[out]msg_prio指向缓冲区的消息优先级或 NULL 。[in]timeout超时值或 0 在没有超时的情况下。返回状态代码,指示该功能的执行状态。osMessageQueueGet 函数从参数 mq_id 指定的消息队列中检索消息,并将其保存到参数 msg_ptr 所指向的缓冲区中。如果不是令牌{NULL},则消息优先级存储到参数 msg_prio 。参数 timeout 指定系统等待从队列中检索消息的时间。系统等待时,调用此函数的线程将进入 BLOCKED 状态。参数超时可以有以下值:当超时为 0 时,函数立即返回(即尝试语义)。当超时设置为 osWaitForever 时,该函数将等待无限时间,直到检索到消息(即等待语义)。所有其他值都指定了内核中的超时时间(即定时等待语义)。可能的 osStatus_t 返回值:osOK: 该消息已从队列中检索出来。osErrorTimeout: 在给定时间内无法从队列中检索消息(定时等待语义)。osErrorResource: 没有什么可以从队列中获得(尝试语义)。osErrorParameter: 参数 mq_id 不正确,在 ISR 中指定的非零超时。注意如果参数 timeout 设置为 0 ,可以从中断服务例程调用。代码示例请参阅 osMessageQueuePut
uint32_t osMessageQueueGetCapacity
[in]mq_id消息队列 ID 由 osMessageQueueNew 获取。返回消息的最大数量。函数 osMessageQueueGetCapacity 返回消息队列对象中由参数 mq_id 或 0 指定的最大消息数量,以防出现错误。注意这个函数可以从中断服务程序中调用。uint32_t osMessageQueueGetMsgSize
[in]mq_id消息队列 ID 由 osMessageQueueNew 获取。返回最大消息大小以字节为单位函数 osMessageQueueGetMsgSize 返回由参数 mq_id 指定的消息队列对象的最大消息大小(以字节为单位)或在出现错误时返回 0 。注意这个函数可以从中断服务程序中调用。
uint32_t osMessageQueueGetCount
[in]mq_id消息队列 ID 由 osMessageQueueNew 获取。返回排队的消息数量。函数 osMessageQueueGetCount 返回由参数 mq_id 或 0 指定的消息队列对象中排队的消息数量,以防出现错误。注意这个函数可以从中断服务程序中调用。
uint32_t osMessageQueueGetSpace
[in]mq_id消息队列 ID 由 osMessageQueueNew 获取。返回消息的可用插槽数量。函数 osMessageQueueGetSpace 返回由参数 mq_id 指定的消息队列对象中的消息的可用槽数量,如果发生错误,则返回 0 。注意这个函数可以从中断服务程序中调用。 osMessageQueueReset
[in]mq_id消息队列 ID 由 osMessageQueueNew 获取。返回状态代码,指示该函数的执行状态。函数 osMessageQueueReset 重置由参数 mq_id 指定的消息队列。可能的 osStatus_t 返回值:osOK: 消息队列已被重置。osErrorParameter: 参数 mq_id 是 NULL 或无效。osErrorResource: 由参数 mq_id 指定的消息队列处于无效消息队列状态。osErrorISR: osMessageQueueReset 不能从中断服务例程调用。注意该函数不能从中断服务程序调用。
osMessageQueueDelete
[in]mq_id消息队列 ID 由 osMessageQueueNew 获取。返回状态代码,指示该函数的执行状态。osMessageQueueDelete 函数删除由参数 mq_id 指定的消息队列对象。它释放为消息队列处理而获得的内部内存。在这个调用之后,mq_id 不再有效并且不能使用。消息队列可以使用函数 osMessageQueueNew 再次创建。可能的 osStatus_t 返回值:osOK: 消息队列对象已被删除。osErrorParameter: 参数 mq_id 是 NULL 或无效。osErrorResource: 由参数 mq_id 指定的消息队列处于无效消息队列状态。osErrorISR: osMessageQueueDelete 不能从中断服务例程调用。注意该函数不能从中断服务程序调用。
没有更多推荐了,记录学习和工作~
CMSIS-RTOS2 文档翻译 之 RTX v5 实现(操作理论)
内核的许多方面都是可配置的,并在适用的情况下提及配置选项。系统启动由于 main 不再是一个线程,RTX5 在到达 main 之前不会干扰系统启动。一旦执行到达 main(),建议初始化硬件并启动内核。这也反映在随 RTX5 组件提供的用户代码模板文件 “CMSIS-RTOS2” 主 “功能” 中。你的应用程序的 main()应该按给定的顺序至少实现以下内容:硬件的初始化和配置,包括外设,存储器,引脚,时钟和中断系统。使用相应的 CMSIS-Core(Cortex-M)或 CMSIS-Core(Cortex-A)功能更新系统内核时钟。使用 osKernelInitialize 初始化 CMSIS-RTOS 内核。或者,创建一个新线程 app_main,该线程将作为使用 osThreadNew 的主线程使用。或者,可以直接在 main()中创建线程。使用 osKernelStart 启动 RTOS 调度程序。如果执行成功,该函数不会返回。除非 osKernelStart 失败,否则 osKernelStart 之后的任何应用程序代码都不会执行。注意内核使用的中断(如 SVC)在 osKernelInitialize 中初始化。如果在上述顺序之后 NVIC 中的优先级和分组被更改,则可能需要再次调用osKernelInitialize。您可能会观察到可能由 osRtxErrorNotify 捕获或导致硬故障的奇怪的不当行为。滴答定时器在 osKernelStart 期间配置。滴答间隔是基于 SystemCoreClock 变量计算的。调度RTX5 实现了一个低延迟预先调度器。RTX5 的主要部分在处理器模式下执行,例如 用于基于时间的调度。 用于基于锁的调度。 用于基于中断的调度。为了在 ISR 执行方面具有低延迟,这些系统例外被配置为使用可用的最低优先级组。优先级被配置为使得它们之间不发生抢占。因此,不需要中断关键部分(即中断锁)来保护调度器。线程调度和中断执行调度程序结合了基于优先级和循环的上下文切换。上图中描述的示例包含四个线程(1, 2, 3 和 4)。 线程 1 和 2 共享相同的优先级,线程 3 具有较高的优先级,线程 4 最高(osThreadAttr_t :: priority)。只要线程 3 和 4 被阻塞,调度程序就会按时间片(循环)在线程 1 和线程 2 之间切换。可以配置循环调度的时间片,请参阅系统配置中的循环超时。线程 2 在时间索引 2 时通过任意 RTOS 调用(在 SVC 处理程序模式下执行)解除对线程 3 的阻塞。由于线程 3 具有高优先级,因此调度程序立即切换到线程 3。线程 4 仍然被阻塞。在索引 4 时间发生中断(ISR)并抢占 SysTick_Handler 。 RTX 不会为中断服务执行添加任何延迟。ISR 例程使用解除线程 4 的RTOS调用,而不是立即切换到线程 4,PendSV 标志被设置为推迟上下文切换。PendSV_Handler 在 SysTick_Handler 返回之后立即执行,并且将被拒绝的上下文切换到线程 4。一旦最高优先级线程 4 通过使用阻塞 RTOS 调用执行再次阻塞,在时间索引 5 期间立即切换回线程 3 。在索引 5 时,线程 3 也使用阻塞 RTOS 调用。因此,调度程序切换回线程 2 以获得时间索引 6 。在索引 7 时,调度程序使用循环机制切换到线程1,依此类推。内存分配RTX5 对象(线程,互斥锁,信号量,定时器,消息队列,线程和事件标志以及内存池)需要专用的 RAM 存储器。可以使用 osObjectNew()调用创建对象,并使用 osObjectDelete()调用删除对象。相关的对象内存需要在对象的生命周期中可用。RTX5 为对象提供了三种不同的内存分配方法:为所有对象使用单个全局内存池。它很容易配置,但是当创建并销毁具有不同大小的对象时,可能存在内存碎片的缺点。为每个对象类型使用固定大小的内存池。该方法是时间确定性的,避免了内存碎片。在编译期间保留内存并完全避免系统可能内存不足。这对于一些安全关键系统通常是必需的。有可能在同一个应用程序中混合所有内存分配方法。全局内存池全局内存池分配内存区域中的所有对象。这种内存分配方法是 RTX5 的默认配置设置。全局内存池用于所有对象 当内存池没有提供足够的内存时,对象的创建失败,并且相关的 osObjectNew()函数返回 NULL 。在系统配置中启用。特定于对象的内存池特定于对象的内存池可避免内存碎片,并为每种对象类型提供专用固定大小的内存管理。这种类型的内存池是完全时间确定性的,这意味着对象创建和销毁总是需要相同的固定时间。由于固定大小的内存池是特定于对象类型的,因此可以简化对内存不足情况的处理。每个对象类型一个内存池 特定于对象的内存池可针对每种对象类型启用,例如:使用 RTX 配置文件的互斥锁或线程:在线程对象的线程配置中启用。在定时器对象的定时器配置中启用。在事件标志配置中为事件对象启用。在互斥对象的互斥体配置中启用。在信号量的信号量配置中启用。在内存池的内存池配置中启用。在消息队列的消息队列配置中启用。当内存池没有提供足够的内存时,对象的创建失败,并且相关的 osObjectNew()函数返回 NULL 。静态对象内存与动态内存分配相比,静态内存分配需要编译时分配对象内存。为所有对象静态分配内存 静态内存分配可以通过在对象创建时使用属性提供用户定义的内存来实现,请参见手动用户定义的分配。请特别注意以下限制:内存类型要求控制块 (osXxxAttr_t::cb_mem)4 字节对齐。由 , , , , , ,
定义的大小。线程堆栈 ()8 字节对齐。大小是应用程序特定的,即堆栈变量和帧的数量。内存池 ()4 字节对齐。 使用
计算大小。消息队列()4 字节对齐。 使用
计算大小。为了允许 RTX5 知道调试,即组件查看器识别控制块,这些块需要放置在单独的存储器部分中,即使用__attribute __((section(...)))。RTX 对象链接器部分线程.bss.os.thread.cb定时器.bss.os.timer.cb事件标志.bss.os.evflags.cb互斥锁.bss.os.mutex.cb信号量.bss.os.semaphore.cb内存池.bss.os.mempool.cb消息队列.bss.os.msgqueue.cb以下代码示例显示如何使用静态内存创建 OS 对象。代码示例: #include "RTE_Components.h"#include
CMSIS_device_header#include "" #include "" void worker(void *arg){
} __attribute__((section(".bss.os.thread.cb"))) worker_thread_tcb_1; uint64_t worker_thread_stk_1[64]; const
worker_attr_1 = {
&worker_thread_tcb_1,
sizeof(worker_thread_tcb_1),
&worker_thread_stk_1[0],
sizeof(worker_thread_stk_1),
th1; void app_main (void *argument) {
uint32_t param = NULL;
th1 = (worker, &param, &worker_attr_1);
for (;;) {}} int main (void) {
SystemCoreClockUpdate();
(app_main, NULL, NULL);
for (;;) {}}线程堆栈管理对于没有浮点单元的 Cortex-M 处理器,线程上下文在本地堆栈上需要 64 个字节。注意对于带有FPU 的 Cortex-M4 / M7,线程上下文在本地堆栈上需要 200 个字节。 对于这些设备,默认堆栈空间应该增加到最小 300 字节。每个线程都有一个单独的堆栈,为自动变量和函数调用嵌套返回地址保存线程上下文和堆栈空间。RTX 线程的堆栈大小可以灵活配置,如线程配置部分所述。RTX 提供了一个可配置的检查堆栈溢出和堆栈利用率。低功耗操作系统线程 osRtxIdleThread 可用于将系统切换至低功耗模式。进入低功耗模式的最简单形式是执行 __WFE 功能,使处理器进入休眠模式,等待事件。代码示例: #include "RTE_Components.h"#include CMSIS_device_header
for (;;) {
}}注意__WFE()不是在每个 Cortex-M 实现中都是可用的。检查设备手册的可用性。RTX 内核定时器节拍RTX 使用通用 OS Tick API 来配置和控制其周期性内核刻度。要使用替代定时器作为内核刻度定时器,只需实现 OS Tick API 的自定义版本即可。注意所提供的 OS Tick 实现必须确保所使用的定时器中断使用与服务中断相同(低)的优先级组,即 RTX 使用的中断不能相互抢占。 有关更多详细信息,请参阅计划程序部分。无滴答低功耗操作RTX5 为无滴答操作提供了扩展,对于使用 SysTick 定时器也被禁用的广泛低功耗模式的应用非常有用。为了在这种省电模式下提供时间标记,使用唤醒定时器来导出定时器间隔。CMSIS-RTOS2 函数 osKernelSuspend 和 osKernelResume 控制无滴答的操作。使用这个函数允许 RTX5 线程调度器停止周期性内核刻度中断。当所有活动线程挂起时,系统进入掉电模式,并计算在这个掉电模式下可以停留多长时间。在省电模式下,处理器和外设可以关闭。只有唤醒定时器必须保持上电状态,因为该定时器负责在断电周期到期后唤醒系统。无滴答操作由 osRtxIdleThread 线程控制。唤醒超时值在系统进入掉电模式之前设置。函数 osKernelSuspend 计算在 RTX Timer Ticks 中测量的唤醒超时; 该值用于设置在系统掉电模式下运行的唤醒定时器。一旦系统恢复运行(通过唤醒超时或其他中断),RTX5 线程调度程序将以函数 osKernelResume 启动。参数 sleep_time 指定系统处于掉电模式的时间(在 RTX Timer Ticks 中)。代码示例: #include "msp.h"
static void MSP432_LP_Entry(void) {
PCM-&CTL1 = PCM_CTL1_KEY_VAL | PCM_CTL1_FORCE_LPM_ENTRY;
SYSCTL-&SRAM_BANKRET |= SYSCTL_SRAM_BANKRET_BNK7_RET;
__enable_interrupt();
NVIC_EnableIRQ(RTC_C_IRQn);
SCB-&SCR |= SCB_SCR_SLEEPONEXIT_M
SCB-&SCR |= (SCB_SCR_SLEEPDEEP_Msk);
} static volatile unsigned intstatic volatile unsigned int tc_ void RTC_C_IRQHandler(void){
if (tc++ & tc_wakeup)
SCB-&SCR &= ~SCB_SCR_SLEEPONEXIT_M
NVIC_DisableIRQ(RTC_C_IRQn);
NVIC_ClearPendingIRQ(RTC_C_IRQn);
if (RTC_C-&PS0CTL & RTC_C_PS0CTL_RT0PSIFG)
RTC_C-&CTL0 = RTC_C_KEY_VAL;
RTC_C-&PS0CTL &= ~RTC_C_PS0CTL_RT0PSIFG;
RTC_C-&CTL0 = 0;
SCB-&SCR |= (SCB_SCR_SLEEPDEEP_Msk);
}} uint32_t g_enable_sleep = 0;
for (;;) {
tc_wakeup = ();
if (tc_wakeup & 0) {
MSP432_LP_Entry();
}}注意__WFE()不是在每个 ARM Cortex-M 实现中都是可用的。检查设备手册的可用性。使用 __WFI()的替代方案还有其他问题,请注意http://www.keil.com/support/docs/3591.htm 。RTX5 头文件CMSIS-RTOS2 API 的每个实现都可以带来自己的附加功能。RTX5 增加了一些空闲功能,用于错误通知和特殊的系统定时器功能。 它也使用宏来控制块和内存大小。如果您的应用程序代码中需要一些 RTX 特定功能,请包括头文件 rtx_os.h: #ifndef RTX_OS_H_#define RTX_OS_H_ #include &stdint.h&#include &stddef.h&#include "" #ifdef
__cplusplusextern "C"{#endif
#define osRtxVersionAPI
#define osRtxVersionKernel
#define osRtxKernelId
"RTX V5.3.0"
#define osRtxIdInvalid
0x00U#define osRtxIdThread
0x01U#define osRtxIdTimer
0x02U#define osRtxIdEventFlags
0x03U#define osRtxIdMutex
0x04U#define osRtxIdSemaphore
0x05U#define osRtxIdMemoryPool
0x06U#define osRtxIdMessage
0x07U#define osRtxIdMessageQueue
0x08U #define osRtxObjectInactive
0x00U#define osRtxObjectActive
0x01U #define osRtxFlagSystemObject
0x01U#define osRtxFlagSystemMemory
0x02U #define osRtxKernelInactive
((uint8_t)osKernelInactive)#define osRtxKernelReady
((uint8_t)osKernelReady)#define osRtxKernelRunning
((uint8_t)osKernelRunning)#define osRtxKernelLocked
((uint8_t)osKernelLocked)#define osRtxKernelSuspended
((uint8_t)osKernelSuspended)
#define osRtxThreadStateMask
0x0FU #define osRtxThreadInactive
((uint8_t)osThreadInactive)#define osRtxThreadReady
((uint8_t)osThreadReady)#define osRtxThreadRunning
((uint8_t)osThreadRunning)#define osRtxThreadBlocked
((uint8_t)osThreadBlocked)#define osRtxThreadTerminated
((uint8_t)osThreadTerminated) #define osRtxThreadWaitingDelay
((uint8_t)(osRtxThreadBlocked | 0x10U))#define osRtxThreadWaitingJoin
((uint8_t)(osRtxThreadBlocked | 0x20U))#define osRtxThreadWaitingThreadFlags
((uint8_t)(osRtxThreadBlocked | 0x30U))#define osRtxThreadWaitingEventFlags
((uint8_t)(osRtxThreadBlocked | 0x40U))#define osRtxThreadWaitingMutex
((uint8_t)(osRtxThreadBlocked | 0x50U))#define osRtxThreadWaitingSemaphore
((uint8_t)(osRtxThreadBlocked | 0x60U))#define osRtxThreadWaitingMemoryPool
((uint8_t)(osRtxThreadBlocked | 0x70U))#define osRtxThreadWaitingMessageGet
((uint8_t)(osRtxThreadBlocked | 0x80U))#define osRtxThreadWaitingMessagePut
((uint8_t)(osRtxThreadBlocked | 0x90U)) #define osRtxThreadFlagDefStack 0x10U
#define osRtxStackMagicWord
0xE25A2EA5U #define osRtxStackFillPattern
0xCCCCCCCCU
typedef struct osRtxThread_s {
const char
struct osRtxThread_s
struct osRtxThread_s
struct osRtxThread_s
struct osRtxThread_s
struct osRtxThread_s
struct osRtxMutex_s
#define osRtxTimerInactive
#define osRtxTimerStopped
#define osRtxTimerRunning
#define osRtxTimerPeriodic
((uint8_t)osTimerPeriodic) typedef struct {
} ; typedef struct osRtxTimer_s {
const char
struct osRtxTimer_s
struct osRtxTimer_s
typedef struct {
const char
typedef struct osRtxMutex_s {
const char
struct osRtxMutex_s
struct osRtxMutex_s
padding[3];} ;
typedef struct {
const char
typedef struct {
} ; typedef struct {
const char
typedef struct osRtxMessage_s {
struct osRtxMessage_s
struct osRtxMessage_s
} ; typedef struct {
const char
typedef struct {
const char
typedef struct {
const char
volatile uint8_
*terminate_
(*tick)(void);
(*thread)(*);
void (*event_flags)(*);
(*semaphore)(*);
void (*memory_pool)(*);
(*message)(*);
}} ; extern
typedef struct {
uint32_t cnt_
uint32_t cnt_
uint32_t max_
} ; externexternexternexternexternexternextern
#define osRtxThreadFlagsLimit
#define osRtxEventFlagsLimit
#define osRtxMutexLockLimit
#define osRtxSemaphoreTokenLimit 65535U
#define osRtxThreadCbSize
sizeof(osRtxThread_t)#define osRtxTimerCbSize
sizeof(osRtxTimer_t)#define osRtxEventFlagsCbSize
sizeof(osRtxEventFlags_t)#define osRtxMutexCbSize
sizeof(osRtxMutex_t)#define osRtxSemaphoreCbSize
sizeof(osRtxSemaphore_t)#define osRtxMemoryPoolCbSize
sizeof(osRtxMemoryPool_t)#define osRtxMessageQueueCbSize
sizeof(osRtxMessageQueue_t) #define osRtxMemoryPoolMemSize(block_count, block_size) \
(4*(block_count)*(((block_size)+3)/4)) #define osRtxMessageQueueMemSize(msg_count, msg_size) \
(4*(msg_count)*(3+(((msg_size)+3)/4)))
#define osRtxErrorStackUnderflow
#define osRtxErrorISRQueueOverflow
#define osRtxErrorTimerQueueOverflow
#define osRtxErrorClibSpace
#define osRtxErrorClibMutex
extern uint32_t
(uint32_t code, void *object_id); extern void
(void *argument); extern void
(void);extern void
(void);extern void
#define osRtxConfigPrivilegedMode
#define osRtxConfigStackCheck
#define osRtxConfigStackWatermark
typedef struct {
thread_stack_
*idle_thread_
*timer_thread_
*timer_mq_
} ; extern const
__cplusplus}#endif #endif
// RTX_OS_H_超时值超时值是多个 osXxx 函数的参数,以便有时间解析请求。超时值为 0 意味着即使没有资源可用,RTOS 也不会立即等待并立即返回。osWaitForever 的超时值意味着 RTOS 无限等待,直到资源可用。或者迫使线程恢复使用 osThreadResume,这是不鼓励的。超时值指定在时间延迟消逝之前定时器滴答的数量。该值是一个上限,取决于自上次计时器滴答后所经过的实际时间。例子:超时值0:即使没有资源可用,系统也不会等待 RTOS 功能立即返回。超时值1:系统等待直到发生下一个定时器滴答; 取决于先前的定时器滴答,这可能是一个非常短的等待时间。超时值2:实际等待时间在 1 到 2 个定时器滴答声之间。超时值 osWaitForever:系统等待无限,直到资源变为可用。使用 osDelay()的超时示例来自中断服务例程的调用可以从线程和中断服务程序(ISR)调用以下 CMSIS-RTOS2 函数:, , , , , , , , , , , , , , , , , , , , 无法从 ISR 调用的函数正在验证中断状态并返回状态码 osErrorISR,以防从 ISR 上下文中调用它们。在某些实现中,可能会使用 HARD_FAULT 向量捕获此条件。
没有更多推荐了,}

我要回帖

更多关于 1msgtg和1ms有什么区别 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信