Абсолютная функция адреса keil 8051

Как найти и вызвать функции с абсолютным адресом в C51 Keil? Фоновое ПЗУ имеет несколько служебных функций. Я хочу вызвать эти функции, чтобы оптимизировать кодовое пространство flash.

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

Это может помочь показать, как это может работать в принципе.

Но это еще не все: вы должны знать адрес функции в ПЗУ, которую хотите вызвать. Вы также должны знать, ожидаются ли параметры и как возвращаются возвращаемые значения. Также важно знать, какие регистры могут измениться функции ПЗУ, и убедиться, что компилятор C51 не ожидает, что эти регистры не изменятся.

Другие вопросы по тегам