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

pvPortMalloc and vPortFree Usage (freeRTOS Heap4.c) in Baremetal STM32F4x

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

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

所以,问题是,考虑到所有其他外围设备确实使用它们的中断,而 SysTick 基本上用于简单的时间延迟等,我们如何通过裸机代码使用 pvPortMalloc 和 vPortFree。调用,我看不到 systick 中发生的任何打印,因为没有调用 systick 处理程序。

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

我已经阅读了一些讨论,如果我理解正确,那么任何调用 FreeRTOS 调度程序以暂停任务等都不会产生影响,因为根本没有任务。所以,我希望这个 heap4.c 端口可以在裸机上正常工作,只要我们远离在 ISR 上下文中使用它们;但显然它只是禁用中断并且似乎永远不会重新打开它们。

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

此致, 朱奈德

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

我怀疑中断没有被重新启用的原因是 taskEXIT_CRITICAL() 没有正确定义 (portENABLE_INTERRUPTS) 或者 uxCriticalNesting 在重新启用时大于 1中断(enter critical 被调用的次数比 exit critical 调用的次数多)。

但是,如果您不使用 FreeRTOS,您可能会发现标准的 malloc 和 free 更好。