亚洲春色中文字幕久久久-三上亚,一吻二脱三床四吻胸,国产真实伦对白视频全集,在线毛片观看,精品成品入口黄网,国产毛aⅴ片久久久,亚洲AV色香蕉一区二区三区老师,萧皇后A级艳片,色情日本视频更新,99久久亚洲精品日本无码

標(biāo)題: STC 8H XDATA的奇怪問(wèn)題 [打印本頁(yè)]

作者: 非凡科技    時(shí)間: 2025-10-30 00:12
標(biāo)題: STC 8H XDATA的奇怪問(wèn)題
芯片是8H8K64U,最初使用的模式是DATA,后來(lái)程序大了提示溢出,就改為XDATA,發(fā)現(xiàn)有幾個(gè)初始化的變量都?xì)w零了,逐一排查,當(dāng)屏蔽掉讀取eeprom對(duì)數(shù)組賦值這段代碼時(shí),不再歸零,關(guān)鍵是這段代碼一直正常使用,被改變的變量也跟數(shù)組沒(méi)有關(guān)系,在之前的正常代碼中如果設(shè)置為XDATA模式也會(huì)出現(xiàn)同樣問(wèn)題,這幾個(gè)變量是U8類型,數(shù)組是u16類型,如果把被改變的變量改為u16類型就好了,百思不得其解,期間也嘗試了重新建立工程,加 volatile關(guān)鍵字都沒(méi)有解決,看看大家有啥好辦法不

作者: man1234567    時(shí)間: 2025-10-30 08:16
近幾次提問(wèn)都是沒(méi)頭沒(méi)腦的口述,沒(méi)有電路沒(méi)有代碼沒(méi)有單片機(jī)具體型號(hào),主打計(jì)算機(jī)算命
作者: a399288395    時(shí)間: 2025-10-30 08:27
我也好像遇到過(guò),定義全局變量的時(shí)候,沒(méi)有賦初值, 之前一直都正常,因?yàn)槎际擒浖詣?dòng)賦0, 也是因?yàn)槌隹臻g,換編譯模式后,個(gè)別變量初值變了,不是0了,而是隨機(jī)數(shù)。 我也沒(méi)細(xì)查, 就是自己在定義變量的時(shí)候手動(dòng)賦初值后解決。 宏定義的值不會(huì)變, 就是全局變量的值個(gè)別會(huì)變,
作者: rsx9583    時(shí)間: 2025-10-30 08:44
我使用8H8K64U的時(shí)候也發(fā)現(xiàn),用DATA、PDATA和XDATA會(huì)存在問(wèn)題,里面有一段涉及浮點(diǎn)的計(jì)算函數(shù),選擇兩種模式的時(shí)候,計(jì)算結(jié)果會(huì)不一樣……有的感覺(jué)是明顯溢出的錯(cuò)誤結(jié)果,不知道是怎么原因,也懶得追蹤。
作者: 搖滾一族    時(shí)間: 2025-10-30 08:45
頭文件用的是8H嗎?重新官網(wǎng)下載最新的頭文件替換一下試試
作者: 非凡科技    時(shí)間: 2025-10-30 09:07
a399288395 發(fā)表于 2025-10-30 08:27
我也好像遇到過(guò),定義全局變量的時(shí)候,沒(méi)有賦初值, 之前一直都正常,因?yàn)槎际擒浖詣?dòng)賦0, 也是因?yàn)槌?...

我習(xí)慣性的定義時(shí)就進(jìn)行賦值
作者: wufa1986    時(shí)間: 2025-10-30 09:35
因?yàn)閄DATA的數(shù)據(jù)是隨機(jī)的,啟動(dòng)代碼沒(méi)有初始化,所以定義必須初始化
作者: 非凡科技    時(shí)間: 2025-10-30 15:22
wufa1986 發(fā)表于 2025-10-30 09:35
因?yàn)閄DATA的數(shù)據(jù)是隨機(jī)的,啟動(dòng)代碼沒(méi)有初始化,所以定義必須初始化

已經(jīng)初始化了,在定義時(shí)就賦值了
作者: 非凡科技    時(shí)間: 2025-10-30 15:24
搖滾一族 發(fā)表于 2025-10-30 08:45
頭文件用的是8H嗎?重新官網(wǎng)下載最新的頭文件替換一下試試

是8H頭文件,遇到好幾次了,只要用XDATA模式就出莫名其妙的問(wèn)題
作者: 非凡科技    時(shí)間: 2025-10-30 18:53
最后解決是定義時(shí)指定位置,不過(guò)這也太麻煩了吧
作者: WL0123    時(shí)間: 2025-10-31 07:18
非凡科技 發(fā)表于 2025-10-30 15:24
是8H頭文件,遇到好幾次了,只要用XDATA模式就出莫名其妙的問(wèn)題

使用STC8H做過(guò)多個(gè)項(xiàng)目,從沒(méi)有遇過(guò)樓主所述情況。
作者: Highnose    時(shí)間: 2025-10-31 11:58
非凡科技 發(fā)表于 2025-10-30 15:24
是8H頭文件,遇到好幾次了,只要用XDATA模式就出莫名其妙的問(wèn)題

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

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





歡迎光臨 (http://www.denmoz.com/bbs/) Powered by Discuz! X3.1