裸金属STM32F4x中的pvPortMalloc和vPortFree使用(freeRTOS Heap4.c)



我在编程裸机stm32f4x方面有着丰富的经验;然而,我试图将我的代码转换为freeRTOS,为此,我首先想看看是否可以使用Heap4.c进行内存分配,而不是使用标准的c malloc和免费调用来更好地管理内存等。

然而,我观察到,使用这些调用会禁用我的中断,并且永远不会重新打开它们。因此,任何使用中断的东西都不起作用;与中断无关的其他一切都正常工作。甚至Systick定时器中断处理程序也没有被触发。

所以,问题是,考虑到所有其他外围设备都会使用它们的中断,而SysTick基本上用于简单的时间延迟等,我们如何使用裸金属代码来使用pvPortMalloc和vPortFree。在使用这些调用时,我看不到SysTick内部发生任何打印,因为没有调用SysTick处理程序。

在这里,我想指出的是,我根本没有在任何中断上下文中调用pvPortMalloc或vPortFree。所以,这是完全安全的,不用担心。

我已经阅读了一些讨论,如果我理解正确,那么任何对FreeRTOS调度器暂停任务等的调用都不会产生影响,因为根本不会有任务。因此,我希望这个heap4.c端口可以很好地与裸金属配合使用,只要我们不在ISR上下文中使用它们;但显然,它只是禁用中断,而且似乎永远不会重新打开它们

我希望这里的专家对在裸金属中使用pvPortMalloc和vPortFree而不是使用freeRTOS有意见。

谨致问候,Junaid

我认为如果您将xTaskSuspendAll()和xTaskResumeAll()替换为简单地禁用/启用中断,它应该可以正常工作。事实上,如果你的中断没有使用分配的内存,你甚至可能不需要这样做,你可以简单地注释掉它们。Suspend和Resume是非常复杂的函数,如果需要,可以尝试将控制权交给其他任务。

我怀疑中断没有重新启用的原因是taskEXIT_CRITICAL()定义不正确(portENABLE_interrupts),或者在重新启用中断时uxCriticalNesting大于1(进入关键调用次数多于退出关键调用次数)。

然而,如果你不使用FreeRTOS,你可能会发现标准的malloc和free更好。