【问题标题】:Absolute function address keil 8051绝对函数地址keil 8051
【发布时间】:2015-03-28 22:13:54
【问题描述】:

C51 Keil如何定位和调用具有绝对地址的函数? 后台 ROM 有一些实用功能。我想调用这些函数来优化flash的代码空间。

【问题讨论】:

    标签: 8051 keil c51


    【解决方案1】:

    一个简单的例子:

    #pragma SRC
    
    // type of external function
    typedef void (code * tExternalFunctionPtr)(void);
    
    // Address of external function in ROM
    #define FUNC_ADDR (0x1234)
    
    void callExample(void)
    {
        // Simple example with call via function pointer in RAM
        tExternalFunctionPtr funcPtr;
        funcPtr = FUNC_ADDR;
        (*funcPtr)();
    
        // Direct call without function pointer in RAM
        (* (tExternalFunctionPtr)FUNC_ADDR)();
    }
    

    编译成以下汇编代码:

    ; TEST.SRC generated from: TEST.C
    
    
    NAME    TEST
    
    ?PR?callExample?TEST SEGMENT CODE
    EXTRN    CODE (?C_ICALL)
    PUBLIC    callExample
    ; #pragma SRC
    ; 
    ; // type of external function
    ; typedef void (code * tExternalFunctionPtr)(void);
    ; 
    ; // Address of external function in ROM
    ; #define FUNC_ADDR (0x1234)
    ; 
    ; void callExample(void)
    
        RSEG  ?PR?callExample?TEST
        USING    0
    callExample:
                ; SOURCE LINE # 9
    ; {
                ; SOURCE LINE # 10
    ;     // Simple example with call via function pointer in RAM
    ;     tExternalFunctionPtr funcPtr;
    ;     funcPtr = FUNC_ADDR;
                ; SOURCE LINE # 13
    ;---- Variable 'funcPtr?01' assigned to Register 'R6/R7' ----
        MOV      R7,#034H
        MOV      R6,#012H
    ;     (*funcPtr)();
                ; SOURCE LINE # 14
        MOV      R2,AR6
        MOV      R1,AR7
        LCALL    ?C_ICALL
    ; 
    ;     // Direct call without function pointer in RAM
    ;     (* (tExternalFunctionPtr)FUNC_ADDR)();
                ; SOURCE LINE # 17
        LCALL    01234H
    ; }
                ; SOURCE LINE # 18
        RET      
    ; END OF callExample
    
        END
    

    这可能有助于说明它在原则上是如何工作的。

    但这还不是全部: 您必须知道要调用的 ROM 中函数的地址。您还必须知道是否以及如何预期参数以及返回值。 了解 ROM 功能可能更改的寄存器并确保 C51 编译器不会期望这些寄存器不变也很重要。

    【讨论】:

      猜你喜欢
      • 2021-10-20
      • 2019-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-01
      • 2023-03-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多