單片機 C 語言 intrins.h 頭文件詳解:內建函數與汇編指令映射
<intrins.h> 是 Keil C51 編譯器提供的內建函數頭文件,將 8051 汇編指令封裝為 C 函數,實現無內嵌汇編直接調用硬件指令。
核心內建函數表
| 函數 | 對應汇編指令 | 功能 |
_crol_(char, bits) | RL A | 字符循環左移 |
_cror_(char, bits) | RR A | 字符循環右移 |
_irol_(int, bits) | RL A / RL B | 整數循環左移 (16位) |
_iror_(int, bits) | RR A / RR B | 整數循環右移 |
_lrol_(long, bits) | RL A / RL B / RL C / RL D | 長整數循環左移 (32位) |
_lror_(long, bits) | RR A / RR B / RR C / RR D | 長整數循環右移 |
_nop_() | NOP | 空操作 (精確延時 1 機器週期) |
_testbit_(byte, bit) | JBC bit, rel | 測試位並清零 (原子操作) |
使用示例
#include <intrins.h>
#include <reg51.h>
void delay_us(unsigned int us) {
while (us--) {
_nop_(); _nop_(); _nop_(); _nop_(); // 12MHz 下約 1μs
_nop_(); _nop_(); _nop_(); _nop_();
}
}
unsigned char rotate_left(unsigned char val, unsigned char n) {
return _crol_(val, n); // 直接調用硬件循環移位
}
// 原子檢查並清零標誌位
if (_testbit_(FLAG_REG, 3)) {
// 執行關鍵區代碼,硬件保證原子性
}
文件位置與移植性
- Keil 安裝目錄:`C:\Keil\C51\INC\intrins.h`
- 僅限 Keil C51,IAR、SDCC、GCC 8051 不支援
- 跨編譯器項目建議封裝抽象層:`#ifdef __C51__ #include #endif`
為什麼不用內嵌汇編?
| 方式 | 優點 | 缺點 |
| intrins.h | 可讀性強、類型檢查、編譯器優化、可移植至同廠編譯器 | 僅限 Keil、功能固定 |
| 內嵌汇編 (`#pragma asm`) | 完全控制、指令級優化 | 破壞 C 抽象、難維護、編譯器相關、易出錯 |
常見應用場景
- 精確微秒延時:`_nop_()` 組合替代迴圈延時
- 位操作原子性:`_testbit_` 實現無中斷干擾的標誌檢查清零
- 數據加密/校驗:循環移位 `_crol_`/`_cror_` 實現 CRC、加密算法
- 外設寄存器操作:配合 `sfr`/`sbit` 高效控制硬件