嵌入式技术论坛
直播中

李霞

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

通过rt_malloc()申请动态内存报SCB_CFSR_BFSR错误咋办?

环境:
1)、GD32F103ZET6, 通过FSMC总线挂载SRAM、CH438芯片》
2)、使用RTT4.0.3版本。定义了RT_USING_MEMHEAP_AS_HEAP宏

测试流程:

1 系统启动后,通过系统管理SRAM芯片内存,显示挂载成功。
2 测试CH438芯片都能够正常 操作,收发都正常。此时不会引起总线错误。
此时通过free命令查看剩余内存:

[20:29:49.914]收←◆free
memheap pool size max used size available size


sram 1048576 48 1048528
heap 59056 58312 744
msh >

芯片内部SRAM剩余744的时候,再通过rt_malloc()申请一个超过1024Byte的或者更大的内存空间,就会报总线错误。

收←◆msh >psr: 0x01000000
r00: 0x68000418
r01: 0x58565856
r02: 0x200006ec
r03: 0xffffffff
r04: 0x200006a8
r05: 0x68000000
r06: 0x00000400
r07: 0xf056583e
r08: 0x00000000
r09: 0x00000400
r10: 0xdeadbeef
r11: 0xdeadbeef
r12: 0x00000000
lr: 0x08008d4d
pc: 0x08007dbc
hard fault on thread: uart
thread pri status sp stack size max used left tick error


uart 11 running 0x00000088 0x00001000 03% 0x00000014 000
tshell 20 suspend 0x00000080 0x00001000 03% 0x0000000a 000
tidle0 31 ready 0x00000044 0x00000100 26% 0x0000001e 000
main 10 suspend 0x00000098 0x00000800 12% 0x00000013 000
bus fault:
SCB_CFSR_BFSR:0x04 IMPRECISERR

通过单步跟踪进入程序,rt_malloc()函数分配内存地址,已经转到片外SRAM芯片地址上了,分配的地址指针都是0x68000000以上的了,但运行到在void *rt_memheap_alloc(struct rt_memheap *heap, rt_size_t size)函数中

以下语句的时候就会出现总线错误(memheap.c文件中213行)

/* break down the block list */
            new_ptr->prev          = header_ptr;
            new_ptr->next          = header_ptr->next;
            header_ptr->next->prev = new_ptr;
            header_ptr->next       = new_ptr;

我查看了本论坛中 “SCB_CFSR_BFSR”错误的贴子,但依然没有找到问题原因。

回帖(5)

刘敏

2023-1-11 15:24:34
连接脚本中有对SRAM区的定义和映射吗?
举报

李霞

2023-1-11 15:24:45
我是使用MDK环境进行编译的。
系统启动时候,已经添加了SRAM测试命令。通过串口输出信息看是SRAM测试没有问题。

[13:09:05.293]收←◆msh >
[13:09:12.699]收←◆[D/drv.sram] sram init success, mapped at 0x68000000, size is 1048576 bytes, data width is 16
外部SRAM测试开始[D/drv.sram] Writing the 262144 bytes data, waiting....
[13:09:12.964]收←◆[D/drv.sram] Write data success, total time: 0.000S.
[D/drv.sram] start Reading and verifying data, waiting....
[13:09:13.164]收←◆[D/drv.sram] SRAM test end!
外部SRAM读写测试成功
  | /
- RT -     Thread Operating System
/ |      4.0.3 build Dec  1 2020
2006 - 2020 Copyright by rt-thread team
msh >
举报

刘杰

2023-1-11 15:24:52
sram启用后有个sram_test命令,你试一下
举报

李霞

2023-1-11 15:25:04
系统启动时候,已经添加了SRAM测试命令。通过串口输出信息看是SRAM测试没有问题。

[13:09:05.293]收←◆msh >
[13:09:12.699]收←◆[D/drv.sram] sram init success, mapped at 0x68000000, size is 1048576 bytes, data width is 16
外部SRAM测试开始[D/drv.sram] Writing the 262144 bytes data, waiting....
[13:09:12.964]收←◆[D/drv.sram] Write data success, total time: 0.000S.
[D/drv.sram] start Reading and verifying data, waiting....
[13:09:13.164]收←◆[D/drv.sram] SRAM test end!
外部SRAM读写测试成功
  | /
- RT -     Thread Operating System
/ |      4.0.3 build Dec  1 2020
2006 - 2020 Copyright by rt-thread team
msh >
举报

李霞

2023-1-11 15:25:13
问题解决。
是自己代码的原因。原因为:对SRAM读写测试后,没有将SRAM内部数据清零,导致后续rt_malloc()分配的时候,一些指针直接使用了这些野数据。
举报

更多回帖

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