所以我在 STM32F427
微 Controller 上使用 CMSIS-RTOS
邮件队列机制和 Keil uVision 5.0.5
运行在 180MHz
。并且不时地使用 osMailFree() 释放先前分配的邮箱元素导致返回一些地址而不是 osStatus 类型的值,如 osOK 或 osErrorValue 或文档中所说的任何内容。
此地址指向分配有 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);
0x0E 是 RTX
SysTick 的优先级减 1。值得注意的是,直到我摆脱 NVIC_PriorityGroupConfig()
调用最初对我来说似乎并不重要。
关于c++ - CMSIS-RTOS 的 osMailFree() 返回一些地址而不是 osStatus 类型的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32995099/