欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4935|回復: 9
收起左側

單片機C語言xdata應該怎么怎么正確使用?

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

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

2、xdata使用時要注意什么?所有函數內部變量都要static 修飾嗎?

回復

使用道具 舉報

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

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

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

使用道具 舉報

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

又增加了幾個變量,應該是開始報RAM溢出了。前輩的解答太及時了!

還有一個問題,xdata要比data慢得多,這個說法我也總看到,但是究竟慢多少,有沒有可以量化的數值?或者怎么直觀的感受到?什么樣的變量適合放在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
回復

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

ID:161164 發表于 2022-12-23 17:45 | 顯示全部樓層
ningsy 發表于 2022-12-23 10:53
又增加了幾個變量,應該是開始報RAM溢出了。前輩的解答太及時了!

還有一個問題,xdata要比data慢得多 ...

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

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

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

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

評分

參與人數 1黑幣 +5 收起 理由
angmall + 5 贊一個!

查看全部評分

回復

使用道具 舉報

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

使用道具 舉報

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

了解了,非常感謝!
回復

使用道具 舉報

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

是因為在做一款泵控制器,大概進度一半多,發現已經占用100多字節data空間了,所以拓展變量空間已經成了很急迫的事情。
回復

使用道具 舉報

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表