跳到主要内容

全局变量覆盖问题

da1468x.

7个月前

全局变量覆盖问题

张贴了Mahmed106.10分 3回复
0旋转

嗨对话框

我们正在根据DA14681在运行SDK 1.0.14的定制板上工作。

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

在一些研究之后,我发现在C ++中使用全局变量不是一个很好的做法,因为它可以从任何地方访问和覆盖它。然后我将来自uint8_t的全局变量转换为initialised_privileged_data uint8_t,然后它工作正常。

所以我有两个问题:

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

2 - 使用全局变量是一种良好的做法或糟糕的做法?来自Dialog DA14681的编程观点?

7个月前

PM_DIALOG.

嗨mahmed106,

请查看从任何SDK示例(例如BLE_ADV examply)并搜索到REDLAM0部分中的部分。privileged_data_init存储到保留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

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

当使用initialised_privileged_data时,该变量将被存储为privileged_data_init,它是RET-RAM的一个区域。

如果您使用的是任何睡眠模式,当设备唤醒时,如果全局变量尚未存储到RET-RAM中,则不会保留其值。

关于您的第二个问题,是特定于应用程序的,取决于您想要做的事情。

谢谢,PM_DIALOG.

7个月前

Mahmed106. 10分

是的,我明白,ret公羊在唤醒睡眠时有助于,但我的问题是编译器的优化是在initialised_privileged_data上完成的?

因为只需将正常的全局变量更改为initialised_privileged_data,所以它没有垃圾,,,让我认为可以在某种意义上保护此内存免受覆盖。

7个月前

PM_DIALOG.

嗨mahmed106,

我无法理解编译器如何与此相关。链接器扫描将区域设置为保留的RAM /闪存,并且应保留哪些变量/代码,或者也不是什么样的值。启动文件将存储该区域中的变量/代码。

通常,“特权”不是最佳使用方式,将变量存储到保留区域,因为系统具有MPU(存储器保护单元)。

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

谢谢,PM_DIALOG.