跳转到主要内容

全局变量覆盖问题

DA1468x

7个月前

全局变量覆盖问题

发布的mahmed10610分 3回复
0的问题

嗨对话框

我们正在开发基于DA14681的定制板,运行SDK 1.0.14。

问题是,在我的代码是基于PxpReporter,我正在做一些特定的BLE任务在高速。我在BLE上执行高速数据传输。在那之后,我的代码中的一个全局变量,得到一个垃圾值。

经过一些研究,我发现在c++中使用全局变量,不是一个好的实践,因为它可以从任何地方访问和覆盖。然后我把全局变量从uint8_t转换为INITIALISED_PRIVILEGED_DATA uint8_t,然后它工作得很好。

所以我有两个问题:

1 - INITIALISED_PRIVILEGED_DATA有某种受保护的内存吗?如果是,那么我应该将所有的全局变量转换为INITIALISED_PRIVILEGED_DATA吗?

2 -使用全局变量是一个好的实践还是一个坏的实践?从对话DA14681的编程角度来看?

7个月前

PM_Dialog

嗨mahmed106,

请看一下这些部分。查找任何SDK示例(例如ble_adv示例)中的ld,并搜索RetRAM0部分。privileged_data_init存储在retain - ram中。此外,这里所有的东西都进入了保留的RAM:

RETENTION_INIT0收集应该放在保留RAM中的所有代码和(非零初始化的)数据。

RETENTION_RAM0收集应该放在保留RAM中的所有零初始化数据。

RETENTION_BLE用于BLE ROM代码使用的硬编码数据区域。请不要再放别的东西了。

因此,为了将变量放入RAM的保留部分,您应该使用以下部分之一

Retention_mem_rw - privileged_data_rw - privileged_data_zi - retention_mem_zi

h文件中的宏可以用于将变量放置在所需的部分中。

当使用INITIALISED_PRIVILEGED_DATA时,变量将存储到privileged_data_init中,这是Ret-RAM的一个区域。

如果您正在使用任何一种睡眠模式,那么当设备唤醒时,如果全局变量没有存储到Ret-RAM中,那么它的值将不会被保留。

关于你的第二个问题,是应用程序特定的,取决于你试图做什么。

谢谢,PM_Dialog

7个月前

mahmed106 10分

是的,我理解ret ram帮助当我们从睡眠中醒来,但我的问题是,编译器的优化是在INITIALISED_PRIVILEGED_DATA或不是?

因为仅仅通过将一个普通的全局变量更改为INITIALISED_PRIVILEGED_DATA,它就不会得到垃圾……这让我认为可以在某种意义上保护这个内存不被覆盖。

7个月前

PM_Dialog

嗨mahmed106,

我无法理解编译器是如何与此相关的。链接器将区域设置为RAM/FLASH中保留或不保留,哪些变量/代码应该保留或不保留,以及它们的值是什么。启动文件将在该区域存储变量/代码。

一般来说,当系统有MPU(内存保护单元)时,“PRIVILEGED”不是将变量存储到保留区域的最佳方法。

为了存储变量/代码,建议使用sdk_defs.h头文件中的__RETAINED_XXX -请参见第190 - 218行。被设置为__RETAINED_XXX的变量应该是全局变量——任务中的变量被存储在已经被保留的OS_HEAP中。

谢谢,PM_Dialog