ST意法半导体
直播中

倪山骋

8年用户 1106经验值
私信 关注
[问答]

为什么HAL USB CDC驱动程序再次在ISR上下文中调用malloc?

早在 2018 年就提出了这个问题,我有更多信息。
这个问题的答案在 UM1734 的底部,其中给出了静态分配代码片段。
这段代码片段有两个问题会回来咬住粗心的开发人员(挥手):
1) 该片段在一个数组中分配了 4 x 32 位项目,但没有说明如何使用它们。也许 4 个指向 4 个 USB 设备描述符的指针?一点都不。
这些 4 x 32 位值用于容纳 540 字节的 CDC 设备描述符。
然后将此数组之后的内存中的各种值牺牲给描述符。
2) 他们的实现分配 N x 32 位值,而 malloc 期望 N x 8 位值,因此您分配的空间的 3/4(如果您设法通过问题 1)将永远不会被使用。在内存受限的系统中。每个字节都可能很重要。
唉,现在我必须联系我的客户,让他知道现场的 250 台设备需要固件更新。









回帖(1)

徐一腾

2023-2-8 14:39:46
您是手动将代码从 UM1734 复制到您的代码中还是由 CubeMX 生成?我问是因为我为我的 L4xx 项目生成的 CubeMX(版本 4.24,是的,旧的)USB CDC 代码具有开箱即用的 USBD_static_malloc:


  • void *USDB_static_malloc(uint32_t size)
  • {
  •    static uint32_t mem[(sizeof(USBD_CDC_HandleTypeDef)/4)+1]; /* on 32-bit boundary*/
  •    UNUSED(size);
  •    return mem;
  • }

这只调用一次,从 USBD_CDC_Init() 初始化 USBD_HandleTypeDef 的 pClassData 指针。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分