gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:48:53 25 4
gpt4 key购买 nike

所以我在 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com