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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 915|回復: 14
打印 上一主題 下一主題
收起左側(cè)

STC 8H XDATA的奇怪問題

  [復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:101869 發(fā)表于 2025-10-30 00:12 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
芯片是8H8K64U,最初使用的模式是DATA,后來程序大了提示溢出,就改為XDATA,發(fā)現(xiàn)有幾個初始化的變量都歸零了,逐一排查,當屏蔽掉讀取eeprom對數(shù)組賦值這段代碼時,不再歸零,關(guān)鍵是這段代碼一直正常使用,被改變的變量也跟數(shù)組沒有關(guān)系,在之前的正常代碼中如果設置為XDATA模式也會出現(xiàn)同樣問題,這幾個變量是U8類型,數(shù)組是u16類型,如果把被改變的變量改為u16類型就好了,百思不得其解,期間也嘗試了重新建立工程,加 volatile關(guān)鍵字都沒有解決,看看大家有啥好辦法不
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發(fā)
ID:584814 發(fā)表于 2025-10-30 08:16 | 只看該作者
近幾次提問都是沒頭沒腦的口述,沒有電路沒有代碼沒有單片機具體型號,主打計算機算命
回復

使用道具 舉報

板凳
ID:230500 發(fā)表于 2025-10-30 08:27 | 只看該作者
我也好像遇到過,定義全局變量的時候,沒有賦初值, 之前一直都正常,因為都是軟件自動賦0, 也是因為超出空間,換編譯模式后,個別變量初值變了,不是0了,而是隨機數(shù)。 我也沒細查, 就是自己在定義變量的時候手動賦初值后解決。 宏定義的值不會變, 就是全局變量的值個別會變,
回復

使用道具 舉報

地板
ID:468878 發(fā)表于 2025-10-30 08:44 | 只看該作者
我使用8H8K64U的時候也發(fā)現(xiàn),用DATA、PDATA和XDATA會存在問題,里面有一段涉及浮點的計算函數(shù),選擇兩種模式的時候,計算結(jié)果會不一樣……有的感覺是明顯溢出的錯誤結(jié)果,不知道是怎么原因,也懶得追蹤。
回復

使用道具 舉報

5#
ID:1159461 發(fā)表于 2025-10-30 08:45 | 只看該作者
頭文件用的是8H嗎?重新官網(wǎng)下載最新的頭文件替換一下試試
回復

使用道具 舉報

6#
ID:101869 發(fā)表于 2025-10-30 09:07 | 只看該作者
a399288395 發(fā)表于 2025-10-30 08:27
我也好像遇到過,定義全局變量的時候,沒有賦初值, 之前一直都正常,因為都是軟件自動賦0, 也是因為超出 ...

我習慣性的定義時就進行賦值
回復

使用道具 舉報

7#
ID:879348 發(fā)表于 2025-10-30 09:35 | 只看該作者
因為XDATA的數(shù)據(jù)是隨機的,啟動代碼沒有初始化,所以定義必須初始化
回復

使用道具 舉報

8#
ID:101869 發(fā)表于 2025-10-30 15:22 來自觸屏版 | 只看該作者
wufa1986 發(fā)表于 2025-10-30 09:35
因為XDATA的數(shù)據(jù)是隨機的,啟動代碼沒有初始化,所以定義必須初始化

已經(jīng)初始化了,在定義時就賦值了
回復

使用道具 舉報

9#
ID:101869 發(fā)表于 2025-10-30 15:24 來自觸屏版 | 只看該作者
搖滾一族 發(fā)表于 2025-10-30 08:45
頭文件用的是8H嗎?重新官網(wǎng)下載最新的頭文件替換一下試試

是8H頭文件,遇到好幾次了,只要用XDATA模式就出莫名其妙的問題
回復

使用道具 舉報

10#
ID:101869 發(fā)表于 2025-10-30 18:53 來自觸屏版 | 只看該作者
最后解決是定義時指定位置,不過這也太麻煩了吧
回復

使用道具 舉報

11#
ID:1133081 發(fā)表于 2025-10-31 07:18 | 只看該作者
非凡科技 發(fā)表于 2025-10-30 15:24
是8H頭文件,遇到好幾次了,只要用XDATA模式就出莫名其妙的問題

使用STC8H做過多個項目,從沒有遇過樓主所述情況。
回復

使用道具 舉報

12#
ID:830831 發(fā)表于 2025-10-31 11:58 | 只看該作者
非凡科技 發(fā)表于 2025-10-30 15:24
是8H頭文件,遇到好幾次了,只要用XDATA模式就出莫名其妙的問題

換2塊芯片再試試
回復

使用道具 舉報

13#
ID:71233 發(fā)表于 2025-11-2 11:25 | 只看該作者
初始化時賦值比較好
回復

使用道具 舉報

14#
ID:624769 發(fā)表于 2025-11-2 16:09 | 只看該作者
Keil 里面關(guān)閉 雙DPTR指針。那東西不是給 STC 設計的。
回復

使用道具 舉報

15#
ID:1137639 發(fā)表于 2025-11-8 23:01 | 只看該作者
從問題現(xiàn)象和8051架構(gòu)(8H8K64U屬于STC8系列,基于增強型8051)的內(nèi)存特性來看,核心矛盾很可能出在**XDATA空間的地址分配沖突**與**數(shù)據(jù)訪問對齊要求**上,結(jié)合變量類型(U8/u16)的差異可進一步分析:
關(guān)鍵原因推測
8051架構(gòu)中,`DATA`(內(nèi)部直接尋址RAM)和`XDATA`(外部擴展RAM)的內(nèi)存管理機制截然不同:  
`DATA`空間小(通常128B~256B),編譯器會嚴格緊湊分配,且8位/16位變量地址默認對齊,不易沖突;  
`XDATA`空間大(8H8K64U可能支持64KB),但編譯器對XDATA的地址分配更“松散”,且**16位數(shù)據(jù)(u16)在XDATA中默認按偶地址對齊**(為提高訪問效率),而8位數(shù)據(jù)(U8)可占任意地址。  
當切換到`XDATA`模式后,若u16數(shù)組的起始地址被分配在“偶地址”,而U8變量的地址恰好被分配在數(shù)組相鄰的“奇地址”,此時對u16數(shù)組的賦值操作(每次訪問2字節(jié))可能**越界覆蓋相鄰的U8變量**——因為u16的讀寫會一次性操作偶地址+奇地址兩個字節(jié),若U8變量正好在奇地址上,就會被數(shù)組的賦值“順帶”改寫為0(EEPROM讀取的初始數(shù)據(jù)可能包含0,或數(shù)組初始化時的填充值)。  
而將U8變量改為u16后,變量會被分配到偶地址,與u16數(shù)組的地址對齊,避免了被數(shù)組讀寫越界覆蓋,因此問題消失。之前`DATA`模式下未出現(xiàn)問題,是因為`DATA`空間小,編譯器自動規(guī)避了這種地址重疊;而`XDATA`空間大,分配策略更寬松,才暴露了沖突。  

解決辦法
1. **強制指定地址,避免重疊**  
   在變量和數(shù)組定義時,通過編譯器擴展語法強制指定不重疊的XDATA地址(需參考芯片手冊確認XDATA可用范圍),例如:  
   ```c
   __xdata __at(0x0000) u16 eeprom_array[100];  // 數(shù)組指定在0x0000開始(偶地址)
   __xdata __at(0x00C8) uint8_t var1;           // 變量指定在數(shù)組結(jié)束后的地址(0x0000 + 100*2 = 0x00C8,偶地址后接奇地址需間隔1字節(jié))
   ```  
   確保變量地址與數(shù)組地址(含數(shù)組總長度覆蓋的范圍)無重疊。
2. **調(diào)整數(shù)組定義,確保對齊隔離**  
   在u16數(shù)組后預留1字節(jié)“隔離區(qū)”,或用`__align(2)`強制數(shù)組按2字節(jié)對齊,避免U8變量被“擠”到數(shù)組的地址范圍內(nèi):  
   ```c
   __xdata __align(2) u16 eeprom_array[100];  // 強制數(shù)組起始地址為偶地址
   __xdata uint8_t var1;                      // 編譯器會自動將var1分配到數(shù)組范圍外
   ```  
3. **檢查EEPROM讀取函數(shù)的邊界**  
   即使數(shù)組定義正確,若讀取EEPROM時的長度計算錯誤(例如實際讀取字節(jié)數(shù)超過數(shù)組容量),也可能越界覆蓋后續(xù)變量。需確認讀取代碼中的`長度參數(shù)`是否嚴格等于`數(shù)組元素數(shù)×2`(u16數(shù)組每個元素占2字節(jié)),例如:  
   ```c
   // 錯誤示例:若數(shù)組長度100,卻讀取201字節(jié),會越界1字節(jié)
   eeprom_read(eeprom_array, 0, 201);  
   // 正確示例:嚴格匹配100×2=200字節(jié)
   eeprom_read(eeprom_array, 0, 100*2);  
   ```  
4. **利用.map文件分析地址分配**  
   編譯后生成的.map文件會記錄所有XDATA變量和數(shù)組的地址及占用范圍,通過搜索變量名和數(shù)組名,查看是否存在地址重疊(例如數(shù)組的結(jié)束地址 ≥ 變量的起始地址),直接定位沖突位置。  
總結(jié)
本質(zhì)是XDATA模式下8位變量與16位數(shù)組的地址分配沖突,因16位數(shù)據(jù)的“偶地址對齊”特性導致對數(shù)組的操作意外覆蓋了相鄰的8位變量。通過強制地址隔離、檢查讀寫邊界或利用.map文件排查重疊,可徹底解決問題。
回復

使用道具 舉報

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

本版積分規(guī)則

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

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

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