找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 7458|回復(fù): 21
打印 上一主題 下一主題
收起左側(cè)

STC單片機(jī)使用XDATA變量出問(wèn)題,有高手幫忙看一下

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:419909 發(fā)表于 2021-10-21 16:28 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
用的是STC 的8G2K64S4,先說(shuō)一下目前狀況,我以前一般做些小東西。用不了太多變量。一直是用Keil 默認(rèn)模式。即所有變量使用 DATA的。后面因?yàn)楫a(chǎn)品需要。變量需要用到XDATA時(shí),才選PDATA或者XDATA模式。但是這兩種模式都非常容易出問(wèn)題。經(jīng)常是打印結(jié)果不正確。或者亂碼。好像這些變量的值會(huì)相互串?dāng)_一樣。這種情況發(fā)生在我目前使用的好幾個(gè)型號(hào)了。比如15W4K。如果全部變量用DATA就沒(méi)問(wèn)題,但是這樣的話。變量不夠用。解決不了問(wèn)題,

下面圖片就是目前遇到的情況:
比如這個(gè)tem[]數(shù)組。目前放在函數(shù)內(nèi),那么這個(gè)功能函數(shù)可以正常。但是另一個(gè)函數(shù)的變量卻出問(wèn)題。
假如把tem[]放到頭件內(nèi)。變量公共變量,那么問(wèn)題又來(lái)了。這個(gè)函數(shù)顯示不正常。但是另一個(gè)函數(shù)卻又能正常了。
真是頭大。有試過(guò)把這個(gè)變量的類(lèi)型改為DATA或者XDATA。都不行。總有一個(gè)函數(shù)出錯(cuò)。
這個(gè)問(wèn)題已經(jīng)折磨我2天了。問(wèn)一下有沒(méi)有遇到過(guò)相同問(wèn)題的黑友。

setup.JPG (74.66 KB, 下載次數(shù): 106)

系統(tǒng)設(shè)置。PDATA

系統(tǒng)設(shè)置。PDATA

code.JPG (20.23 KB, 下載次數(shù): 107)

TEM數(shù)組

TEM數(shù)組
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂1 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:57657 發(fā)表于 2021-10-21 18:11 | 只看該作者
Keil5退回4試試,不同版本編譯出來(lái)的大小都不一樣。
回復(fù)

使用道具 舉報(bào)

板凳
ID:94031 發(fā)表于 2021-10-21 18:34 | 只看該作者
應(yīng)該是優(yōu)化級(jí)別問(wèn)題,不是使用XDATA變量出問(wèn)題。
回復(fù)

使用道具 舉報(bào)

地板
ID:624769 發(fā)表于 2021-10-21 19:01 | 只看該作者
設(shè)置里, Memory 選Small in DATA  不要選PDATA 和 XDATA
代碼里聲明的時(shí)候,手動(dòng)標(biāo)注  pdata xdata 即可
不然編譯會(huì)把所有聲明變量的時(shí)候, 沒(méi)有 標(biāo)DATA 的 編譯成 PDATA或者XDATA,而你代碼里沒(méi)有聲明 unsigned char data 這個(gè)習(xí)慣的吧?所以Memory Model  就不要?jiǎng),固定small
回復(fù)

使用道具 舉報(bào)

5#
ID:419909 發(fā)表于 2021-10-21 19:18 | 只看該作者
188610329 發(fā)表于 2021-10-21 19:01
設(shè)置里, Memory 選Small in DATA  不要選PDATA 和 XDATA
代碼里聲明的時(shí)候,手動(dòng)標(biāo)注  pdata xdata 即可
...

感謝回復(fù),Small in DATA模式也是一樣的。而且在Small in DATA模式下。手工標(biāo)注XDATA變量更容易出問(wèn)題。特別是用在函數(shù)傳參數(shù)的時(shí)候。
回復(fù)

使用道具 舉報(bào)

