所以我使用CMSIS-RTOS
邮件队列机制,Keil uVision 5.0.5
在STM32F427
微控制器运行在180MHz
。并且时不时地使用osMailFree()释放先前分配的邮箱元素,导致返回一些地址,而不是osStatus-type值,如osOK或osErrorValue或文档中所说的任何内容。
此地址指向使用osMailQDef分配的服务结构的os_mailQ_p_##blahlbah元素。这也意味着它指向使用相同的osMailQDef宏分配的实际数据缓冲区的末尾。
我所有的结构都是静态分配的;线程的堆栈大小(OS_STKSIZE 600)看起来也足够漂亮-无论如何,将它们加倍和三倍都没有影响。
它不会打扰我,如果它不是早或晚我的程序进入的情况下,当一个线程无法分配邮件元素(osMailAlloc()返回0),而其他,等待线程,是不断采取 oeventtimeout 。似乎所有的内存块都在使用中-但我诚实地在每次使用后释放它(在包装对象的析构函数中,以确保它真正被释放)。
这是什么意思,在哪里挖?
嗯,我不明白所描述的行为的真正深层原因是什么。但是:
1)首先找到了一个解决方法:在调用失败后立即再次调用osMailFree()就足够了。然后,它预期返回osOK,并且(正如我的长期测试所显示的)时间资源被真正释放。
2)在我改变了fatfs_sd_sdio.c文件内的IRQ优先级设置过程后,效果完全消失了,该文件是我正在使用的FatFS
库的一部分。特别是下面的代码行:
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()
调用,治疗才完全完成,最初对我来说似乎并不重要。