你好,
我正在使用IAR(8.11.1)发展。
我发现了一个严重的问题,即启动时始终会更改某些值。
最后,我找到了破坏RAM的代码:
void arch_rom_init(void){#if定义(__da14531__)&&(!use_chacha20_rand)// store值_rand_state stdlib / rand.cr warssum puint32_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;#f定义(__da14531__)&&(use_trng)//给定DA14531次级引导加载程序和Flash程序员//(UART版本)叶未被驱动为// raminit_start_address和ram_uninit_end_address地址的内存区域,//该存储区域可用于源Trng缓冲区具有//真实随机数据(RAM块电源后的随机值)。// trng缓冲区的最大大小是// raminit_end_address和ram_uninit_start_address之间的区别。// //注意:如果应用程序使用空闲区域区域(检查// scatter文件),则应重新计算最大TRNG缓冲区大小//。 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处,它包含
然后数据从
/** **************************************************************************************** * * @file boot.h * * @brief This file contains the declarations of the boot related variables. * * Copyright (C) 2019-2020 Dialog Semiconductor. * This computer program includes Confidential, Proprietary Information * of Dialog Semiconductor. All Rights Reserved. * **************************************************************************************** */ #ifndef _BOOT_H_ #define _BOOT_H_ #include extern 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 = ".heap_mem_area_not_ret" #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 NON_RET_HEAP_LENGTH (NON_RET_HEAP_END - NON_RET_HEAP_BASE) #pragma section = ".heap_db_area" #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_
更多,
即使地址是对的,
如何承诺[heap_db_area]介绍大于(ram_uninit_end_address - ram_uninit_start_address)的部分?
it is still a risk if the compiler put some initialed variables after secton[heap_db_area].
设备:
嗨kevinchen_sz,
Apologies for the late response and happy new year. Can you please indicate if you are using the prox_reporter IAR project from the SDK to replicate this issue? I mean project that is located in projects\target_apps\ble_examples\prox_reporter\IAR SDK path.
谢谢,PM_DIALOG.
是。它是prox_reporter \ IAR。
但我认为它与应用程序代码无关。
使用来自编译器的这些Defement的代码位于System Init或Sleep Handler函数中。
嗨kevinchen_sz,
您是否使用SDK提供的项目?Prox_Reporter \ IAR应该开箱即用,并由SDK提供。请使用清除的SDK目录尝试。
>>最后我找到了打破RAM的代码:
你的意思是你用它附着的调试器跑了里,这个项目崩溃了?
如果您可以在此问题上提供一些额外的信息/屏幕截图,那将是非常有帮助的。
谢谢,PM_DIALOG.
我附上了我的屏幕截图我终于找到了什么。
此问题的根本原因是:__section_begin()和__section_end()在“boot.h”中,不要返回正确的地址但零。
请参阅截留文件中的屏幕截图。
两个部分在“boot.h”中使用宏:
1.arch_rom.c,当定义CFG_TRNG时
这导致崩溃
2.arch_main.c,when sleep is enabled
sleep code use to calculate which RAM block need retention.
在IAR IDE中只发现的上述问题。
嗨kevinchen_sz,
Thanks for the screenshot. One more question and I’ll escalate it internally to replicate it: are you using the project as provided by the SDK, or have you done any modification?
谢谢,PM_DIALOG.
两个都。
我也尝试了不同版本的IAR。
都有同样的问题。
嗨kevinchen_sz,
我将在内部升级这个来检查这一点,并会回复你。
谢谢,PM_DIALOG.
嗨Janosn,非常感谢comments and for your valuable feedback! We’ll review all your comments/solutions.
嗨Sfuentes-Digi,谢谢你验证这个!
If you have any other question or feedback on the CodeLess, please raise a new forum ticket!
谢谢,PM_DIALOG.