6#
ID:419909 發(fā)表于 2021-10-21 19:19 | 只看該作者
xuyaqi 發(fā)表于 2021-10-21 18:34
應(yīng)該是優(yōu)化級(jí)別問(wèn)題,不是使用XDATA變量出問(wèn)題。

目前優(yōu)化級(jí)別是8級(jí),系統(tǒng)默認(rèn)值。我遲點(diǎn)試試更低一些級(jí)的。
回復(fù)

使用道具 舉報(bào)

7#
ID:624769 發(fā)表于 2021-10-21 19:34 | 只看該作者
wfqxgw 發(fā)表于 2021-10-21 19:18
感謝回復(fù),Small in DATA模式也是一樣的。而且在Small in DATA模式下。手工標(biāo)注XDATA變量更容易出問(wèn)題。 ...

你代碼里那個(gè) bit idata 是什么情況? bit的話,只能是DATA 雖然 IDATA分布 0~ff 其中包含了BIT的0x20~0x2F但是,在匯編角度 DATA 和 IDATA屬于兩個(gè)分類(lèi), bit 只能隸屬于 DATA的BITADDRESS, 而不能隸屬于 IDATA
回復(fù)

使用道具 舉報(bào)

8#
ID:419909 發(fā)表于 2021-10-21 19:46 | 只看該作者
188610329 發(fā)表于 2021-10-21 19:34
你代碼里那個(gè) bit idata 是什么情況? bit的話,只能是DATA 雖然 IDATA分布 0~ff 其中包含了BIT的0x20~0x ...

感謝指正。我這邊寫(xiě)錯(cuò)。那應(yīng)該是bit bdata 最好。之所以用idata,我以為是這個(gè)是位尋址的。其實(shí)主要還是想省內(nèi)存。經(jīng)常跟這些小容易單下機(jī)摳內(nèi)存。希望各個(gè)變量都能達(dá)到最大化使用效率。。
一般經(jīng)常用到的對(duì)讀速度要求快的,我用DATA和PDATA。普通的就用XDATA.
回復(fù)

使用道具 舉報(bào)

9#
ID:624769 發(fā)表于 2021-10-21 20:47 | 只看該作者
wfqxgw 發(fā)表于 2021-10-21 19:46
感謝指正。我這邊寫(xiě)錯(cuò)。那應(yīng)該是bit bdata 最好。之所以用idata,我以為是這個(gè)是位尋址的。其實(shí)主要還是 ...

其實(shí),STC單片機(jī),你啟用雙DPTR數(shù)據(jù)指針功能的話,XDATA的效率比PDATA高。因?yàn)镻DATA的關(guān)鍵Ri寄存器可能會(huì)被其他程序占用,而你程序設(shè)計(jì)的好的話,可以把一路DPTR指針給你XDATA專(zhuān)用。那么不需要反復(fù)賦值,還能定義自增自減,不管代碼量還是執(zhí)行速度都要比PDATA高。
回復(fù)

使用道具 舉報(bào)

10#
ID:419909 發(fā)表于 2021-10-21 21:38 | 只看該作者
188610329 發(fā)表于 2021-10-21 20:47
其實(shí),STC單片機(jī),你啟用雙DPTR數(shù)據(jù)指針功能的話,XDATA的效率比PDATA高。因?yàn)镻DATA的關(guān)鍵Ri寄存器可能會(huì) ...

這個(gè)我還不太清楚。沒(méi)試過(guò)。按以前的話。明顯感覺(jué)XDATA很慢的。頻繁讀取寫(xiě)的話。刷新率一下總體至少50%。PDATA相對(duì)沒(méi)什么變化。至少感覺(jué)不到太多。
另外。XDATA問(wèn)題還是解決不了。用了idata和DATA做為變量都不行。剛剛用了一個(gè)將錯(cuò)就錯(cuò)方案。之前不是感覺(jué)這些變量?jī)?nèi)容有串?dāng)_嗎?現(xiàn)在我折中一個(gè)方案。把這個(gè)數(shù)組位置增加多一位。tem[16]改為tem[17],居然解決了。是不是完全沒(méi)問(wèn)題還不知道。至少目前各個(gè)功能正常。先說(shuō)一下。
回復(fù)

