在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区域将被完全初始化为零,因此此时不会在cs_table上进行存储操作。
就像我测试的那样,在zero_init区域中分配一个奇数起始地址的全局变量不会导致硬错误:
未对齐的0x200090f0数据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.o(retention_mem_area0)
第188节gpio.o(.bss)
app_template_project .o(.bss)
buf 0x000809cc Data 1357 app_template_project .o(.bss)
cs_area 0x00080f19 Section 120 arch_main.o
Section 6252 jump_table.o(heap_msg_area)
retention_mem_area0 0x00082800
在这里,您可以看到,CS_AREA放在奇数地址。如果我开始调试并在Arch_main中设置一个断点并通过每个代码行踩下,当下一行是“RWIP_INIT(错误);”我按“步骤”,调用硬盘处理程序。
(忽略这样一个事实:您通常会将设备角色设置为Central,以便合理地建立8个连接,因为hardfault处理程序是在调用app_configuration_func之前调用的)。
亲爱的客户,
谢谢您的详细信息。
我们已经复制了这个问题,我们知道根本原因是section cs_area被分配了一个奇数的起始地址,位于app_template_proj的bss区域之后。O,所以在初始化cs_area时,16位的访问侵犯了属于另一个BSS region的0x00080f18地址。所以,是的,你的法官是对的。
0x00080908 0x000000bc零RW 630 .bss gpio.o
0x000809c4 0x00000555 Zero RW 1431 .bss app_template_project .o . 0x000809c4 0x00000555
0x00080f19 0x00000078零RW 117 cs_area arch_main.o . 0x00080f19 0x00000078零RW 117 cs_area arch_main.o
0 x00080f91 0 x00000003垫
0x00080f94 0x0000186c Zero RW 288 heap_msg_area jump_table.o . 0x00080f94 0x0000186c Zero RW 288
0x00082800 0x00000024零RW 1373 retention_mem_area0 app_seconds .o
我们也确认你的修复是这个bug的最佳方式。
因为cs_area是地址方面的第一个部分,而下面显式定义的heap_env_area、heap_msg_area和heap_db_area将被链接器自动填充,如果我们能保证cs_area的起始地址是对齐的,那么这个错误肯定可以修复。
再次感谢您的发现!
我们将在下一个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