久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 7342|回復: 21
打印 上一主題 下一主題
收起左側

STC單片機使用XDATA變量出問題,有高手幫忙看一下

  [復制鏈接]
跳轉到指定樓層
樓主
用的是STC 的8G2K64S4,先說一下目前狀況,我以前一般做些小東西。用不了太多變量。一直是用Keil 默認模式。即所有變量使用 DATA的。后面因為產品需要。變量需要用到XDATA時,才選PDATA或者XDATA模式。但是這兩種模式都非常容易出問題。經常是打印結果不正確。或者亂碼。好像這些變量的值會相互串擾一樣。這種情況發生在我目前使用的好幾個型號了。比如15W4K。如果全部變量用DATA就沒問題,但是這樣的話。變量不夠用。解決不了問題,

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

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

系統設置。PDATA

系統設置。PDATA

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

TEM數組

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

使用道具 舉報

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

使用道具 舉報

板凳
ID:94031 發表于 2021-10-21 18:34 | 只看該作者
應該是優化級別問題,不是使用XDATA變量出問題。
回復

使用道具 舉報

地板
ID:624769 發表于 2021-10-21 19:01 | 只看該作者
設置里, Memory 選Small in DATA  不要選PDATA 和 XDATA
代碼里聲明的時候,手動標注  pdata xdata 即可
不然編譯會把所有聲明變量的時候, 沒有 標DATA 的 編譯成 PDATA或者XDATA,而你代碼里沒有聲明 unsigned char data 這個習慣的吧?所以Memory Model  就不要動,固定small
回復

使用道具 舉報

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

感謝回復,Small in DATA模式也是一樣的。而且在Small in DATA模式下。手工標注XDATA變量更容易出問題。特別是用在函數傳參數的時候。
回復

使用道具 舉報

6#
ID:419909 發表于 2021-10-21 19:19 | 只看該作者
xuyaqi 發表于 2021-10-21 18:34
應該是優化級別問題,不是使用XDATA變量出問題。

目前優化級別是8級,系統默認值。我遲點試試更低一些級的。
回復

使用道具 舉報

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

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

使用道具 舉報

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

感謝指正。我這邊寫錯。那應該是bit bdata 最好。之所以用idata,我以為是這個是位尋址的。其實主要還是想省內存。經常跟這些小容易單下機摳內存。希望各個變量都能達到最大化使用效率。。
一般經常用到的對讀速度要求快的,我用DATA和PDATA。普通的就用XDATA.
回復

使用道具 舉報

9#
ID:624769 發表于 2021-10-21 20:47 | 只看該作者
wfqxgw 發表于 2021-10-21 19:46
感謝指正。我這邊寫錯。那應該是bit bdata 最好。之所以用idata,我以為是這個是位尋址的。其實主要還是 ...

其實,STC單片機,你啟用雙DPTR數據指針功能的話,XDATA的效率比PDATA高。因為PDATA的關鍵Ri寄存器可能會被其他程序占用,而你程序設計的好的話,可以把一路DPTR指針給你XDATA專用。那么不需要反復賦值,還能定義自增自減,不管代碼量還是執行速度都要比PDATA高。
回復

使用道具 舉報

10#
ID:419909 發表于 2021-10-21 21:38 | 只看該作者
188610329 發表于 2021-10-21 20:47
其實,STC單片機,你啟用雙DPTR數據指針功能的話,XDATA的效率比PDATA高。因為PDATA的關鍵Ri寄存器可能會 ...

這個我還不太清楚。沒試過。按以前的話。明顯感覺XDATA很慢的。頻繁讀取寫的話。刷新率一下總體至少50%。PDATA相對沒什么變化。至少感覺不到太多。
另外。XDATA問題還是解決不了。用了idata和DATA做為變量都不行。剛剛用了一個將錯就錯方案。之前不是感覺這些變量內容有串擾嗎?現在我折中一個方案。把這個數組位置增加多一位。tem[16]改為tem[17],居然解決了。是不是完全沒問題還不知道。至少目前各個功能正常。先說一下。
回復

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

看到你設置里,單片機選的STC15W408AS, 但是,你說你單片機的型號是8G2K64S4,所以最好你重新選一下,然后把On-chipROM,和On_chipXRAM都打個勾試試。雖然,型號選擇應該關系不大,但是由于寄存器策略有不少變化,可能會在編譯時轉匯編的過程對PDATA調用有一定影響。畢竟PDATA本來就比較特殊,調用方式每家都不一樣,STC是規定最開始的256字節,WCH的話,是通過每256字節的分頁方式,可以整個XRAM都用PDATA調用,所以不排除型號沒選對,編譯器就罷工的可能。
回復

