This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TMS320F28P650DK:当 CAN、EPWM 和 ADC 中断负载增加时、应用程序卡在 malloc () 中

Guru**** 3001220 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1663563/tms320f28p650dk-application-stuck-in-malloc-when-can-epwm-and-adc-interrupt-load-increases

器件型号: TMS320F28P650DK

尊敬的团队:

CCS 版本: 12.8.1.00005

我在中断模式下使用 CAN 外设、并使用该 malloc() 函数实现了一个队列、为传入的 CAN 数据包动态分配内存。

除了 CAN、我的应用还使用 EPWM 和 ADC 事件中断。

当 CAN 中断 频率增加(0.01ms 周期)时会发生此问题、尤其是当 ePWM ISR 以大约 20kHz 的频率运行以及频繁 执行 ADC 事件 ISR 时。 在这些情况下、应用最终会卡在内存分配例程中。

调试时,我观察到代码在以下函数中挂起 memory.c:

 code_access void * aligned_alloc (size_t alignment、size_t size)

是否有人在高中断负载下遇到类似的动态内存分配问题? 关于 malloc() 在 C2000 器件上使用中断驱动型应用程序、是否有任何已知限制或建议?

专用于循环、它在 *aligned_alloc 函数内乱丢。

image.png

 

任何见解或建议都将非常感谢。

此致、

Bhavin P

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Bhavin,

    malloc 函数是仅在 CAN ISR 中调用、还是从 main 和/或其他 ISR 调用?   

    您的代码是否会启用中断嵌套、特别是在 CAN ISR 内部?

    我们通常看不到 C28x 上经常使用 malloc、我认为 malloc/alloc 函数不可重入、这意味着如果 ISR 在 malloc 期间发生、 并且也调用 malloc、 堆将损坏。

    我还想提及的是、我们为器件上的所有 CAN IP 提供了专用的消息 RAM、也可通过 DMA(和 CPU)访问这些 RAM、我不确定在上述情况下是否需要将数据包存储在以下消息 RAM 大小之上或之外、但想确保我们在此处的同一页面上。

    另一种方法是为此分配静态环形缓冲区、而不是 Malloc;这将在链接时硬性定义到.bss 中的段、再次不确定是否需要、而是 malloc 的替代方法。

    #define POOL_SIZE 16
    静态 can_Message pool[pool_size];//启动时分配的数组(静态)
    静态易失性 uint16_t poolHead = 0;//循环索引

    静态内联 can_Message* pool_alloc (void){
    uint16_t idx = poolHead;
    poolHead =(poolHead + 1)% pool_size;//前进、在 pool_size 处换行
    返回&pool[idx];//返回指向下一个时隙的指针
    }

    此致、

    Matthew

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Metthew:

    是、 malloc() 当前正在 CAN ISR 中使用、中断嵌套被禁用。 我同意 malloc() 不可重入、不应从 ISR 使用。

    启用中断嵌套是否已经解决了该问题、或者风险是否仍然存在、因为它 malloc() 本身不支持 ISR 安全?

    通常、 pool_alloc 方法是最佳选择。

    此致、

    Bhavin P

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Bhavin,

    不、我的意思是要小心防止中断嵌套、因为这会使这种情况更糟。  实际上它处于关闭状态是好的、这意味着没有任何东西会中断 malloc 的这个实例。  

    但我认为、如果也从 main 调用 malloc、问题就仍然存在;我们仍然不必阻止其他 ISR 中断 malloc 本身、再次假设也可以从 main 调用 malloc。

    对于基于 C28x 的架构、我认为这种环缓冲方法是理想方法、它将在链接处被分配为静态存储器范围、因此我们知道代码中的其他部分不会重复使用/使用它。

    此致、

    Matthew