Абсолютная функция адреса 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 не ожидает, что эти регистры не изменятся.