你好,
我使用IAR(8.11.1)来开发。
我发现了一个严重的问题,一些值总是在启动时更改。
最后我找到了打破RAM的代码:
void arch_rom_init(void) {#if defined (__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 defined (__DA14531__) && (USE_TRNG) //给定DA14531辅助引导加载器和flash编程器// (UART版本)保留// RAM_UNINIT_START_ADDRESS和RAM_UNINIT_END_ADDRESS地址之间的内存区域不动,//该内存区域可用于向TRNG缓冲区提供// true随机数据(RAM块上电后的随机值)。// TRNG缓冲区的最大大小是RAM_UNINIT_END_ADDRESS和RAM_UNINIT_START_ADDRESS的差值。// //注意:最大TRNG缓冲区大小应该重新计算//如果应用程序使用Free Area区域(检查//散点文件)。在任何情况下,如果使用的TRNG缓冲区大小//足够小,TRNG算法将对true随机//数据独立操作,直到以下//内存拷贝中使用的最大大小。 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这个文件包含引导相关变量的声明。* * Copyright (C) 2019-2020 yabo国际娱乐Dialog Semiconductor。*此计算机程序包含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" #定义RET_MEM_BASE (*(uint32_t*)(__section_begin(".retention_mem_area_uninit"))) #pragma section = "。#定义NON_RET_HEAP_BASE (*(uint32_t*)(__section_begin(".heap_mem_area_not_ret"))) #定义NON_RET_HEAP_END (*(uint32_t*)(__section_end(".heap_mem_area_not_ret"))) #定义NON_RET_HEAP_LENGTH (NON_RET_HEAP_END - NON_RET_HEAP_BASE) #pragma section = "。heap_db_area" #定义DB_HEAP_BASE (*(uint32_t*)(__section_begin(".heap_db_area"))) #定义DB_HEAP_END (*(uint32_t*)(__section_end(".heap_db_area"))) #定义DB_HEAP_LENGTH (DB_HEAP_END - DB_HEAP_BASE) #endif // _BOOT_H_ . heap_length
进一步,
即使地址是对的
它如何保证section[heap_db_area]大于(RAM_UNINIT_END_ADDRESS - RAM_UNINIT_START_ADDRESS)?
如果编译器将一些初始化变量放在section [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提供的项目?proxy_reporter \IAR应该开箱即用,并由SDK提供。请使用清晰的SDK目录进行尝试。
最后我找到了打破RAM的代码:
你的意思是你运行时附加了调试器,项目崩溃了吗?
如果您能就这个问题提供一些额外的信息/截图,将非常有帮助。
谢谢,PM_Dialog
我附上了我最后发现的截图。
这个问题的根本原因是:“boot.h”中的__section_begin()和__section_end()没有返回正确的地址,而是返回零。
见附件中的截图。
在“boot.h”中有两个部分使用了宏:
1.arch_rom.c,当CFG_TRNG被定义时
这导致崩溃
2.arch_main.c,当启用睡眠时
sleep代码用于计算哪个RAM块需要保留。
以上问题只在IAR IDE中发现。
嗨kevinchen_sz,
谢谢你的截图。还有一个问题,我将在内部升级它以复制它:您是否使用SDK提供的项目,或者您是否做了任何修改?
谢谢,PM_Dialog
两者都有。
我也尝试了不同版本的IAR。
所有人都有同样的问题。
嗨kevinchen_sz,
我会在内部升级这件事,核实一下,然后再回复你。
谢谢,PM_Dialog
感谢您的更新和快速回复。我一定会留意这条线索的。寻找同样的问题。撞到你的线了。
myfordbenefits
你好,janosN,非常感谢您的评论和宝贵的反馈!我们将审阅您的所有评论/解决方案。
嗨,sfuentes-digi,感谢您的验证!
如果您有任何其他的问题或反馈,请提出新的论坛票!
谢谢,PM_Dialog