商业联盟  用户: 密码: 注册  忘记密码
会员专区 会员手册 增值服务 帮助 商业论坛 “帖不够”广告信息


商业中国
博雅艺术
经营管理

专题
 
 您当前的位置:首页>>行业分类>>电子电气>>技术知识>>设计方案>>正文
SAM8系列S3C825A型单片机及其软件设计
  发布时间:2006-1-28 16:32:08 阅读次数:
来源:国外电子元器件 作者:贺兴华 张永亮 肖山竹
 

IAR C语言编译器把单片机的寄存器分成2组,其中高速暂存器组(R10-R15)中的函数参数由左至右依次传入R15至R10,直至这些寄存器点满,而其余函数参加由堆栈来传递。由迂些寄存器是暂存器,用完就释放掉,所以应用过程中不用保护。第二组为普通寄存器(R1、R4-R9),这组寄存器主要用作寄存器变量和保存中间变量,应用过程不必须对其进行保护,但在C语言函数编写中可以不体现,而由编译器自动完成。

当函数参数为以下2种类型时,应当选用堆栈方式传递:第一种是传递参数为struct或union大于4字节的参数类型。第二种是长度可变函数的未命名参数类型。

函数参数通常放在由堆栈指针指定的位置为起始的主存储器中,被调用函数的参数则由左至右依次存放在被指定的堆栈中,当被调用函数返回调用函数时,堆栈自动清零,主存储器空间被释放,以供下次供传递函数使用。

函数返回值可根据其类型放在R15或R15:R14寄存器对中。若返回值是struct或union类型,则返回R15中的值是存放返回结果的堆栈指针起始位置。

C语言编译器也是编译中断函数时会自动保护所用到的寄存器(包括R10-R15),状态寄存器FLAGS的保护也是在中断处理过程中自动完成的。中断过程中用到的寄存器都使用PUSH Rn的指令进行保护,而采用POP Rn指令恢复。当用IRET指令自动恢复状态寄存器FLAGS时,可以从中断中返回。

3.2 对汇编语言函数的约定

对于一个可以被C语言函数调用的汇编程序来说,使用时必须满足以下3点:

(1)符合C语言参数传递规则;

(2)有PUBLIC函数入口标志;

(3)在C语言函数中用extern声音为外部函数。

参加传递规则和C语言函数一样,所不同的是,要在汇编语言函数编写过程中具体体现出来。

4 应用实例

明确了以上调用规则,混合编程就比较容易了,归纳起来有以下几点:

(1)在C语言源文件中用“extern”关键字导入被汇编语言源文件导出的标号;

(2)在汇编语言源文件用“PUBLIC”关键字把标号导出到C语言源文件;

(3)在汇编语言中用“EXTERN”关键字导入被C语言函数源文件导出的关键字;

(4)用C语言把标号导出给汇编语言,这一步不需要关键字;

(5)把编辑好的C语言和汇编语言源文件导入设计系统,并用各自调用函数的指令调用。

下面以笔者在校音器设计中用到的2个例子来具体说明。

4.1 C语言和汇编语言相互调用

在该例中,用C语言函数main()调用汇编语言函数get_rand()以得到一个随机数,接着,用汇编语言函数get_rand()调用C语言库函数rand()再得到一个整型机随机数,然后用调用C语言函数mult()的方法把这个随机值的高位乘以main()函数传递给自己的实参,同时把乘积值返回给main()参数。

/****C语言源程序****/

#include<ios3c825a.h>/*头文件*/

extern unsigned char get_rand (unsigned char seed);/* 汇编语言原型声明*/

void main(void)/*主函数*/

{

unsigned char seed;

unsigned char value;/*定义变量*/

WTCON=0xa0; /*关闭watch dog*/

Seed=0x05;

Value=get_rand(seed); /*调用汇编语言函数,得到一个随机数*/

While(1); /*程序结束*/

}

/**加法子程序,供汇编语言调用**/

unsigned char add(unsigned char x,unsigned chary)

{

return (x+y);

}

/****C语言源程序结束 ****/

/****汇编语言源程序 ****/

#include <ios3c825a.h> ;头文件

EXTERN rand ;C语言库函数

EXTERN add ;用户自定义C函数

PUBLIC get_rand ;导出函数名给C函数调用

Get_rand:

PUSH R9 ;普通C函数入栈保护

LD R9,R15;C函数传递参数给R15,暂时存储在R9

CALL rand ;调用C库函数得到一个随机数,作为add的第一实参,存储在R15

LD R14,R9;C函数传递的参数,作为add的第二实参,存储在R14

CALL add ;add返回的值存储在R15中

POP R9 ;add出栈恢复寄存器内定

RET

END

/**** 汇编语言源程序结束 ****/

4.2 汇编语言写中断服务程序

为了提高系统响应速度,设计时往往要求中断服务程序的执行时间较短,执行速度较快。因此,最好的方法就是用汇编语言编写中断服务程序。但要注意以下2点:

(1)中断函数不传递参数和返回结果;

(2)中断过程中用到的寄存器都要进行保护。

本例中用汇编语言编写看门狗定时器的中断服务程序,而用C语言编写主程序。

/****C语言主程序****/

#include<ios3c825a.h> /*头文件*/

extern void in0(void); /*中断函数声明*/

void main(void)

{

CLKCON=0X98; /*开中断*/

IMR=0X10; /*IRQ4使能*/

WTCON=0X84;/*看门狗定时器设为0.25秒*/

P2CONL=0X03; /*P2.0为输出*/

IPH=0X00;

IPL=0XD6; /*中断函数所对矢量位置*/

CLKCON=0X18; /*关中断*/

while(1);

}

/****C语言主程序结束****/

/****汇编语言编写的中断程序****/

#include <ios3c825a.h> ;头文件

public 'int0' ;中断函数声音

RSEG WATCHT:CODE:RROT (1),0X00D6 ;中断矢量在代码段中的绝对位置

Int0:

PUSH R1 ;寄存器保护

LD R1,#01H ;给PORT2寄存器赋值,使连接P2.1的LED定时发头

POP R1;寄存器恢复

IRET;中断返回

END

/****汇编语言编写的中断程序逻辑****/

5 结束语

以上方法已经应用于笔者参与设计的校音器设计中并取得良好的效果。但也要注意调试过程中编译器选项的设置对程序运行结果有一定的影响,因此,对SAM8系统中不同的核,一定要选用不同的内核版本号,否则,寄存器传递的参数可能会错位,从而导致参数传递错误,给调试带来不便。

本新闻共2页,当前在第2页  1  2  

 
行业知识    
机械电子 能源化工 矿产物流 建材房产 纺织家电 手机通讯 医卫医改 财经商务 股票期货
媒体动漫 广告旅游 教育农业 餐饮娱乐 钢铁汽车 政策法律 碑帖青铜 书法国画 陶瓷收藏

相关新闻                    办公软件应用
·AVR单片机捕获中断实现红外线解码
·PIC18FXX8单片机通用同步异步收发器编程
·AT89C52单片机 ARINC429航空总线接口设计
·C51系列单片机设计物体分级设备测量光幕
·用ZHX1010实现单片机之间的红外通信
热点新闻
 
相关 连接  
 
 
站内搜索
    
最新新闻
·绿色能源的五种优势
·太阳能
·可燃冰
·氢能
·天然气
·乙醇汽油
·生物质能
·风能
·水能
·核能

热点话题         行行出状元!
 
Google
关键词导航
商业 机械 创业 车床 化工 期货 股票 财经
 
 
 
Google
 
Web www.Bizing.com