你好,
我使用IAR开发(8.11.1)。
我发现一个严重的问题,一些价值观引导时总是被改变。
最后我找到打破RAM的代码:
空白arch_rom_init(空白){#如果定义(__DA14531__) & & (! USE_CHACHA20_RAND) / /存储的价值_rand_state stdlib /兰德。c RW变量uint32_t rand_temp = _rand_state_ROM_DATA;# endif test1 = DB_HEAP_BASE;test2 = RAM_UNINIT_START_ADDRESS;test3 = RAM_UNINIT_END_ADDRESS - RAM_UNINIT_START_ADDRESS;test4 = (__section_begin (“.heap_db_area”);test5 = RET_MEM_BASE;#如果定义(__DA14531__) & & (USE_TRNG) / /鉴于DA14531二级引导装载程序和flash程序员/ / (UART版)叶子没有/ / RAM_UNINIT_START_ADDRESS和RAM_UNINIT_END_ADDRESS地址之间的内存区域,/ /这个内存区域可以用来喂养TRNG缓冲/ /真正的随机数据(内存块上电后随机值)。/ / TRNG缓冲区的最大大小/ / RAM_UNINIT_END_ADDRESS和RAM_UNINIT_START_ADDRESS之间的区别。/ / / /注意:最大TRNG缓冲区大小应该重新计算/ /如果应用程序使用免费区区域(检查/ /散射文件)。在任何情况下,如果使用TRNG缓冲区大小/ /足够小,TRNG算法将与真正的独立随机/ /数据操作中使用的最大大小/ /内存复制。 For further details check the SDK6 documentation. if (trng_state_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_HEAP_BASE这里会复制。
但是我发现在引导。h,所有的定义都是编译为0。(在我们的项目中,它包含正确的地址)
在地址0,它包含< heap_mem_area_not_ret >的地址。(重新映射在0 ?)
然后从< heap_mem_area_not_ret >开始的数据都被覆盖,然后导致崩溃。
/ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * @file引导。h * * @brief这个文件包含引导相关变量的声明。* * (C) 2019 - 2020版权对话框半导体。yabo国际娱乐*本计算机程序包括保密、专有信息*半导体的对话框。yabo国际娱乐保留所有权利。* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /的ifndef _BOOT_H_ # define _BOOT_H_ # include < stdint。h >走读生const uint32_t __ER_IROM3_BASE__ [];#定义CODE_AREA_BASE ((uint32_t) __ER_IROM3_BASE__)走读生const uint32_t __ER_IROM3_LENGTH__ [];#定义CODE_AREA_LENGTH ((uint32_t) __ER_IROM3_LENGTH__) = " # pragma部分。retention_mem_area_uninit“#定义RET_MEM_BASE (* (uint32_t *) (__section_begin (“.retention_mem_area_uninit”))) = " # pragma部分。heap_mem_area_not_ret“#定义NON_RET_HEAP_BASE (* (uint32_t *) (__section_begin (“.heap_mem_area_not_ret”))) # define NON_RET_HEAP_END (* (uint32_t *) (__section_end (“.heap_mem_area_not_ret”))) # define NON_RET_HEAP_LENGTH (NON_RET_HEAP_END - NON_RET_HEAP_BASE) # pragma节= "。heap_db_area“#定义DB_HEAP_BASE (* (uint32_t *) (__section_begin (“.heap_db_area”))) # define DB_HEAP_END (* (uint32_t *) (__section_end (“.heap_db_area”))) # define DB_HEAP_LENGTH (DB_HEAP_END - DB_HEAP_BASE) # endif / / _BOOT_H_
进一步,
即使地址是正确的,
怎么能保证部分(heap_db_area)比(RAM_UNINIT_END_ADDRESS - RAM_UNINIT_START_ADDRESS) ?
这仍然是一个风险如果编译器把一些字母变量后secton [heap_db_area]。
设备:
嗨kevinchen_sz,
道歉,反应后期,新年快乐。你能请注明如果使用prox_reporter IAR项目从SDK复制这个问题?我的意思是项目,项目位于\ target_apps \ ble_examples \ prox_reporter \ IAR SDK的道路。
谢谢,PM_Dialog
是的。这是prox_reporter \ IAR。
但是我认为它与应用程序无关的代码。
编译器的代码使用这些定义位于系统初始化或睡眠处理程序函数。
嗨kevinchen_sz,
你是使用SDK提供的项目?prox_reporter \ IAR应该的工作和提供的SDK。请尝试用清晰的SDK目录。
> >我终于找到打破RAM的代码:
你的意思是,你在附有调试器和项目有撞吗?
如果你能提供一些额外的信息/截图在这个问题上,这将是非常有用的。
谢谢,PM_Dialog
我附上截图我终于找到的东西。
这个问题的根源是:__section_begin()和__section_end ()”。h”不返回正确的地址但是零。
看到atthached截图文件。
两部分在“boot.h”:使用宏
1. arch_rom。c当CFG_TRNG定义
这导致崩溃
2. arch_main。c,启用睡眠时
睡眠代码使用计算内存块需要保留。
以上问题只存在于IAR IDE。
嗨kevinchen_sz,
谢谢你的截图。一个问题,我就升级内部复制它:你使用SDK提供的项目,或者你做了什么修改吗?
谢谢,PM_Dialog
两者都有。
我也尝试过不同版本的IAR。
都有同样的问题。
嗨kevinchen_sz,
我将升级这个内部检查出来并将送还给你。
谢谢,PM_Dialog
谢谢你的更新和快速回复。我一定会留意这个线程。寻找同样的问题。撞到你的线程。
myfordbenefits
嗨janosN,感谢你宝贵的反馈意见和!我们将回顾你的评论/解决方案。
嗨sfuentes-digi,谢谢验证!
如果你有任何其他问题或反馈无代码,请增加一个新的论坛门票!
谢谢,PM_Dialog