使用道具 舉報(bào)

11#
ID:401564 發(fā)表于 2021-10-21 22:41 | 只看該作者
系統(tǒng)設(shè)置。PDATA,這個(gè)不變
把tem 數(shù)組的PDATA不要了
直接 unsigned char tem[16]
試一下
回復(fù)

使用道具 舉報(bào)

12#
ID:90212 發(fā)表于 2021-10-21 22:42 | 只看該作者
你這個(gè)問(wèn)題跟我前兩天發(fā)的“stc15單片機(jī)串口通信的詭異問(wèn)題”似乎有關(guān)聯(lián),你有興趣可以下載附件測(cè)試下
回復(fù)

使用道具 舉報(bào)

13#
ID:624769 發(fā)表于 2021-10-21 23:25 | 只看該作者
wfqxgw 發(fā)表于 2021-10-21 21:38
這個(gè)我還不太清楚。沒(méi)試過(guò)。按以前的話。明顯感覺(jué)XDATA很慢的。頻繁讀取寫(xiě)的話。刷新率一下總體至少50%。 ...

看到你設(shè)置里,單片機(jī)選的STC15W408AS, 但是,你說(shuō)你單片機(jī)的型號(hào)是8G2K64S4,所以最好你重新選一下,然后把On-chipROM,和On_chipXRAM都打個(gè)勾試試。雖然,型號(hào)選擇應(yīng)該關(guān)系不大,但是由于寄存器策略有不少變化,可能會(huì)在編譯時(shí)轉(zhuǎn)匯編的過(guò)程對(duì)PDATA調(diào)用有一定影響。畢竟PDATA本來(lái)就比較特殊,調(diào)用方式每家都不一樣,STC是規(guī)定最開(kāi)始的256字節(jié),WCH的話,是通過(guò)每256字節(jié)的分頁(yè)方式,可以整個(gè)XRAM都用PDATA調(diào)用,所以不排除型號(hào)沒(méi)選對(duì),編譯器就罷工的可能。
回復(fù)

使用道具 舉報(bào)

14#
ID:419909 發(fā)表于 2021-10-22 07:50 | 只看該作者
Y_G_G 發(fā)表于 2021-10-21 22:41
系統(tǒng)設(shè)置。PDATA,這個(gè)不變
把tem 數(shù)組的PDATA不要了
直接 unsigned char tem[16]

試過(guò)了的。在variables in PDATA模式下。不加修飾,系統(tǒng)是按XDATA定義的。我也試過(guò)手工加unsigned char data tem[16],問(wèn)題一樣的。這些變量在內(nèi)存里面估計(jì)是有位置共用。但是在退出函數(shù)時(shí)。不能及時(shí)清除導(dǎo)致在裝載另一個(gè)函數(shù)時(shí)那個(gè)內(nèi)容還在。Startup51.不知道是不是要改一個(gè)這個(gè)文件,
回復(fù)

使用道具 舉報(bào)

15#
ID:419909 發(fā)表于 2021-10-22 08:17 | 只看該作者
188610329 發(fā)表于 2021-10-21 23:25
看到你設(shè)置里,單片機(jī)選的STC15W408AS, 但是,你說(shuō)你單片機(jī)的型號(hào)是8G2K64S4,所以最好你重新選一下,然后 ...

那個(gè)是對(duì)于仿真才用到。編譯器不影響的。也有試過(guò)勾選所有的選項(xiàng)了。我覺(jué)得應(yīng)該是內(nèi)存管理堆棧那里設(shè)置問(wèn)題。也百度了比較久了。問(wèn)題還沒(méi)不知道是哪里。雖然目前問(wèn)題暫時(shí)能解決。但是不知道原因的話。后面還會(huì)出現(xiàn)的。所以。如果能找到根源。就最好。
回復(fù)

使用道具 舉報(bào)

