你好,
我正在使用IAR(8.11.1)进行开发。
我发现了一个严重的问题,一些值总是在引导时改变。
最后我找到了破坏RAM的代码:
void arch_rom_init(void) {#if define (__DA14531__) && (!USE_CHACHA20_RAND) //存储_rand_state的值stdlib/rand.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;#if define (__DA14531__) && (USE_TRNG) //给定DA14531辅助引导加载程序和flash程序员// (UART版本)保持不变的内存区域之间的RAM_UNINIT_START_ADDRESS和RAM_UNINIT_END_ADDRESS地址,//这个内存区域可以用来为TRNG缓冲区提供真实的随机数据(RAM块上电后的随机值)。// TRNG缓冲区的最大大小是RAM_UNINIT_END_ADDRESS和RAM_UNINIT_START_ADDRESS之间的差异。注意:如果应用程序使用Free Area区域,则应该重新计算最大TRNG缓冲区大小(检查// scatter文件)。 In any case, if the used TRNG buffer size is // small enough, the TRNG algorithm will operate with true random // data independently to the maximum size used in the following // memory copy. 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。
但是我发现在boot。h中,所有的定义都被编译为0。(在keil项目上,它包含正确的地址)
在地址0,它包含
然后从
/** **************************************************************************************** * * @ 文件boot.h * * @brief这个文件包含引导相关变量的声明。* *版权所有(C) 2019-2020yabo国际娱乐*此计算机程序包括Dialog Semiconductor的机密、专有信息*。yabo国际娱乐保留所有权利。* **************************************************************************************** */ # 如果未定义_BOOT_H_ # define _BOOT_H_ # include < stdint.h >走读生const uint32_t __ER_IROM3_BASE__ [];#define CODE_AREA_BASE ((uint32_t)__ER_IROM3_BASE__) extern const uint32_t __ER_IROM3_LENGTH__[];#define CODE_AREA_LENGTH ((uint32_t)__ER_IROM3_LENGTH__) #pragma section = "。retention_mem_area_uninit" #define RET_MEM_BASE (*(uint32_t*)(__section_begin(".retention_mem_area_uninit"))) #pragma section = "。#define 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 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_ . php . php . php . php . php . php . php . php . php . php . php . php . php . php . php . php . php . php . php . php . php . php
进一步,
即使地址是对的
如何保证section[heap_db_area]大于(RAM_UNINIT_END_ADDRESS - RAM_UNINIT_START_ADDRESS)?
如果编译器将一些初始化的变量放在secton[heap_db_area]之后,仍然存在风险。
设备:
嗨kevinchen_sz,
抱歉回复晚了,新年快乐。请问您是否正在使用SDK中的prox_reporter IAR项目来复制这个问题?我指的是位于projects\target_apps\ble_examples\prox_reporter\IAR SDK路径中的项目。
谢谢,PM_Dialog
是的。这是prox_reporter \ IAR。
但我认为这与应用程序代码无关。
编译器中使用这些定义的代码位于系统初始化或休眠处理程序函数中。
嗨kevinchen_sz,
是否使用SDK提供的项目?prox_reporter\IAR应该是开箱即用的,并且由SDK提供。请尝试使用一个清晰的SDK目录。
>>最后我找到了破坏RAM的代码:
你的意思是你带着附加的调试器跑进去,然后项目崩溃了吗?
如果你能提供一些关于这个问题的额外信息/截图,将非常有帮助。
谢谢,PM_Dialog
我附上了我最后发现的截图。
这个问题的根本原因是:"boot.h"中的__section_begin()和__section_end()没有返回正确的地址,而是0。
见附件中的截图。
在“boot.h”中使用宏有两部分:
1.arch_rom.c,当定义CFG_TRNG时
这导致崩溃
2.arch_main.c,当启用睡眠时
睡眠代码用于计算哪个RAM块需要保留。
以上问题只在IAR IDE中发现。
嗨kevinchen_sz,
谢谢你的截图。还有一个问题,我将在内部升级以复制它:您是否使用SDK提供的项目,或者您做过任何修改?
谢谢,PM_Dialog
两者都有。
我也尝试了不同版本的IAR。
所有人都有同样的问题。
嗨kevinchen_sz,
我会在内部升级,查清楚后再给你答复。
谢谢,PM_Dialog
你好,janosN,非常感谢您的意见和宝贵的反馈!我们将审查你所有的意见/解决方案。
Hi sfuentes-digi,感谢你证实这一点!
如果您对无代码有任何其他问题或反馈,请提出一个新的论坛门票!
谢谢,PM_Dialog