
最近做了一个AT Parser的框架,最初写的时候用到了大量malloc和free来减少对存储空间的浪费。最开始测试的时候是裸机。后来换到freeRTOS上。一般都能正常运行,但是是不是会出发HardFault Error。猜测有可能是非法使用malloc导致的。. o8 W" |7 |! t: m0 L% t8 q9 A0 G 其实在使用malloc之前我是有一个分段使用策略的,只是当时还没有写:9 B$ q1 `" o& i( d. j2 p/ Y* g+ K 1、在freeRTOS使用之前使用malloc/free 并用__disable_irq()和__enable_irq()包裹* f2 V5 T/ N9 [# z+ O 2、在freeRTOS启动之后再使用pvPortMalloc/vPortFree$ |' k# p% N2 m 3、在ISR中并尽量不用malloc,一定不用pvPortMalloc。如果联合cmsis-os使用,可考虑选择osMemeoryPool解决一些问题。+ [+ v; o+ s6 I9 C1 B + U# t. C j1 x) Y, X8 p- n( Y6 c ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" ?( n8 e' \+ x% Y7 c% k$ p 因为急于测试,这段策略准备后面写。我就粗心的将所有malloc/free用pvPortMalloc/vPortFree代替# u5 C: V6 H5 {+ s. o$ W 但是调试的时候浪费了两天的时间追查问题。我在程序中线初始化了一些变量。这些变量有一些使用pvMalloc初始化的。开启了一个串口DMA接收的中断,然后发送UART指令中间也用到了malloc指令。这就导致了DMA中断无效。结果无论怎么模拟想指定端口发数据都收不到。终于追查到了中断不起作用。却怎么也找不到原因。在遭遇了一天半滑铁卢之后,终于找到了原因。0 v, `2 v; e& V$ ^9 Z 所以pvPortMalloc一定不要内核启动之前使用。至于导致其不能使用的原因可以参考这边文章。 一切都和uxCriticalNesting 有关。初始化的时候,其被故意初始成了0xaaaaaaa。 [color=rgb(0, 0, 136) !important]static UBaseType_t uxCriticalNesting = [color=rgb(0, 102, 102) !important]0xaaaaaaaa;$ q1 O6 `( m) @3 I' x; E3 F 尽管你搜到很多文章告诉你在核心启动前,创建thread/mutex等用到了pvPortMalloc。但这些文章没有告诉你,这个变量其实在核心初始化的时候才被初始化为0.所以一定要注意。 |