c++ - CMSIS-RTOS 的 osMailFree() 返回一些地址而不是 osStatus 类型的值

标签 c++ multithreading mail-queue cmsis

所以我在 STM32F427 微 Controller 上使用 CMSIS-RTOS 邮件队列机制和 Keil uVision 5.0.5 运行在 180MHz。并且不时地使用 osMailFree() 释放先前分配的邮箱元素导致返回一些地址而不是 osStatus 类型的值,如 osOKosErrorValue 或文档中所说的任何内容。

此地址指向分配有 osMailQDef 的服务结构的 os_mailQ_p_##blahlbah 元素。这也意味着它恰好指向分配有相同 osMailQDef 宏的实际数据缓冲区的末尾。

我所有的结构都是静态分配的;线程的堆栈大小 (OS_STKSIZE 600) 看起来也足够好 - 无论如何,将它们加倍和加倍都没有效果。

如果我的程序早晚会遇到一个线程无法分配邮件元素(osMailAlloc() 返回 0)而其他线程无法分配邮件元素(osMailAlloc() 返回 0)的情况,而其他线程,等待线程,不断占用 osEventTimeout。似乎所有内存块都在使用中 - 但我会在每次使用后诚实地释放它(在包装对象的析构函数中,以确保它真正被释放)。

这意味着什么以及在哪里挖掘?

最佳答案

嗯,我不明白所描述行为的真正深层原因是什么。但是:

1) 首先找到了解决方法:在调用失败后立即再次调用 osMailFree() 就足够了。然后它会返回 osOK 并且(正如我的长期测试所显示的)时间资源被真正释放。

2) 在我更改 fatfs_sd_sdio.c 文件(属于我正在使用的 FatFS 库的一部分)内的 IRQ 优先级设置过程后,效果完全消失了。特别是以下代码行:

NVIC_PriorityGroupConfig (NVIC_PriorityGroup_1);

NVIC_InitStructure.NVIC_IRQChannel = SDIO_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init (&NVIC_InitStructure);

NVIC_InitStructure.NVIC_IRQChannel = SD_SDIO_DMA_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_Init (&NVIC_InitStructure);

替换为以下内容:

NVIC_EnableIRQ(SDIO_IRQn);
NVIC_SetPriority (SDIO_IRQn, 0x0e);
NVIC_EnableIRQ(SD_SDIO_DMA_IRQn);
NVIC_SetPriority (SD_SDIO_DMA_IRQn, 0x0e);

0x0ERTX SysTick 的优先级减 1。值得注意的是,直到我摆脱 NVIC_PriorityGroupConfig() 调用最初对我来说似乎并不重要。

关于c++ - CMSIS-RTOS 的 osMailFree() 返回一些地址而不是 osStatus 类型的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32995099/

相关文章:

c++ - 为什么 C++11 constexpr 如此严格?

c++ - 是什么占用了我的工作时间?

c# - 如何在 C# 中编写条件锁?

java - 与 Java 并行创建对象

用于从 exim 队列中删除 2 天前的卡住电子邮件的 Linux shell 脚本

c++ - 一对 C++ 交换方法的优点是什么?

c++ - 如何创建一个包含其类型未知的值的类?

java - 执行等待和通知时返回意外结果

python - 在 Python 中使用管道执行 shell 命令

php - PEAR mail-queue教程配置麻烦