SPMC75和ASM(汇编)混合编程的应用
支持C语言几乎是所有微控制器程序设计的一项基本要求,当然SPMC75系列单片机也不例外。μ'nSPTM 指令结构的设计就着重考虑对C语言的支持,GCC就是一种针对μ'nSPTM 操作平台的ANSI-C编译器。但是在应用中对于程序的设计,特别是C和ASM混合使用的时候有些地方是需要注意的,在C中如何嵌入ASM也是一个不可回避的问题。
2芯片特性简介
SPMC75系列单片机是由凌阳科技设计开发的16位微控制器芯片,其内核采用凌阳科技自主知识产权的μ'nSP微处理器。SPMC75系列单片机集成了能产生变频电机驱动的PWM发生器、多功能捕获比较模块、BLDC电机驱动专用位置侦测接口、两相增量编码器接口等硬件模块;以及多功能I/O口、同步和异步串行口、ADC、定时计数器等功能模块,利用这些硬件模块支持,SPMC75可以完成诸如家电用变频驱动器、标准工业变频驱动器、多环伺服驱动系统等复杂应用。下面介绍SPMC75系列单片机资源特性:
■ 高性能的 16 位 CPU 内核 | ■ MCP 定时器 |
3函数调用
3.1 调用协议
模块代码间的调用,是遵循μ'nSPTM体系的调用协议(Calling Convention)。所谓调用协议,是指用于标准子程序之间一个模块与令一个模块的通信约定。即使两个模块是以不同的语言编写而成。
调用协议是指这样一套法则:它使不同的子程序之间形成一种握手通信接口,并完成一个子程序到另一个子程序之间的参数传递和控制,以及定义出子程序调用与子程序返回值的常规规则。
调用协议包括以下相关要素:
(1)调用子程序间的参数传递;
(2)子程序返回值;
(3)调用子程序过程中所用堆栈;
(4)用于暂存数据的中间寄存器。
μ'nSPTM调用协议的内容如下:
1、由于C编译器产生的所有标号都以下划线(_)为前缀,而C程序在调用汇编程序时要求汇编程序名也以下划线(_)为前缀。
2、参数以相反的顺序(从右到左)被压入堆栈中。必要时所有的参数都被转换成其在函数原型中被声明过的数据类型。但如果函数的调用发生在其声明之前,则传递在调用函数里的参数不会进行任何数据类型转换的。
3、各参数和局部变量在堆栈中的排列如图3-1所示。
4、16-Bit的返回值放在寄存器R1中,32-Bit的返回值存入寄存器R1和R2中,其中低字节在R1中,高字节在R2中。若要返回结构或指针需要在R1中存放一个指向结构的指针。
5、编译器会产生prolog/epilog过程动作来暂存或恢复PC、SR及BP寄存器。汇编器则通过CALL指令可将PC和SR自动压入堆栈中,而通过RETF或RETI指令将其自动弹出堆栈。
6、编译器所认可的指针是16-Bit的。函数指针实际上并非指向函数的入口地址,而是一个段地址的向量_function_entry,在该向量的两个连续Word的数据单元存放的值才是函数的入口地址。
图3-1 程序调用的堆栈使用
3.2 举例说明
◆C程序中调用ASM函数
无参数传递的C语言调用ASM函数。
/*-------------------------------------------------------*/ /* C 程序 /*-------------------------------------------------------*/ extern void F_Function(void); main() { /*-------------------------------------------------------*/ /* C |
- 用SPMC75F2313A实现LIN结点(10-15)
- 使用SPMC75F2413A设计的通用变频器(06-07)
- 基于SPMC75F2413A单片机的直流变频洗衣机的设计(05-29)
- 基于SPMC75F2413A的直流变频洗衣机的设计方法(05-10)
- 采用SPMC75F2313A的直流伺服驱动器(05-09)
- 基于智能功率模组芯片PS21865A和SPMC75F2413A的AC变频空调方案实现(05-02)