你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

明知故犯,遭遇滑铁卢~~说一说pvPortMalloc

[复制链接]
watershade 发布时间:2020-6-5 18:05
最近做了一个AT Parser的框架,最初写的时候用到了大量malloc和free来减少对存储空间的浪费。最开始测试的时候是裸机。后来换到freeRTOS上。一般都能正常运行,但是是不是会出发HardFault Error。猜测有可能是非法使用malloc导致的。
- W3 l/ t4 P7 ^( {4 k/ ^其实在使用malloc之前我是有一个分段使用策略的,只是当时还没有写:
6 ?) K6 a- @  D2 v+ @; d1、在freeRTOS使用之前使用malloc/free 并用__disable_irq()和__enable_irq()包裹
# f1 p% i7 P4 ^' _" M8 C2、在freeRTOS启动之后再使用pvPortMalloc/vPortFree6 h7 e, q& K9 b# [6 \+ ?
3、在ISR中并尽量不用malloc,一定不用pvPortMalloc。如果联合cmsis-os使用,可考虑选择osMemeoryPool解决一些问题。( A- r$ ]) D  p
0 Y3 V* Y- K& d9 S: R9 D) F
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
4 s, V0 d2 d7 N) Q. J+ h因为急于测试,这段策略准备后面写。我就粗心的将所有malloc/free用pvPortMalloc/vPortFree代替) ]2 a4 _/ s# T7 d% z9 Z
但是调试的时候浪费了两天的时间追查问题。我在程序中线初始化了一些变量。这些变量有一些使用pvMalloc初始化的。开启了一个串口DMA接收的中断,然后发送UART指令中间也用到了malloc指令。这就导致了DMA中断无效。结果无论怎么模拟想指定端口发数据都收不到。终于追查到了中断不起作用。却怎么也找不到原因。在遭遇了一天半滑铁卢之后,终于找到了原因。' {9 x' r& k/ A& N! Y
所以pvPortMalloc一定不要内核启动之前使用。至于导致其不能使用的原因可以参考这边文章% f( N3 s( j, Y# M
一切都和uxCriticalNesting 有关。初始化的时候,其被故意初始成了0xaaaaaaa。9 W1 q' {  R; d9 I) s5 j8 R/ g! q
[color=rgb(0, 0, 136) !important]static UBaseType_t uxCriticalNesting = [color=rgb(0, 102, 102) !important]0xaaaaaaaa;
' z7 O& {8 H& x! l( g% A2 h尽管你搜到很多文章告诉你在核心启动前,创建thread/mutex等用到了pvPortMalloc。但这些文章没有告诉你,这个变量其实在核心初始化的时候才被初始化为0.所以一定要注意。% {7 w7 H2 i' ?% ~1 n  I
收藏 评论0 发布时间:2020-6-5 18:05

举报

0个回答

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版