【急】RAM2K存储区大小,使用,初始化及睡眠保持问题

我希望将时间差值存放到RAM2K中,然后系统每次使用时间时都是RTC时间加差值。

https://www.cnblogs.com/debugdabiaoge/p/16617533.html

按照上述方法,我在RAM2K中存下来这个差值数据:

fa666de5d5b7393cf6f5f99869ab8d0.png但是第一次断电后启动,我连续打印了两次数据,发现存在问题(变量为uint64_t类型):

ed9914e3cf778d986dd69d74cc86296.png

0da883e5c0bac4dcb28e961fa3ae7cd.png

--------------------结构体定义

__attribute__((section(".RAM2KSTART"))) StubUserInfo_t stubUserInfo = {0};

---------------------结构体声明

typedef struct StubUserInfo {

? ? uint64_t timeSyncData;

? ? uint8_t drinkData[1528];

} StubUserInfo_t;

// 下电后的用户存储数据区(最多在V2.0库中使用1536字节)

extern StubUserInfo_t stubUserInfo;

---------------------------main函数

? ? /* 如果时间未同步,修改状态为需要RTC同步,代表需要蓝牙设置时间 */

? ? // BUG 存在问题

? ? PRINT("time sync:%lu\n", stubUserInfo.timeSyncData);

? ? // stubUserInfo.timeSyncData = 0;

? ? PRINT("time sync:%lu\n", stubUserInfo.timeSyncData);

? ? if (stubUserInfo.timeSyncData == 0UL) {

? ? ? ? deviceState = kStateWaitRtcSync;

? ? ? ? UART1_SendString("\ntime nsync\n", 12);

? ? } else {

? ? ? ? /* 如果时间已经同步,将关闭蓝牙功能 */

? ? ? ? UART1_SendString("\ntime sync!\n", 12);

? ? ? ? bleCloseRf(0);

? ? }


我发现第一次打印的数值和第二次并不同,并且按理来说要为0值,但并没有,不知道什么原因。

我想实现的效果就是在烧录后,系统启动时数值为0,此时系统会进入需要RTC同步的状态。之后设置变量差值后,系统会每次在上面代码中检测是否有这个差值,有则保持原状,没有则进入同步状态。


并且,我发现我在RAM2K中存储的上面结构体最大空间为1836个字节,并没有手册提到的2048个字节,因为一旦超过大小,编译就会有错,也想知道这个原因。


最后,希望知道下电睡眠时,如果保持RAM2K有电,是否数据依然能保持。

RAM不掉电的情况下,数据是可以保持的。

RAM2K是可能有数据保存的,你的数据量占用不会达到2K的,如果是几个字节直接保持在RAM。如果数据量比较大还是建议放在dataflash中,防止RAM过多被占用。

你说的ram数据,如果不进行修改,那数据就是保持的。


我发现实际是uint64_t和newlib的兼容性问题:

关于MounRiver编译器配置的若干问题 - JayWell - 博客园 (cnblogs.com)09c130d65cc6acbfa78f06f0078b440.png



最后有个问题,就是假如我编译最大空间为1836个字节可以通过,那么贵司没有开源的部分在系统工作中还可能往这里放数据吗?


因为这会引起芯片重启等问题,但是RAM2K数据区又对我很重要,Flash的数据也有考虑过,但数据变化太频繁,不适合。



已经解决,官方开发那边说程序中未使用最后2k,并且--section-start=.RAM2KUSE=0x20007C00这种方式生成的HEX文件,官方开发这边不能进行修复成可被ISP烧录的格式,而且这种方式会导致使用不完全的情况。

可以使用这种方法:LD文件中直接分配30k的ram,然后用指针操作最后的2k,

8922493e3aa14755738058c227bd261.png


只有登录才能回复,可以选择微信账号登录