使用IAR时的严重问题

⚠️
嗨,...感谢您来论坛。令人兴奋的消息!我们现在正在迁至我们的新论坛平台,将提供更好的功能,并包含在主对话框网站中。所有帖子和帐户都已迁移。我们现在只接受新论坛上的流量 - 请发布任何新线程https://www.dialog-seminile.com/support.。我们将在未来几天修复错误/优化搜索和标记。
9 posts / 0 new
最后一篇
kevinchen_sz.
离线
最后一次露面:4 days 3 hours ago
加入:2017-12-06 09:24
使用IAR时的严重问题

你好,

我正在使用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处,它包含的地址。(重新映射为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].

设备:
PM_DIALOG.
离线
最后一次露面:3天16小时前
职员
加入:2018-02-08 11:03
嗨kevinchen_sz,

嗨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.

kevinchen_sz.
离线
最后一次露面:4 days 3 hours ago
加入:2017-12-06 09:24
是。它是prox_reporter \ IAR。

是。它是prox_reporter \ IAR。

但我认为它与应用程序代码无关。

使用来自编译器的这些Defement的代码位于System Init或Sleep Handler函数中。

PM_DIALOG.
离线
最后一次露面:3天16小时前
职员
加入:2018-02-08 11:03
嗨kevinchen_sz,

嗨kevinchen_sz,

您是否使用SDK提供的项目?Prox_Reporter \ IAR应该开箱即用,并由SDK提供。请使用清除的SDK目录尝试。

>>最后我找到了打破RAM的代码:

你的意思是你用它附着的调试器跑了里,这个项目崩溃了?

如果您可以在此问题上提供一些额外的信息/屏幕截图,那将是非常有帮助的。

谢谢,PM_DIALOG.

kevinchen_sz.
离线
最后一次露面:4 days 3 hours ago
加入:2017-12-06 09:24
我附上了我的截图

我附上了我的屏幕截图我终于找到了什么。

此问题的根本原因是:__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中只发现的上述问题。

附件:
PM_DIALOG.
离线
最后一次露面:3天16小时前
职员
加入:2018-02-08 11:03
嗨kevinchen_sz,

嗨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.

kevinchen_sz.
离线
最后一次露面:4 days 3 hours ago
加入:2017-12-06 09:24
两个都。

两个都。

我也尝试了不同版本的IAR。

都有同样的问题。

PM_DIALOG.
离线
最后一次露面:3天16小时前
职员
加入:2018-02-08 11:03
嗨kevinchen_sz,

嗨kevinchen_sz,

我将在内部升级这个来检查这一点,并会回复你。

谢谢,PM_DIALOG.

PM_DIALOG.
离线
最后一次露面:3天16小时前
职员
加入:2018-02-08 11:03
嗨Janosn,非常感谢

嗨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.