16#
ID:65956 發(fā)表于 2021-10-22 08:27 | 只看該作者
我用了很多項(xiàng)目,都不曾有這個(gè)問(wèn)題,有時(shí)候XDATA用了很多也不曾如你所說(shuō),不用在KEIL特別設(shè)置,都用默認(rèn)就可以了
回復(fù)

使用道具 舉報(bào)

17#
ID:419909 發(fā)表于 2021-10-22 09:00 | 只看該作者
aking991 發(fā)表于 2021-10-22 08:27
我用了很多項(xiàng)目,都不曾有這個(gè)問(wèn)題,有時(shí)候XDATA用了很多也不曾如你所說(shuō),不用在KEIL特別設(shè)置,都用默認(rèn)就 ...

不知道你是不是全部都用XDATA。這樣速度覺(jué)得很慢。有試過(guò)混合用嗎。DATA和XDATA變量混用。
回復(fù)

使用道具 舉報(bào)

18#
ID:298123 發(fā)表于 2021-10-22 11:07 | 只看該作者
加上static 定義。 編譯器會(huì)優(yōu)化,共享變量導(dǎo)致
回復(fù)

使用道具 舉報(bào)

19#
ID:47286 發(fā)表于 2021-10-22 12:27 | 只看該作者
我說(shuō)不出多少理論 就是實(shí)際的經(jīng)驗(yàn) 從STC11系到8系都沒(méi)啥問(wèn)題 供你參考




1. 只能選DATA或者XDATA STC貌似不支持PDATA 我試過(guò)uchar pdata x 也會(huì)出問(wèn)題 只能用到idata 個(gè)人看法是data是低128 idata是高128 然后就是xdata

2. 選存儲(chǔ)模式=DATA 變量要用XDATA需要聲明 反之選存儲(chǔ)模式=xdata又要把變量放在基本內(nèi)存時(shí)需要聲明data或者idata

3. 某些型號(hào)必須勾選 使用內(nèi)部XDATA 才能使用 大部分不需要 不勾選基本上等同于存儲(chǔ)模式=DATA 看編譯后的內(nèi)存使用 沒(méi)有成功開(kāi)啟xdata會(huì)報(bào)內(nèi)存溢出

4. 使用xdata 相同優(yōu)化等級(jí)下代碼量會(huì)增加不少 如果程序空間有限 要考慮這點(diǎn)

5. xdata變量是否可用和優(yōu)化等級(jí)沒(méi)什么關(guān)系
回復(fù)

使用道具 舉報(bào)

20#
ID:419909 發(fā)表于 2021-10-22 13:34 | 只看該作者
dzbj 發(fā)表于 2021-10-22 12:27
我說(shuō)不出多少理論 就是實(shí)際的經(jīng)驗(yàn) 從STC11系到8系都沒(méi)啥問(wèn)題 供你參考

好的。謝謝。我按這個(gè)設(shè)置試試。
回復(fù)

使用道具 舉報(bào)

21#
ID:419909 發(fā)表于 2021-10-25 09:58 | 只看該作者
188610329 發(fā)表于 2021-10-21 20:47
其實(shí),STC單片機(jī),你啟用雙DPTR數(shù)據(jù)指針功能的話,XDATA的效率比PDATA高。因?yàn)镻DATA的關(guān)鍵Ri寄存器可能會(huì) ...

覺(jué)得還是回復(fù)一下。方便后面其它人需要。經(jīng)測(cè)試。目前8G2K支持DPTR。所以選了DPTR這個(gè)選項(xiàng)之后。速度確實(shí)快多了。接近原來(lái)DATA變量速度。謝謝你的提醒。
回復(fù)

使用道具 舉報(bào)

22#
ID:883242 發(fā)表于 2022-1-4 21:18 | 只看該作者
DATA不夠用應(yīng)該優(yōu)先選用IDATA,然后才是PDATA,如果還不夠用最后才是XDATA。

DATA是直接尋址,只有120字節(jié),高128字節(jié)直接尋址是SFR,間接尋址才是RAM。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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