微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 51单片机混合编程

51单片机混合编程

时间:11-26 来源:互联网 点击:

ST1寄存器 的CPL位实现,CPL=0,DP寻址,CPL=1,SP寻址。在DP寻址的时候,由DP提供高9位地址,与低7位组成16位地址;在SP寻址的时候, 16位地址是由SP(16位)与低7位直接相加得来。

由于在C语言的环境下,局部变量的寻址必须通过SP寄存器实现,在混合编程的时候,为了使汇编语言不影响堆栈寄存器SP,通常的方式是在汇编环境中使用DP方式寻址,这样可以使二者互不干扰。编程中只要注意对CPL位正确设置即可

1 .word 的意思就相当与C语言里的int,char等定义一个变两的宽度

2. 编译错误原因有2:

a.如果在汇编里面定义.global(全局符号),那么在C语言里面应该用extern声明,以引用该符号。

b.在汇编里面声明的时候,符号前应加下划线,如 FIQ_Addr: .word EXTint_FIQ 应为: FIQ_Addr: .word _EXTint_FIQ 在C语言里面应用extern声明。 另外,一中方法是,用.ref 代替.global 来声明符号,这样就不用在C源程序里面用extern声明了。两种方法结果相同。 我讲的是用C和汇编混编程用法,至于C++变量如何翻译成汇编符号可以用仿真器,自己去看,原则类似.

汇编与C语言混合编程的关键问题

1 C程序变量与汇编程序变量的共用

为了使程序更易于接口和维护,可以在汇编程序中引用与C程序共享的变量:

.ref_to_dce_num,_to-dte_num,_to_dce_buff,_to_dte_buff

在汇编程序中引用而在C程序可直接定义的变量:

unsigned char to_dte_buff[BUFF_SIZE]; //DSP发向PC机的数据

int to_dte_num; //缓冲区中存放的有效字节数

int to_dte_store; //缓冲区的存放指针

int to_dte_read; //缓冲区的读取指针

这样经过链接就可以完成对应。

2 程序入口问题

在C程序中,程序的入口是main()函数。而在汇编程序中其入口由*.cmd文件中的命令决定,如:-e main_start;程序入口地址为 main _start。这样,混合汇编出来的程序得不到正确结果。因为C到ASM的汇编有默认的入口c-int00,从这开始的一段程序为C程序的运行做准备工作。这些工作包括初始化变量、设置栈指针等,相当于系统壳不能跨越。这时可在*.cmd文件中去掉语句:-e main_start。如仍想执行某些汇编程序,可以C函数的形式执行,如:

main_start(); //其中含有其他汇编程序

但前提是在汇编程序中把_main_start作为首地址,程序以rete结尾(作为可调用的函数)的程序段,并在汇编程序中引用_main_start,即.ref _main_start。

3 移位问题

在C语言中把变量设为char型时,它是8位的,但在DSP汇编中此变量仍被作为16位处理。所以会出现在C程序中的移位结果与汇编程序移位结果不同的问题。解决的办法是在C程序中,把移位结果再用0X00FF去“与”一下即可。

4 堆栈问题

在汇编程序中对堆栈的依赖很小,但在C程序中分配局部变量、变量初始化、传递函数变量、保存函数返回地址、保护临时结果功能都是靠堆栈完成。而C编译器无法检查程序运行时堆栈能否溢出。

5 程序跑飞问题

编译后的C程序跑飞一般是对不存在的存储区访问造成的。首先要查.MAP文件与memory map图对比,看是否超出范围。如果在有中断的程序中跑飞,应重点查在中断程序中是否对所用到的寄存器进行了压栈保护。如果在中断程序中调用了C程序,则要查汇编后的C程序中是否用到了没有被保护的寄存器并提供保护(在C程序的编译中是不对A、B等寄存器进行保护的)。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top