archèu main.c中有一个错误
cs\u表当前声明为uint8\u t数组,因此具有对齐方式1。但是,在引导过程中,有一些存储指令将16位数据存储到此缓冲区中。
我的应用程序中碰巧有一些变量,当我查看.map文件时,这些变量会使cs\u表得到一个奇数地址。然后在引导过程中执行hardfault处理程序。
在我将uu attribute(section(“cs\u area”),zero\u init)更改为u attribute(section(“cs\u area”),zero\u init,aligned(2)),它又正常工作了。
关键词:
设备:
谢谢Joacimwe,我会把这个回复给软件团队的。BR JE\u对话框
你好,乔奇姆,
在引导过程中,zero_init区域将完全初始化为all zero,因此此时不会在cs_表上执行存储操作。
正如我测试的那样,在zero_init区域中分配奇数起始地址的全局变量不会导致硬故障:
未对齐0x200090f0数据3 arch\u main.o(cs\u区域)
notAligned2 0x200090f3数据8 arch\u main.o(cs\u区域)
因此,我猜硬故障不是由存储cs\u表引起的,而是由访问其他全局变量引起的,这些全局变量的地址受cs\u表起始地址的影响。
你能帮我们上传你的分散加载文件和输出的地图文件吗?
谢谢!
你好。以下是重现的步骤:
1解压DA14580\u 581\u SDK\u 3.0.8.0.zip。
2在Keil中打开项目模板\u 581.uvproj。
三。在da14580_config.h中将最大连接数设置为8:
/*最大用户连接数*/
#定义BLE\u连接\u MAX\u用户8
4将以下代码添加到app\u template\u proj.c中的app\u init\u func():
静态挥发分char-buf[1357];
buf[0]=0;
5按Build(F7)。
6配置正确的SW调试器并在DA14581上启动debug(我使用devkit BASIC)。
7现在您将到达HardFault\u HandlerC。
从生成的.map文件中提取的相关部分:
init.s 0x00000000数字0 init.o绝对值
保留内存区域0 0x00080328第28节uart2.o(保留内存区域0)
uart2_env 0x00080328数据28 uart2.o(保留内存区域0)
.bss 0x00080908第188节gpio.o(.bss)
.bss 0x000809c4第1365节应用程序模板项目(.bss)
buf 0x000809cc数据1357应用程序模板项目(.bss)
cs\ U区域0x00080f19截面120拱\主.o(cs\ U区域)
heap\u msg\u area 0x00080f94第6252节jump\u table.o(heap\u msg\u area)
保留内存区域0 0x00082800第36节附录第o节(保留内存区域0)
如您所见,cs\u区域位于一个奇数地址。如果我启动debug并在arch_main中设置一个断点,然后逐步遍历每一行代码,当下一行是“rwip_init(error);”并且我按“Step”时,就会调用hardfault处理程序。
(忽略这样一个事实:您通常会将设备角色设置为Central以使8个连接合理,因为在调用app\u configuration\u func之前会调用hardfault处理程序)。
尊敬的客户:,
谢谢你的详细信息。
我们已经重现了这个问题,我们知道根本原因是部分cs\U区域被分配了一个奇数开始地址,紧跟在app\u template\u proj.o的bss区域之后,因此在初始化cs\U区域期间,16位访问权限会破坏属于另一个bss区域的0x00080f18地址。所以,是的,你的法官是对的。
0x00080908 0x000000bc零RW 630.bss gpio.o
0x000809c4 0x00000555零RW 1431.bss应用程序模板项目
0x00080f19 0x00000078零RW 117 cs\ U区域拱门\主.o
0x00080f91 0x00000003垫
0x00080f94 0x0000186c Zero RW 288堆\u消息\u区域跳转\u表.o
0x00082800 0x00000024零RW存储区0应用程序第o节
我们还确认您的修复是解决此错误的最佳方法。
因为cs_area是地址方面的第一个部分,而下面显式定义的heap_env_area、heap_msg_area和heap_db_area都会被链接器自动填充,如果我们能保证cs_area的起始地址是对齐的,那么这个bug肯定是可以修复的。
再次感谢您的发现!
我们将在下一版本SDK中添加以下修复程序。
#如果NDEF uu DA14581__
#if(BLE\u连接\u最大用户数>4)
volatile uint8_t cs_table[EM_BLE_cs_COUNT_USER*REG_BLE_EM_cs_SIZE]\uu属性_uuu((节(“cs_区域”),零初始化,对齐(4)));
#结束
#其他
#if(BLE\u CONNECTION\u MAX\u USER>1)
volatile uint8_t cs_table[(BLE_CONNECTION_MAX+2)*REG_BLE_EM_WPB_SIZE*2]u attribute_uuu((section(“cs_area”),zero_init,aligned(4)));
#结束
#结束