找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4287|回復(fù): 9
收起左側(cè)

單片機(jī)C語言xdata應(yīng)該怎么怎么正確使用?

[復(fù)制鏈接]
ID:1044091 發(fā)表于 2022-12-22 22:18 | 顯示全部樓層 |閱讀模式
最近用單片機(jī)C語言編程感覺data消耗的比較快,就想著嘗試使用xdata。畢竟xdata比data空間大太多了,不用放著也浪費(fèi)。但是剛開始時(shí)會出現(xiàn)莫名其妙的問題,比如變量值初始化時(shí)就不對了,或者更改菜單再切換回來值也不對(一般是浮點(diǎn)數(shù)出問題)。后來把內(nèi)部變量都用static 修飾,倒是正常了,但還有點(diǎn)不放心。keil5設(shè)置默認(rèn)值沒動(dòng)。想請教的是:

1、256字節(jié)的data值,一般建議最大占用到多少?

2、xdata使用時(shí)要注意什么?所有函數(shù)內(nèi)部變量都要static 修飾嗎?

回復(fù)

使用道具 舉報(bào)

ID:883242 發(fā)表于 2022-12-22 23:34 | 顯示全部樓層
1)data屬性的變量最多只有120字節(jié)。也就是低128字節(jié),減去至少一個(gè)register bank 8字節(jié),如果你用到了using關(guān)鍵字使用了其他的bank,那么使用一個(gè)再減去8字節(jié)。

2)ram空間高128字節(jié)必須聲明為idata才可以訪問,同時(shí)要留足堆?臻g,堆棧的最大使用量是(程序調(diào)用最大嵌套層數(shù)+中斷調(diào)用最大嵌套層數(shù))x2。

3)xdata要比data慢得多,其他沒有限制,如果你加了static解決了問題,那么不加static是不是xdata都會有問題。
回復(fù)

使用道具 舉報(bào)

ID:1044091 發(fā)表于 2022-12-23 10:53 | 顯示全部樓層
Hephaestus 發(fā)表于 2022-12-22 23:34
1)data屬性的變量最多只有120字節(jié)。也就是低128字節(jié),減去至少一個(gè)register bank 8字節(jié),如果你用到了usin ...

又增加了幾個(gè)變量,應(yīng)該是開始報(bào)RAM溢出了。前輩的解答太及時(shí)了!

還有一個(gè)問題,xdata要比data慢得多,這個(gè)說法我也總看到,但是究竟慢多少,有沒有可以量化的數(shù)值?或者怎么直觀的感受到?什么樣的變量適合放在xdata中呢?


*** ERROR L107: ADDRESS SPACE OVERFLOW
    SPACE:   DATA   
    SEGMENT: ?DT?SHAN
    LENGTH:  0060H
*** ERROR L105: PUBLIC REFERS TO IGNORED SEGMENT
    SYMBOL:  FF1
    SEGMENT: ?DT?SHAN
下面還有很多 ERROR L105
回復(fù)

使用道具 舉報(bào)

ID:1034262 發(fā)表于 2022-12-23 11:00 | 顯示全部樓層
C51編譯后data不超過200不用太擔(dān)心,但是超過200就要留意+小心,不要導(dǎo)致堆棧溢出。
xdata沒有什么要注意的,我也不用加static,定義時(shí)指定為xdata即可,用了超過20年,沒約到過問題。
回復(fù)

使用道具 舉報(bào)

ID:814525 發(fā)表于 2022-12-23 16:05 | 顯示全部樓層
xdata沒有什么要注意的,不用加static。只是定義之后,xdata變量的初始值是隨機(jī)的,初始化清零就沒什么問題。
回復(fù)

使用道具 舉報(bào)

ID:161164 發(fā)表于 2022-12-23 17:45 | 顯示全部樓層
ningsy 發(fā)表于 2022-12-23 10:53
又增加了幾個(gè)變量,應(yīng)該是開始報(bào)RAM溢出了。前輩的解答太及時(shí)了!

還有一個(gè)問題,xdata要比data慢得多 ...

可以由仿真看到差多少下面的代碼中,
Delay250us()是由STC-ISP生成的延時(shí)
Delay250usX()是把其中的變量改為xdata
2022-12-23_173416.png
上圖中箭咀所指的是運(yùn)行Delay250us()前的步數(shù)(628)

2022-12-23_173429.png
上圖中箭咀所指的是運(yùn)行Delay250us()后的步數(shù)(878)
878-628=250步

2022-12-23_173440.png
上圖中箭咀所指的是運(yùn)行Delay250usX()后的步數(shù)(1986)
1986-878=1108步
1108/250=4.432倍

從而得知xdata比普通data大約慢4.4倍

評分

參與人數(shù) 1黑幣 +5 收起 理由
angmall + 5 贊一個(gè)!

查看全部評分

回復(fù)

使用道具 舉報(bào)

ID:401564 發(fā)表于 2022-12-23 21:06 | 顯示全部樓層
程序如果沒有什么問題,就不要去折騰這些,XDATA多就多咯,難不成單片機(jī)有64K的內(nèi)存,你就要寫完嗎?
如果是基于學(xué)習(xí)的目的,那就去學(xué)匯編,尋址方式不一樣,占用的時(shí)間也不一樣,不同的C代碼產(chǎn)生的差別是不一樣的,沒法有一個(gè)絕對的公式給你
程序中頻繁調(diào)用的,頻繁參與運(yùn)算的,就用原有的那點(diǎn)RAM
其它的不是頻繁用的,就放在XDATA就行了,比如GPS模塊的數(shù)據(jù),動(dòng)不動(dòng)就是上百個(gè)字節(jié)的數(shù)據(jù),但有的模塊是0.5S才發(fā)送一次數(shù)據(jù)
回復(fù)

使用道具 舉報(bào)

ID:1044091 發(fā)表于 2022-12-23 23:02 來自觸屏版 | 顯示全部樓層
lkc8210 發(fā)表于 2022-12-23 17:45
可以由仿真看到差多少下面的代碼中,
Delay250us()是由STC-ISP生成的延時(shí)
Delay250usX()是把其中的變量 ...

了解了,非常感謝!
回復(fù)

使用道具 舉報(bào)

ID:1044091 發(fā)表于 2022-12-23 23:21 來自觸屏版 | 顯示全部樓層
Y_G_G 發(fā)表于 2022-12-23 21:06
程序如果沒有什么問題,就不要去折騰這些,XDATA多就多咯,難不成單片機(jī)有64K的內(nèi)存,你就要寫完嗎?
如果是基 ...

是因?yàn)樵谧鲆豢畋每刂破,大概進(jìn)度一半多,發(fā)現(xiàn)已經(jīng)占用100多字節(jié)data空間了,所以拓展變量空間已經(jīng)成了很急迫的事情。
回復(fù)

使用道具 舉報(bào)

ID:879348 發(fā)表于 2022-12-24 08:47 | 顯示全部樓層
在C語言里直接用啊,除了速度比data慢,其他都是一樣用
回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表