ZHCU876Z July 2001 – October 2023 SM320F28335-EP
C28x 链接器中阻止链接 64 字页大小 (C28x) 和 128 字页大小 (C2XLP) 代码的错误已更改为警告。可以从 C28x C/C++ 代码中调用 C2XLP 汇编函数。一种可能的方法是用一个为C2XLP代码正确设置参数和调用栈的 veneer 函数来替换对C2XLP 函数的调用。例如,要调用一个需要五个整数参数的 C2XLP 函数,请将 C28x 代码更改为:
extern void foo_veneer(int, int, int, int, int);
void bar()
{
/* replace the C2XLP call with a veneer call */
/* foo(1, 2, 3, 4, 5); */
foo_veneer(1, 2, 3, 4, 5);
}
用于链接 C2xx 和 C2XLP 代码的 Veneer 函数 说明了 veneer 函数可以看起来::
.sect ".text"
.global _foo_veneer
.global _foo
_foo_veneer:
;save registers
PUSH AR1:AR0
PUSH AR3:AR2
PUSH AR5:AR4
;set the size of the C2XLP frame (including args size)
ADDB SP,#10
;push args onto the C2XLP frame
MOV *-SP[10],AL ;copy arg 1
MOV *-SP[9],AH ;copy arg 2
MOV *-SP[8],AR4 ;copy arg 3
MOV *-SP[7],AR5 ;copy arg 4
MOV AL,*-SP[19]
MOV *-SP[6],AL ;copy arg 5
;save the return address
MOV *-SP[5],#_label
;set AR1,ARP
MOV AL,SP
SUBB AL,#3
MOV AR1,AL
NOP *ARP1
;jump to C2XLP function
LB _foo
_label:
;restore register
POP AR5:AR4
POP AR3:AR2
POP AR1:AR0LRETR
由于 veneer 函数框架将充当所有 C2XLP 调用的框架,因此有必要为第一个C2XLP函数的任何后续调用添加足够的框架大小。
对于为 COFF ABI 编译的 C28x C/C++ 代码,全局变量放置在.ebss 段中。与 C28x 代码链接时,不能保证 C2XLP .ebss 段从 128 字边界开始。为避免此问题,请定义一个新段,将 C2XLP 全局变量更改为新段,并更新链接器命令文件以确保此新段从128 字边界开始。