在 Keil C51(8051 單片機 C 編譯器)中,data 是編譯器擴展關鍵字,非標準 C 語言關鍵字。它指定變量存放在內部 RAM 的直接訪問區(0x00-0x7F,共 128 字節),以獲得最快訪問速度和最小代碼體積。
| 關鍵字 | 地址範圍 | 大小 | 訪問方式 | 速度/代碼 | 典型用途 |
|---|---|---|---|---|---|
data | 0x00-0x7F | 128B | 直接訪問 (MOV A, addr) | 最快/最小 | 頻繁訪問的全局/局部變量、中斷標志、狀態機 |
idata | 0x80-0xFF | 128B | 間接訪問 (MOV A, @R0/R1) | 次快 | 棧、大數組、間接寻址需求 |
bdata | 0x20-0x2F (位可寻址) | 16B (128位) | 位訪問 (SETB/CLR bit) | 位操作最快 | 標志位、控制位、狀態標志 |
xdata | 0x0000-0xFFFF | 64KB | 外部總線 (MOVX @DPTR) | 最慢/代碼大 | 大數組、緩衝區、外部 RAM/外設 |
pdata | 0x0000-0xFF (分頁) | 256B/頁 | 分頁訪問 (MOVX @R0/R1) | 中等 | 小型外部數據 |
code | 0x0000-0xFFFF | 64KB | 程序存儲器 (MOVC @A+DPTR) | 只讀 | 常量表、字體、查找表 |
#include <reg51.h> // 或 reg52.h
// 全局變量指定 data 區
data unsigned char g_counter; // 佔用 1 字節 data 區
data int g_status; // 佔用 2 字節 data 區
data char g_buffer[16]; // 佔用 16 字節 data 區
// 函數參數/局部變量也可指定(編譯器自動分配寄存器優先)
void isr_timer0() interrupt 1 {
data unsigned char tmp = TL0; // 局部變量在 data 區,極快
g_counter++;
if (g_counter == 100) {
g_status = 1;
}
}
// 位變量優化:bdata + sbit
bdata unsigned char flags;
sbit FLAG_UART_RX = flags ^ 0; // 第 0 位
sbit FLAG_ADC_DONE = flags ^ 1; // 第 1 位
void main() {
// 位操作極其高效,單條指令
FLAG_UART_RX = 1; // SETB flags.0
if (FLAG_ADC_DONE) { ... }
}
SETB/CLR/JB/JNB 指令,比字節掩碼操作快 3-5 倍。DATA GROUP 佔用,確保未超 128B,關鍵變量地址在 0x00-0x7F。volatile,防止編譯器優化掉讀寫。data 是 Keil C51 針對 8051 架構“直接訪問內部 RAM 區”提供的存儲類別修飾符。善用 data/idata/bdata/xdata/code 六大存儲類別,是 8051 C 編程性能優化的核心技能。現代 ARM Cortex-M (Keil MDK-ARM) 使用統一地址空間,無需此類關鍵字,改用 __attribute__((section(".fast_data"))) 等屬性配合鏈接腳本實現類似優化。