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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1239|回復: 10
收起左側

89c52關于volatile和地址

[復制鏈接]
ID:73992 發表于 2025-9-26 22:43 | 顯示全部樓層 |閱讀模式
無標題.png 程序調試結果不正確。去掉data 修飾符后,寫內存結果正確,寫特殊功能寄存器不正確 IMG20250926222826(1).jpg
回復

使用道具 舉報

ID:1109793 發表于 2025-9-27 07:48 | 顯示全部樓層
不太懂,就是為了學習指針操作才這么搞的嗎?另外哪位前輩給說說為何在形參中使用volatile?
回復

使用道具 舉報

ID:155507 發表于 2025-9-27 11:10 | 顯示全部樓層
[color=oklch(0.3039 0.04 213.68)][backcolor=oklch(0.9902 0.004 106.47)]你的現象和疑惑主要來自以下幾點8051 C的“data/volatile/特殊功能寄存器指針”混用特點和陷阱:

1. data修飾符和data空間的指針
  • unsigned char data *i; 表示i指向8051內部128B“data”RAM。
  • 但“data”空間不能像xdata/idata那樣靈活用指針訪問(只能指向data區),很多C51編譯器不支持unsigned char data *i指向特殊功能寄存器SFR區。
  • 某些8051編譯器(如Keil/A51)對指針的空間必須嚴格匹配,若i指向非法或未初始化,*i等操作是未定義行為。


2. volatile修飾作用
  • volatile 強制每次都從實際地址讀/寫,防止編譯器優化。
  • 但它僅確保不會被寄存器優化;對于8051結構,“volatile unsigned char data *”/“volatile unsigned char *”并不會強制訪存到SFR,指針空間依然要對。
  • 指針類型和空間匹配,決定訪問到哪塊內存(data/xdata/idata/bit/SFR等)。


3. 寫SFR的正確方式與陷阱
  • SFR(特殊功能寄存器)必須用__sfr或特定映射(如Keil的#define SBUF (*((volatile unsigned char xdata *)0x99)))。
  • 不建議用data *指針寫SFR,因為data區和SFR物理分區,雖然低地址重疊,但直接賦值是未定義行為。
  • “去掉data修飾后能正確訪問”說明默認指針為idata,讀寫到某些普通RAM區域;SFR必須顯式用SFR或映射。


4. 你的問題總結建議
  • 寫RAM用“data”或"idata"指針,寫SFR(如P1OUT、SBUF等)用__sfr/__at/特定映射。
  • “data *”只能訪問內部data RAM,不要用來訪問SFR,否則結果不確定。
  • volatile正確用法是修飾SFR/多任務通信的全局變量。
  • 指針未初始化直接用*i也是未定義,需i = (unsigned char data*)0xXX;后再用。

  • 普通RAM用“data”/“idata”修飾,SFR須顯式區分,用volatile修飾SFR/全局變量更保險。


總結
  • 8051的“data”指針不能寫SFR區,SFR要用對應修飾。
  • “volatile”能防止代碼優化丟失硬寄存器IO,但要配合內存區修飾符。
  • 指針空間錯誤時,編譯器不會自動拋錯,但是實際指令不會正確定址,導致寫不進去或數據異常。

[color=oklch(0.3039 0.04 213.68)][backcolor=oklch(0.9902 0.004 106.47)]你的問題實際和51單片機的內存分區、C指針空間修飾和volatile的用途緊密相關:

8051 data/xdata 指針和SFR的本質
  • “unsigned char data *i;”為data區指針,只能指向8051的內部128B RAM,不能指向SFR特殊功能寄存器區。
  • SFR區(0x80~0xFF)只能用sfr關鍵字或指向SFR區的特殊指針訪問,data屬性不能越區。
  • MCU支持的"data"等空間關鍵字要求指針和被它指的對象空間一致,否則結果未定義。
  • 寫普通RAM,普通指針或data修飾均可;寫SFR必須用sfr或xdata/特殊映射。
  • 去掉data后,C編譯器一般用默認idata/xdata指針,此時RAM可正常,SFR又可能無效。


volatile的實際作用
  • volatile只保證變量每次都真實訪存,不被寄存器緩存或優化。
  • 對于SFR,要保證寫入寄存器,每次操作需要同時volatile和正確空間修飾。
  • 寫普通RAM不需要volatile,寫SFR/外設/與中斷訪問一致的全局變量需加volatile。


實用建議
  • 正確訪問SFR:用sfr宏定義(如sfr P1 = 0x90;)或 #define SBUF (*((volatile unsigned char xdata *)0x99))。
  • 不要用data修飾指針去操作SFR。
  • volatile通常只修飾外設映射和ISR共享變量。



總結
  • data類指針不能寫SFR區
  • volatile修飾不能替代空間修飾,空間要對,SFR需專有定義宏
  • RAM變量正常用指針,SFR只能專用通道
  • “去掉data修飾寫內存正確,SFR不對”本質是指針空間錯


回復

使用道具 舉報

ID:73992 發表于 2025-9-27 14:27 | 顯示全部樓層
c語言指針方式訪問不了特殊功能寄存器。【已解決】
回復

使用道具 舉報

ID:879809 發表于 2025-9-27 14:32 | 顯示全部樓層
看匯編唄!你也是研究了好多年ARM匯編的烈士,看51匯編還不是小菜一碟?
回復

使用道具 舉報

ID:57657 發表于 2025-9-27 15:13 | 顯示全部樓層
此型號較老,大部分特殊功能寄存器地址都是空白不可寫。
具體把源碼粘貼完整才能知道是什么問題造成的。
回復

使用道具 舉報

ID:73992 發表于 2025-9-27 19:39 | 顯示全部樓層
angmall 發表于 2025-9-27 11:10
你的現象和疑惑主要來自以下幾點8051 C的“data/volatile/特殊功能寄存器指針”混用特點和陷阱:[/backcolo ...

謝謝,
仔細查了一下資料。sfr沒有間址訪問指令。想動態直接訪問sfr不容易做到。
回復

使用道具 舉報

ID:996773 發表于 2025-9-27 19:42 | 顯示全部樓層
特殊功能寄存器是開啟其他用途的,有的是io口大電流強拉功能,有的是開啟擴展大ram,怎么可能隨便寫
數據進去呢,這些硬件結構不了解怎么玩編程
回復

使用道具 舉報

ID:879809 發表于 2025-9-28 11:07 | 顯示全部樓層
那就是C51用@Ri(i=0,1)指令冒充指針,這個指令無法訪問SFR。
回復

使用道具 舉報

ID:73992 發表于 2026-3-8 22:27 | 顯示全部樓層
發表于 2025-9-28 11:07
那就是C51用@Ri(i=0,1)指令冒

是的,特殊功能存儲器SFR訪問只能直接尋址,像 MOV A,80H  源操作數不好傳參 。間址方式訪問不到SFR
回復

使用道具 舉報

ID:1073939 發表于 2026-3-9 15:34 | 顯示全部樓層
51的sfr只能直接訪問,間接訪問是idata區。
volatile是表示禁止優化,感覺形參加volatile沒必要。
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

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