USBD_malloc 禁止替换成 malloc 函数
stm32 的 CDC 虚拟串口库中的 USBD_malloc
使用的是 USBD_static_malloc
函数。定义如下
/*** @brief Static single allocation.* @param size: Size of allocated memory* @retval None*/
void *USBD_static_malloc(uint32_t size)
{UNUSED(size);static uint32_t mem[(sizeof(USBD_CDC_HandleTypeDef) / 4) + 1]; /* On 32-bit boundary */return mem;
}/*** @brief Dummy memory free* @param p: Pointer to allocated memory address* @retval None*/
void USBD_static_free(void *p)
{UNUSED(p);
}
在调试时观察调用堆栈,可以发现它是在中断中被调用的
只要是在中断中,就禁止使用 malloc
函数。也禁止使用 freertos 的动态内存分配函数。这有 2 种解决办法:
- 重构 USB CDC 库,改成中断中释放信号量,让线程去处理。
- 自己设置中断中可用的内存池。
不然如果不需要实现多个虚拟串口,就老实用 cubemx 生成的这种静态分配。