首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> C 語言問答

單片機 C 語言 intrins.h 頭文件詳解:內建函數與汇編指令映射

     編輯:C 語言問答

單片機 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 抽象、難維護、編譯器相關、易出錯

常見應用場景

  1. 精確微秒延時:`_nop_()` 組合替代迴圈延時
  2. 位操作原子性:`_testbit_` 實現無中斷干擾的標誌檢查清零
  3. 數據加密/校驗:循環移位 `_crol_`/`_cror_` 實現 CRC、加密算法
  4. 外設寄存器操作:配合 `sfr`/`sbit` 高效控制硬件
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved