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

Franklin C51 與 A51 函數互相呼叫完整指南:參數傳遞、命名規則與實戰範例

     編輯:關於C語言

背景動機

Franklin C51 針對 Intel 8051 系列單晶片,提供豐富庫函數與自動記憶體管理,適合寫主程式。但特定場合需呼叫 A51 組語:既有組語庫重用、極致時序控制、高速 ISR、特殊介面協定。反之,組語主程式需 C51 強大數學庫(浮點、三角函數)時也需反向呼叫。本文系統說明雙向介面技術。

三大介面核心規則

1. 函數名轉換規則

C 定義目標檔符號備註
func()_func含暫存器參數傳遞
#pragma NOREGPARMS + func()func無前綴底線
static func()不公開僅模組內可見

組語需用 EXTRN CODE (_func) 或 EXTRN CODE (func) 對應宣告。

2. 區段命名規則

  • 程式碼區段:?PR?函數名?模組名(如 ?PR?FUNC?FUNC51)。
  • 區域資料/位區段:?函數名?BYTE, ?函數名?BIT,具 OVERLAYABLE 屬性供連結器覆蓋分析。
  • 儲存模式(SMALL/COMPACT/LARGE)影響區段定址空間,組語必須一致宣告。

3. 參數傳遞規則(關鍵)

預設使用暫存器傳遞前 3 參數,效率最高。#pragma NOREGPARMS 強制全走記憶體區段。

超過暫存器容量的參數溢位至固定記憶體區段(?函數名?BYTE)。

返回值傳遞

參數型別/個數暫存器分配 (R7:R6 為第一參數...)
char / 8-bitR7
int / 16-bitR7:R6
long / 32-bitR7:R6:R5:R4
指標 (SMALL)R1:R0 (DPL:DPH)
指標 (LARGE)R3:R2:R1:R0
型別暫存器
charR7
intR7:R6
longR7:R6:R5:R4
指標R3:R2:R1:R0 (視模式)

SRC 輸出法驗證介面

編譯選項 SRC 產生對應組語檔,可直接檢視參數/返回值分配:

; C: uchar func(uchar x, uchar y)
_func:
    MOV A, R7      ; x 在 R7
    MOV B, R5      ; y 在 R5
    DIV AB
    MOV R7, A      ; 返回值在 R7
    RET

實戰範例 1:組語呼叫 C51 函數

C51 (func51.c):#pragma NOREGPARMS + SMALL 模式,uchar func(uint v_a, uint v_b) 回傳 sqrt(v_a/v_b)。

A51 (ASM51.a51):

EXTRN CODE (func)
EXTRN DATA (?func?BYTE)

funca51 SEGMENT CODE
VAR     SEGMENT DATA
STACK   SEGMENT IDATA

RSEG VAR
a_v:   DS 2
b_v:   DS 2
result: DS 1

RSEG STACK
    DS 20H

RSEG funca51
    JMP START
START:
    MOV SP, #STACK-1
    MOV ?func?BYTE+0, a_v+0
    MOV ?func?BYTE+1, a_v+1
    MOV ?func?BYTE+2, b_v+0
    MOV ?func?BYTE+3, b_v+1
    LCALL func
    MOV result, R7
    END

連結:L51 ASM51.OBJ, func51.OBJ NOOVERLAY(禁止資料段覆蓋確保參數區不被重用)。

實戰範例 2:C51 呼叫組語 DS1820 單總線驅動

C51 主程式:宣告 extern 四個組語函數,主流程處理溫度轉換公式與 LCD 顯示。

A51 (RW1820.a51) 四子程式:

  • _WDS1820:寫 1 位元組命令(R7 傳參),含精確 15μs 延時。
  • _RDS1820:讀 9 位元組資料(R7 傳陣列指標),位搬移邏輯。
  • _RTDS1820:復位檢測存在脈衝,返回 C 旗標(bit 返回值)。
  • _DELAY15:R7 傳入倍數,雙層 DJNZ 實現 15μs 基準延時。

關鍵點:

  1. 區段名嚴格遵循 ?PR?函數名?RW1820。
  2. PUBLIC _RTDS1820, _WDS1820, _RDS1820, _DELAY15 匯出符號(底線對應 C51 預設慣例)。
  3. bit 返回值透過 PSW 的 C 旗標傳回,C51 以 extern bit RTDS1820(void) 接收。
  4. 所有時序關鍵路徑用 NOP 微調,12MHz 下精確符合 DS1820 規格。

避坑指南

  • 儲存模式(SMALL/COMPACT/LARGE)C 與組語必須一致,否則指標寬度/參數區段錯位。
  • 混用暫存器/記憶體參數時,務必用 SRC 輸出核對每個參數實際位置。
  • 組語修改暫存器(如 _WDS1820 用 R1, R2, R7)若與 C51 暫存器分配衝突,需在組語入口保存/恢復或改用 NOREGPARMS。
  • 連結時 NOOVERLAY 避免參數區被錯誤覆蓋;大專案建議模組化管理覆蓋關係。

掌握 C51/A51 混合編程,能在 8051 資源受限環境下發揮 C 的開發效率與組語的極致控制雙重優勢。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved