在arch_main.c中有一个错误
cs_table目前声明为uint8_t数组,因此对齐方式为1。然而,在引导期间,有存储指令将16位数据存储到这个缓冲区中。
我的应用中恰好有变量使得cs_table在查看。map文件时得到一个奇怪的地址。然后在引导期间执行硬故障处理程序。
在我更改__attribute__((section("cs_area"), zero_init))为__attribute__((section("cs_area"), zero_init, aligned(2)))后,它再次工作良好。
关键词:
设备:
谢谢Joacimwe,我会把这个报告给SW团队。BR JE_Dialog
嗨Joacimwe,
zero_init区域将在引导期间完全初始化为全部ZERO,因此此时不会在cs_table上进行存储操作。
在我的测试中,在zero_init区域中以奇怪的开始地址分配的全局变量不会导致硬故障:
notalsigned 0x200090f0 Data 3 arch_main.o(cs_area)
notAligned2 0x200090f3 Data 8 arch_main.o(cs_area)
所以我猜硬故障不是由存储cs_table引起的,而是由访问其他全局变量引起的,这些全局变量的地址受cs_table起始地址的影响。
你能帮忙上传你的散点加载文件和输出的地图文件给我们检查吗?
谢谢!
嗨。以下是复制的步骤:
1.解压缩DA14580_581_SDK_3.0.8.0.zip。
2.打开项目template_581。uvproj凯尔。
3.在da14580_config.h中设置最大连接数为8:
/ * * /最大用户连接
#定义BLE_CONNECTION_MAX_USER 8
4.在app_template_project .c中添加以下代码到app_init_func():
静态volatile char buf[1357];
但[0]= 0;
5.媒体构建(F7)。
6.配置正确的SW调试器并在DA14581上启动调试(我使用的是devkit BASIC)。
7.现在您将到达HardFault_HandlerC。
从生成的.map文件中提取的相关部分:
init。init. s 0x00000000编号0。o绝对
第28节uart2.o(retention_mem_area0)
uart2_env 0x00080328 Data 28 uart2.o(retention_mem_area0)
.bss 0x00080908 Section 188 gpio.o(.bss)
bss 0x000809c4 Section 1365 app_template_project .o(.bss)
buf 0x000809cc Data 1357 app_template_project .o(.bss)
cs_area 0x00080f19 Section 120 arch_main.o(cs_area)
Section 6252 jump_table.o(heap_msg_area 0x00080f94)
retention_mem_area 0x00082800 36 app_sec.o(retention_mem_area)
如您所见,cs_area被放置在一个奇怪的地址。如果我启动调试并在arch_main中设置一个断点,并逐步遍历每一行代码,当下一行是“rwip_init(error);”时,我按下“Step”,就会调用硬故障处理程序。
(忽略您通常将设备角色设置为Central以使8个连接合理的事实,因为硬故障处理程序是在调用app_configuration_func之前调用的)。
亲爱的客户,
谢谢你的详细信息。
我们已经重现了这个问题,我们知道根本原因是cs_area部分被分配了一个奇怪的开始地址,在app_template_proj的bss区域之后。所以在cs_area的初始化过程中,16位访问侵犯了属于另一个BSS区域的0x00080f18地址。所以,是的,你的法官是对的。
0x00080908 0x000000bc零RW 630 .bss gpio.o
0x000809c4 0x00000555零RW 1431 .bss app_template_project .o
0x00080f19 0x00000078零RW 117 cs_area arch_main.o
0 x00080f91 0 x00000003垫
0x00080f94 0x0000186c 0 RW 288 heap_msg_area jump_table.o
0x00082800 0x00000024零RW 1373 retention_mem_area0 app_sec.o
我们也确认你的修复是解决这个bug的最好方法。
由于cs_area是地址方面的第一个节,而下面显式定义的heap_env_area、heap_msg_area和heap_db_area将由链接器自动填充,如果我们能确保cs_area的起始地址是对齐的,那么这个bug肯定可以修复。
再次感谢你的发现!
我们将添加以下修复到下一个版本的SDK版本。
的ifndef __DA14581__
#if (BLE_CONNECTION_MAX_USER > 4)
volatile uint8_t cs_table[EM_BLE_CS_COUNT_USER * REG_BLE_EM_CS_SIZE] __attribute__((section("cs_area"), zero_init, aligned(4)));
# endif
其他#
#if (BLE_CONNECTION_MAX_USER > 1)
volatile uint8_t cs_table[(BLE_CONNECTION_MAX + 2) * REG_BLE_EM_WPB_SIZE * 2]__attribute__((section("cs_area"), zero_init, aligned(4)));
# endif
# endif