使用道具 舉報

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

試過了的。在variables in PDATA模式下。不加修飾,系統是按XDATA定義的。我也試過手工加unsigned char data tem[16],問題一樣的。這些變量在內存里面估計是有位置共用。但是在退出函數時。不能及時清除導致在裝載另一個函數時那個內容還在。Startup51.不知道是不是要改一個這個文件,
回復

使用道具 舉報

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

那個是對于仿真才用到。編譯器不影響的。也有試過勾選所有的選項了。我覺得應該是內存管理堆棧那里設置問題。也百度了比較久了。問題還沒不知道是哪里。雖然目前問題暫時能解決。但是不知道原因的話。后面還會出現的。所以。如果能找到根源。就最好。
回復

使用道具 舉報

16#
ID:65956 發表于 2021-10-22 08:27 | 只看該作者
我用了很多項目,都不曾有這個問題,有時候XDATA用了很多也不曾如你所說,不用在KEIL特別設置,都用默認就可以了
回復

使用道具 舉報

17#
ID:419909 發表于 2021-10-22 09:00 | 只看該作者
aking991 發表于 2021-10-22 08:27
我用了很多項目,都不曾有這個問題,有時候XDATA用了很多也不曾如你所說,不用在KEIL特別設置,都用默認就 ...

不知道你是不是全部都用XDATA。這樣速度覺得很慢。有試過混合用嗎。DATA和XDATA變量混用。
回復

使用道具 舉報

18#
ID:298123 發表于 2021-10-22 11:07 | 只看該作者
加上static 定義。 編譯器會優化,共享變量導致
回復

使用道具 舉報

19#
ID:47286 發表于 2021-10-22 12:27 | 只看該作者
我說不出多少理論 就是實際的經驗 從STC11系到8系都沒啥問題 供你參考




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

2. 選存儲模式=DATA 變量要用XDATA需要聲明 反之選存儲模式=xdata又要把變量放在基本內存時需要聲明data或者idata

3. 某些型號必須勾選 使用內部XDATA 才能使用 大部分不需要 不勾選基本上等同于存儲模式=DATA 看編譯后的內存使用 沒有成功開啟xdata會報內存溢出

4. 使用xdata 相同優化等級下代碼量會增加不少 如果程序空間有限 要考慮這點

5. xdata變量是否可用和優化等級沒什么關系
回復

使用道具 舉報

20#
ID:419909 發表于 2021-10-22 13:34 | 只看該作者
dzbj 發表于 2021-10-22 12:27
我說不出多少理論 就是實際的經驗 從STC11系到8系都沒啥問題 供你參考

好的。謝謝。我按這個設置試試。
回復

使用道具 舉報

21#
ID:419909 發表于 2021-10-25 09:58 | 只看該作者
188610329 發表于 2021-10-21 20:47
其實,STC單片機,你啟用雙DPTR數據指針功能的話,XDATA的效率比PDATA高。因為PDATA的關鍵Ri寄存器可能會 ...

覺得還是回復一下。方便后面其它人需要。經測試。目前8G2K支持DPTR。所以選了DPTR這個選項之后。速度確實快多了。接近原來DATA變量速度。謝謝你的提醒。
回復

使用道具 舉報

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

DATA是直接尋址,只有120字節,高128字節直接尋址是SFR,間接尋址才是RAM。
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久久久久网站 | 日本电影韩国电影免费观看 | 国产成人久久精品一区二区三区 | 97精品超碰一区二区三区 | 激情婷婷| 精品国产一区二区三区日日嗨 | 欧美一级一 | 91精品国产综合久久久久久蜜臀 | 亚洲国产欧美在线人成 | 男女羞羞的网站 | 欧美日韩一二区 | 欧美日韩在线精品 | 五月天激情电影 | 国产日韩精品视频 | 牛牛热在线视频 | 国产 欧美 日韩 一区 | 国产精品久久久久久久久久久久久 | 天天操欧美 | 91在线观看免费 | 国产一区二区精华 | 99在线资源 | 草草视频在线观看 | 欧美成人精品 | 国产伦精品一区二区三区在线 | 国产高清一区二区三区 | 亚洲激情一区二区三区 | 国产精品一区二区三区在线 | 特级特黄特色的免费大片 | 天天操夜夜操免费视频 | www.成人免费视频 | 欧美成人二区 | 色888www视频在线观看 | 最新国产精品视频 | 精品成人一区 | 久久久五月天 | 精品国产一区二区三区久久久久久 | 国产伦精品一区二区三区精品视频 | 国产精品免费一区二区三区四区 | 日本不卡免费新一二三区 | 国产三级一区二区三区 | 久久男人天堂 |