【急】RAM2K存儲(chǔ)區(qū)大小,使用,初始化及睡眠保持問(wèn)題

我希望將時(shí)間差值存放到RAM2K中,然后系統(tǒng)每次使用時(shí)間時(shí)都是RTC時(shí)間加差值。

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

按照上述方法,我在RAM2K中存下來(lái)這個(gè)差值數(shù)據(jù):

fa666de5d5b7393cf6f5f99869ab8d0.png但是第一次斷電后啟動(dòng),我連續(xù)打印了兩次數(shù)據(jù),發(fā)現(xiàn)存在問(wèn)題(變量為uint64_t類(lèi)型):

ed9914e3cf778d986dd69d74cc86296.png

0da883e5c0bac4dcb28e961fa3ae7cd.png

--------------------結(jié)構(gòu)體定義

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

---------------------結(jié)構(gòu)體聲明

typedef struct StubUserInfo {

? ? uint64_t timeSyncData;

? ? uint8_t drinkData[1528];

} StubUserInfo_t;

// 下電后的用戶(hù)存儲(chǔ)數(shù)據(jù)區(qū)(最多在V2.0庫(kù)中使用1536字節(jié))

extern StubUserInfo_t stubUserInfo;

---------------------------main函數(shù)

? ? /* 如果時(shí)間未同步,修改狀態(tài)為需要RTC同步,代表需要藍(lán)牙設(shè)置時(shí)間 */

? ? // BUG 存在問(wèn)題

? ? 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 {

? ? ? ? /* 如果時(shí)間已經(jīng)同步,將關(guān)閉藍(lán)牙功能 */

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

? ? ? ? bleCloseRf(0);

? ? }


我發(fā)現(xiàn)第一次打印的數(shù)值和第二次并不同,并且按理來(lái)說(shuō)要為0值,但并沒(méi)有,不知道什么原因。

我想實(shí)現(xiàn)的效果就是在燒錄后,系統(tǒng)啟動(dòng)時(shí)數(shù)值為0,此時(shí)系統(tǒng)會(huì)進(jìn)入需要RTC同步的狀態(tài)。之后設(shè)置變量差值后,系統(tǒng)會(huì)每次在上面代碼中檢測(cè)是否有這個(gè)差值,有則保持原狀,沒(méi)有則進(jìn)入同步狀態(tài)。


并且,我發(fā)現(xiàn)我在RAM2K中存儲(chǔ)的上面結(jié)構(gòu)體最大空間為1836個(gè)字節(jié),并沒(méi)有手冊(cè)提到的2048個(gè)字節(jié),因?yàn)橐坏┏^(guò)大小,編譯就會(huì)有錯(cuò),也想知道這個(gè)原因。


最后,希望知道下電睡眠時(shí),如果保持RAM2K有電,是否數(shù)據(jù)依然能保持。

RAM不掉電的情況下,數(shù)據(jù)是可以保持的。

RAM2K是可能有數(shù)據(jù)保存的,你的數(shù)據(jù)量占用不會(huì)達(dá)到2K的,如果是幾個(gè)字節(jié)直接保持在RAM。如果數(shù)據(jù)量比較大還是建議放在dataflash中,防止RAM過(guò)多被占用。

你說(shuō)的ram數(shù)據(jù),如果不進(jìn)行修改,那數(shù)據(jù)就是保持的。


我發(fā)現(xiàn)實(shí)際是uint64_t和newlib的兼容性問(wèn)題:

關(guān)于MounRiver編譯器配置的若干問(wèn)題 - JayWell - 博客園 (cnblogs.com)09c130d65cc6acbfa78f06f0078b440.png



最后有個(gè)問(wèn)題,就是假如我編譯最大空間為1836個(gè)字節(jié)可以通過(guò),那么貴司沒(méi)有開(kāi)源的部分在系統(tǒng)工作中還可能往這里放數(shù)據(jù)嗎?


因?yàn)檫@會(huì)引起芯片重啟等問(wèn)題,但是RAM2K數(shù)據(jù)區(qū)又對(duì)我很重要,F(xiàn)lash的數(shù)據(jù)也有考慮過(guò),但數(shù)據(jù)變化太頻繁,不適合。



已經(jīng)解決,官方開(kāi)發(fā)那邊說(shuō)程序中未使用最后2k,并且--section-start=.RAM2KUSE=0x20007C00這種方式生成的HEX文件,官方開(kāi)發(fā)這邊不能進(jìn)行修復(fù)成可被ISP燒錄的格式,而且這種方式會(huì)導(dǎo)致使用不完全的情況。

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

8922493e3aa14755738058c227bd261.png


只有登錄才能回復(fù),可以選擇微信賬號(hào)登錄

国产91精品新入口,国产成人综合网在线播放,九热这里只有精品,本道在线观看,美女视频a美女视频,韩国美女激情视频,日本美女pvp视频