F2812中C语言调用汇编函数
C 汇编
原文地址:F2812中C语言调用汇编函数作者:baozhenghuahz F2812中C语言调用汇编函数 参考资料: (1) SPRU514 ---- TMS320F28x Optimizing C/C++ Compiler User’s Guide.pdf; (2) spru430d ---- TMS320C28x DSP CPU and Instruction Set Reference Guide; (3) spru513c ---- TMS320C28x Assembly Language Tools User's Guide. 一、编写C语言能调用的.asm文件 以delay.asm为例: 1、将文件保存为.asm文件; 2、在文件中编写如下代码: ;*********************************************************************/ ;* 鲍正华 */ ;* 2010.07.09 */ ;*********************************************************************/ ; @FunctionName: ; ; @Brief: ; ; @Param: ; ; @Return: 无 ;//########################################################################### _Delay_asm: ;There is a 9/10 cycle overhead and each loop ;takes five cycles. The LoopCount is given by ;the following formula: ; ; LoopCount = (DELAY_CPU_CYCLES - 9) / 5 ; The macro DELAY_US(A) performs this calculation for you ; ;***********************************************************************/ 3、在步骤2中: .def _Delay_asm用来定义函数名; .global .sect".delayasmpage"将函数定位到定义的段中,也可以是.text,可以灵活运用; _Delay_asm:为函数标号,注意一定在前面加上下划线_否则C文件不能调用; LRETR是函数返回,采用了RPC时必须用该指令。 4、在C文件中对函数原型进行声明: extern void Delay_asm(unsigned long cnt); 5、在C 文件中以C语言形式调用汇编函数: //延时1s Delay_asm(18000000L); 6、上边的参数unsigned long cnt传递给了累加器ACC。 参考(1) SPRU514 ---- TMS320F28x Optimizing C/C++ Compiler User’s Guide.pdf中的page168~169中的内容。 要点: 1、如果汇编语言中修改了XAR1、XAR2和XAR3的值,必须对它们进行保护: 2、16位参数从左至右依次传递给:AL、AH、XAR4、XAR5; 3、指针参数依次传递给:XAR4、XAR5,其它指针参数放到stack中; 4、32位的参数传递给累加器ACC(AH/AL),其它32位参数放到stack中。 例子: (1)汇编代码: ;//########################################################################### ; @FunctionName: ; ; @Brief: ; ; @Param: ; ; @Return: 无 ;//########################################################################### _Xintf_memcpy_asm: ;copy指定区域(从XAR4指定区域copy到XAR5指定区域) $1: (2)C文件中对函数原型的声明: extern void Xintf_memcpy_asm(unsigned int* dest_addr, unsigned int* src_addr, unsigned long length); (3)C文件中以函数原型形式对汇编函数进行调用: Xintf_memcpy_asm((unsigned int*)ZONE6ADDRESS, (unsigned int*)ZONE2ADDRESS, 102400L); (4)这里参数传递过程是:ZONE6ADDRESS 传递给XAR4, ZONE2ADDRESS 传递给XAR5, 102400L 传递给ACC |
|