你好,
我正在使用IAR(8.11.1)来开发。
我发现了一个严重的问题,一些值总是在引导时被更改。
最后我找到了破坏RAM的代码:
void arch_rom_init(void){#如果已定义(uu DA14531_uuu)&(!USE CHACHA20\u RAND)//存储_RAND\u state stdlib/RAND.c RW变量uint32\u t RAND\u temp=_RAND\u state\u ROM\u DATA;#endif test1=DB\u HEAP\u BASE;test2=RAM\u UNINIT\u START\u ADDRESS;test3=RAM\u UNINIT\u END\u ADDRESS-RAM\u UNINIT\u START\u ADDRESS;test4=(u section\u begin(“.HEAP\u DB\u area”);test5=RET\MEM\u BASE;#如果已定义(DA14531\uu)&(USE\TRNG)//假设DA14531辅助引导加载程序和闪存编程器//(UART版本)保持//RAM\u UNINIT\u START\u ADDRESS和RAM\u UNINIT\u END\u ADDRESS之间的内存区域不变,//该内存区域可用于向TRNG缓冲区提供//true随机数据(RAM块通电后的随机值)。//TRNG缓冲区的最大大小是//RAM\u UNINIT\u END\u地址和RAM\u UNINIT\u START\u地址之间的差值。////注意:如果应用程序使用空闲区域,则应重新计算最大TRNG缓冲区大小(检查//散点文件)。在任何情况下,如果使用的TRNG缓冲区大小//。有关更多详细信息,请参阅SDK6文档。如果(trng\u state\u val!=0x12348765){memcpy((uint8_t*)DB_HEAP_BASE,(uint8_t*)RAM_UNINIT_START_ADDRESS,RAM_UNINIT_END_ADDRESS-RAM_UNINIT_START_ADDRESS);}#endif
当第一次启动时,TRNG被启用,这里将复制到DB\u HEAP\u BASE。
但我发现在boot.h中,所有的定义都被编译为0(在keil项目中,它包含正确的地址)
在地址0处,它包含
然后从
/******************************************************************************************************************@file boot.h**@brief此文件包含启动相关变量的声明。**版权所有(C)2019-2020 Dialog Semiconductor。*此计算机程序包括Dialog Semiconducyabo国际娱乐tor的机密专有信息。版权所有。****************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************外部结构长度;#定义编码地区和地区的长度(2 uint32\U t)定义编码地区和地区的长度(2 uint32\U t)定义编码地区和地区的长度(2 U U U U地区的长度(2 U U U U U U U U U U地区的长度)和;pragma 35;pragma 35;pragma#pragma 35; pragma #\\umumumum地区的保留区的成员和地区的地区的长度(U U区的地区的地区的不不受地区的RET))#定义非\u RET \u heap \u END(uint32&u t*)((uint32&u t*)((uint32&u t*))(((uint32&uint32&u t t*))))))))))));定义非_ret堆堆堆长度(非_ret堆堆堆端-非_t堆堆端-非t32\u t堆堆端-非tt t t t t 32&u t*)))))(()))定义定义非_ret堆堆堆堆长度(非t堆堆堆堆堆堆端-端-非t堆端-非t堆堆端-非#定义db_heap_LENGTH(db_heap_end-db_heap_BASE)#endif//\u启动\u_
更进一步说,
即使地址是对的,
它如何保证节[heap\u db\u area]大于(RAM\u UNINIT\u END\u ADDRESS-RAM\u UNINIT\u START\u ADDRESS)?
如果编译器在secton[heap\u db\u area]之后放置一些初始化变量,仍然存在风险。
设备:
你好,kevinchenúu sz,
为迟来的回复致歉,新年快乐。您能否说明您是否正在使用SDK中的prox\u reporter IAR项目来复制此问题?我是指位于projects\target\u apps\ble\u examples\prox\u reporter\IAR SDK path中的项目。
谢谢,下午好
是的,是的是prox\u reporter\IAR。
但我认为这与应用程序代码无关。
使用编译器中这些定义的代码位于系统初始化或睡眠处理程序函数中。
你好,kevinchenúu sz,
您是否使用SDK提供的项目?prox\u reporter\IAR应该是现成的,并且由SDK提供。请使用清晰的SDK目录进行尝试。
>>最后我找到了破坏RAM的代码:
你的意思是说你在安装了调试器的情况下运行,项目崩溃了吗?
如果你能提供一些关于这个问题的额外信息/屏幕截图,那将非常有帮助。
谢谢,下午好
我已经附上我的截图我终于找到了。
此问题的根本原因是:“boot.h”中的\uu section\u begin()和\uu section\u end()返回的地址不正确,而是零。
请参阅附件中的屏幕截图。
有两部分使用了“boot.h”中的宏:
1.定义CFG\u TRNG时为arch\u rom.c
这会导致撞车
2.archïu main.c,启用睡眠时
休眠代码用于计算哪个RAM块需要保留。
以上问题仅在IAR IDE中找到。
你好,kevinchenúu sz,
谢谢你的截图。还有一个问题,我将在内部升级以复制它:您是使用SDK提供的项目,还是进行了任何修改?
谢谢,下午好
两者都有。
我也试过不同版本的IAR。
所有人都有同样的问题。
你好,kevinchenúu sz,
我会把这件事上报给你,然后再给你回复。
谢谢,下午好
感谢您的更新和快速回复。我一定会注意这条线的。寻找同样的问题。撞到你的线了。
Myford福利
你好,janosN,非常感谢您的评论和宝贵的反馈!我们将审阅您的所有意见/解决方案。
您好,谢谢您的验证!
如果您有任何其他问题或反馈的无代码,请提出一个新的论坛门票!
谢谢,下午好