MSP430 C和汇编的嵌套
- 格式:pdf
- 大小:244.07 KB
- 文档页数:2
关于c语言和汇编语言相互嵌套调用的学习总结在计算机编程中,C语言和汇编语言是两种常用的编程语言。
C语言是一种高级语言,而汇编语言则是一种低级语言。
尽管C语言在编程方面更为简单和人性化,但是汇编语言却更为底层和灵活。
因此,在一些特定的情况下,C语言与汇编语言会相互嵌套调用,以充分发挥各自的优势。
首先,理解C语言和汇编语言的基本特点是学习的关键。
C语言是一种结构化的高级语言,它具有变量和函数的特性。
C语言通过调用函数来完成特定的任务,使用变量来存储和操作数据。
相比之下,汇编语言是一种低级语言,它直接操作计算机硬件,使用寄存器和内存地址来存储和操作数据。
汇编语言的指令直接映射到底层的CPU指令。
其次,学习如何在C语言中嵌入汇编代码。
在C语言中,可以使用内联汇编语句来嵌入汇编代码。
为了实现这一点,需要使用特殊的语法。
在GCC编译器中,可以使用asm关键字来指定内联汇编代码。
内联汇编语句由汇编语句和C语言代码组成,以实现C函数内的底层操作。
通过内联汇编,可以直接访问底层硬件功能,并在C函数中实现特定的优化。
而在汇编语言中嵌入C代码则需要借助外部汇编调用接口。
在C语言中编写函数时,可以使用extern关键字声明函数为外部函数。
对于汇编语言而言,可以使用特定的语法和指令来调用C函数。
在调用C函数时,需要将参数传递给C函数,并处理返回值。
通过外部汇编调用接口,可以在汇编语言中利用C函数的高级功能,如数组操作、内存分配等。
当C语言和汇编语言相互嵌套调用时,需要注意以下几点。
首先,理解数据传递的原理。
C语言和汇编语言使用不同的参数传递方式。
C语言通常使用栈来传递参数,而汇编语言则使用寄存器。
在混合编程中,需要确保参数正确地传递给函数。
其次,需要注意变量的声明和使用。
C语言和汇编语言使用不同的编译规则和约定。
在混合编程中,需要正确地定义和使用变量,以免引起错误。
此外,需要注意寄存器的保存和恢复,以避免影响程序的正确执行。
单片机C语言与汇编语言的混合编程(选自《单片机C语言编程应注意的若干问题》)在绝大多数场合采用C语言编程即可完成预期的目的,但是对实时时钟系统、要求执行效率高的的系统就不适合采用C语言编程,对这些特殊情况进行编程时要结合汇编语言。
汇编语言具有直接和硬件打道、执行代码的效率高等特点,可以做到C语言所不能做到的一些事情,例如对时钟要求很严格时,使用汇编语言成了唯一的选择。
这种混合编程[2]的方法将C语言和汇编语言的优点结合起来,已经成为目前单片机开发最流行的编程方法。
目前大多数据单片机系统,在C语言中使用汇编语言有两种情况:一种是汇编程序部分和C程序部分为不同的模块,或不同的文件,通常由C程序调用汇编程序模块的变量和函数(也可称为子程序或过程);另一种是嵌入式汇编,即在C语言程序中嵌入一段汇编语言程序。
当汇编程序和C程序为不同模块时程序一般可分为若于个C程序模块和汇编程序模块,C程序模块通常是程序的主体框架,而汇编程序模块通常由用C语言实现效率不高的函数组成,也可以是已经成熟的、没有必要再转化成C语言的汇编子程序。
在这种混合编程技术中,关键是参数的传递和函数的返回值。
它们必须有完整的约定,否则数据的交换就可能出错。
对于嵌入式汇编,可以在C程序中使用一些关键字嵌入下些汇编程序,这种方法主要用于实现数学运算或中断处理,以便生成精练的代码,减少运行时间。
当汇编函数不大,且内部没有复杂的跳转时,可以用嵌入式汇编实现。
下面就以AT89C2051单片机在模拟电压检测中的应用为例说明C语言程序与汇编语言程序的调用。
电路图如图1所示:AT89C2051单片机内置模拟比较器,13脚即P1.1是比较器的负输入端,12脚即P1.0是比较器的正输入端,比较器的输出端做在了CPU内部即P3.6未被引出,CPU可以直接读取P3.6状态来判定两输入端比较的结果其和一个外部电阻及一个外部电容器就可以设计成一个A/D转换器,采用RC模拟转换的原理,来检测外部P1.1引脚的输入电压。
msp430简介MSP430是德州公司新开发的一类具有16位总线的带FLASH 的单片机,由于其性价比和集成度高,受到广大技术开发人员的青睐.它采用16位的总线,外设和内存统一编址,寻址范围可达64K,还可以外扩展存储器.具有统一的中断管理,具有丰富的片上外围模块,片内有精密硬件乘法器、两个16位定时器、一个14路的12位的模数转换器、一个看门狗、6路P口、两路USART通信端口、一个比较器、一个DCO内部振荡器和两个外部时钟,支持8M 的时钟.由于为FLASH型,则可以在线对单片机进行调试和下载,且JTAG口直接和FET(FLASH EMULATION TOOL)的相连,不须另外的仿真工具,方便实用,而且,可以在超低功耗模式下工作对环境和人体的辐射小,测量结果为100mw左右的功耗(电流为14mA左右),可靠性能好,加强电干扰运行不受影响,适应工业级的运行环境,适合与做手柄之类的自动控制的设备.我们相信MSP430单片机将会在工程技术应用中得以广泛应用,而且,它是通向DSP系列的桥梁,随着自动控制的高速化和低功耗化, MSP430系列将会得到越来越多人的喜爱.一、IO口(一)、P口端口寄存器:1、PxDIR 输入/输出方向寄存器(0:输入模式 1:输出模式)2、PxIN 输入寄存器输入寄存器是只读寄存器,用户不能对其写入,只能通过读取该寄存器的内容知道I/O口的输入信号。
3、PxOUT 输出寄存器寄存器内的内容不会受引脚方向改变的影响。
4、PxIFG 中断标志寄存器(0:没有中断请求 1:有中断请求)该寄存器有8个标志位,对应相应的引脚是否有待处理的中断请求;这8个中断标志共用一个中断向量,中断标志不会自动复位,必须软件复位;外部中断事件的时间必须>=1.5倍的MCLK的时间,以保证中断请求被接受;5、PxIES 中断触发沿选择寄存器(0:上升沿中断 1:下降沿中断)6、PxSEL 功能选择寄存器(0:选择引脚为I/O端口 1:选择引脚为外围模块功能)7、PxREN 上拉/下拉电阻使能寄存器(0:禁止 1:使能)(二)、常用特殊P口:1、P1和P2口可作为外部中断口。
msp430的中断优先级和中断嵌套第一篇:msp430的中断优先级和中断嵌套msp430的中断优先级和中断嵌套MSP430的中断优先级按所在的向量的大小排列,中断向量地址越高优先级就越大,但是默认的MSP430是不能中断嵌套的,要想在执行某一中断时能够响应更高优先级的中断,需要在低优先级的中断程序中手动打开全局中断使能位,因为在进入中断服务子程序时全局中断使能位被清零,即禁止响应其它中断。
msp430的指令中,DINT 和EINT分别指关和开所有中断,也就是包涵P1IE、P2IE、WDTIE、TAIE、TBIE、ADC12IE、串口中断允许的所有中断允许位为“0”和为“1”。
当同时有多个中断来的时候才有优先级的考虑(优先级顺序可查看向量表)有中断响应以后自动关闭总中断,这个时候即使来更高优先级的中断都不会响应。
要中断嵌套的话,就必须在中断中打开总中断。
实现中断嵌套需要注意以下几点:1)430默认的是关闭中断嵌套的,除非你在一个中断程序中再次开总中断EINT;2)当进入中断程序时,只要不在中断中再次开中断,则总中断是关闭的,此时来中断不管是比当前中断的优先级高还是低都不执行;3)若在中断A中开了总中断,则可以响应后来的中断B(不管B 的优先级比A高还是低),B执行完再继续执行A。
注意:进入中断B 后总中断同样也会关闭,如果B中断程序执行时需响应中断C,则此时也要开总中断,若不需响应中断,则不用开中断,B执行完后跳出中断程序进入A程序时,总中断会自动打开;4)若在中断中开了总中断,后来的中断同时有多个,则会按优先级来执行,即中断优先级只有在多个中断同时到来时才起做用。
5)对于单源中断,只要响应中断,系统硬件自动清中断标志位,对于TA/TB定时器的比较/捕获中断,只要访问TAIV/TBIV,标志位被自动清除;对于多源中断(多个中断源共用一个中断向量)要手动清标志位,比如P1/P2口中断,要手工清除相应的标志,如果在这种中断用“EINT();”开中断,而在打开中断前没有清标志,就会有相同的中断不断嵌入,而导致堆栈溢出引起复位,所以在这类中断中必须先清标志再打开中断开关.特别注意:正是这段说明容易让人上当。
C语言与汇编语言相互结合的嵌套汇编语言
在单片机学习的过程中,掌握一点汇编语言是非常有必有的,作为低级语言汇编语言在单片机开发中有它不可取代的作用,比如每条指令可以精确的确定延时时间,便于理解非常适合硬件工程师学习。
但是要提高单片机技能,必须掌握 C 语言编程,因为 C 语言有强大的模块化管理思想。
我想在很多人学习的过程中即学了汇编语言,又学习了C 语言,那么一个问题便随之而产生,如果将C 语言与汇编语言相互结合,达到更好的编程效果,本次讲解就是基于这个问题而生成的。
大家可以看到,我的延时函数用的汇编。
然而编译后无法创建目标。
此时大家右键左边的工作组1:Source Group 1。
然后点击第一个OpTIons for Group Source Group 1。
将对话框右边红圈内两个选项各点两次,使对勾成为黑色。
点击OK后就可以编译了。
如果大家在编译时出现两个警告:
警告内容如下:
*** WARNING L1:UNRESOLVED EXTERNAL SYMBOL
SYMBOL:?C_START
MODULE:STARTUP.obj (?C_STARTUP)
*** WARNING L2:REFERENCE MADE TO UNRESOLVED EXTERNAL SYMBOL:?C_START
MODULE:STARTUP.obj (?C_STARTUP)
ADDRESS:0038H。
关于MSP430中断、中断嵌套的一些注意
事项
1、MSP430默认的是关闭中断嵌套的,除非在一个
中断程序里面再次开启了总中断EINT();2、当进入中断程序时,只要不在中断中再次开中断,则总中断总是
关闭的,此时如果来中断,不管中断的优先级高还是低,都不执行。
3、如果在中断A中开放了总中断,则可以响应之后
到来的中断B(无论B的优先级是高还是低),B执行完了,再继续执行A。
这里,进入中断B之后,总中断同样也会关闭的。
如果中断B执行的过程中,还需要执行中断C,则此时也要在中断B中开放总中断。
若不需要响应中断,则不用开放总中断。
B执行完以后,跳出中断程序,进入A程序执行的时候,总中断会
自动打开。
4、若在中断之中开放了总中断,那么后来的中断同
时发生多个的话,则会按照优先级的顺序来执行,即
MSP430的中断优先级只有在
多个中断同时到来的时候才会起作用。
5、对于单中断源的中断,
只要响应中断,系统的硬件会自动的清除中断标志位。
对于TA、TB这样的定时器的比较、捕获中断,只要
访问TAIV/TBIV标志位就会被自动清除。
对于多源中断,需要手动清除标志位。
比如:P1、P2的中断,需要手动清楚相应的标志位。
如果在这种中断中使用“_EINT();”,开中断,而在打开中断之前,没有进行原来中断标识位
的清除工作,就会有相同的中断
不断的进行嵌套。
而导致堆栈溢出引起复位,所以在这类中断中,必须先清除标志位,再打开中断开关。
要
不然等着死机吧。
72
2005112
M S P430C 和汇编的嵌套
■中国海洋大学 闫建国
孙克怡
采用C 语言进行程序设计,可大大提高软件开发效
率,增强代码的可靠性、可读性和可移植性,使设计者可以将更多注意力集中在所需实现的功能上。
16位精简指令集的MSP430系列单片机,具有很强的处理能力,并具有十进制加法指令和多条模拟指令。
采用汇编语言能最大限度发挥MSP430的指令特性,提高执行效率,并且某些时序要求严格的程序必须使用汇编语言设计。
实现两种语言的嵌套能使开发者兼顾二者的优势。
IAR 公司为MSP430系列单片机提供的C430编译器允许汇编语言模块与C 语言模块进行无缝嵌套。
1 混合编译接口格式
汇编语言使用PUBLIC 导出汇编定义的函数,格式为:
NAM E M YNAM ESPACE PUBL IC FUNCNAM E
RESEG CODE
FUNCNAM E
//用户函数体RET/RETI
//函数返回/中断返回
其中,FUNCNAME 即为用户定义的函数名。
C 语言中使
用extern 导入汇编导出的函数,格式为extern FUNC 2NAME (Param1..n ),然后即可在C 中调用该函数。
也可以使用C430编译器创建汇编语言源程序框架,然后由用户在这个框架中加入功能实现部分。
下面创建了一个C 语言函数,只声明所引用的变量类型和返回类型,而没有实现部分。
returntype funcname (Param1..n ){
return (result );}
对此函数进行编译。
编译时选中Workbench 菜单下的project →Options →ICC430→List →Assembly output file ,这样编译后生成汇编语言源文件(s43)和汇编列表文件(lst )。
其中,汇编语言源文件包含了变量声明、参数传
递、函数返回和变量访问等,用户可在此程序框架基础上编写用户代码。
汇编也可以使用C 语言编写的函数。
汇编使用EX 2TERN FUNCNAME 导入C 语言函数,然后即可调用该函数。
调用格式为CALL #FUNCNAME 。
2 调用规则
2.1 寄存器的使用
C430编译器使用2组寄存器R12~R15来进行参数
传递,因此在两次调用之间R12~R15通常不加保护。
其他寄存器R4~R11主要用于存放寄存器变量和中间结果,在两次调用之间必须加以保护。
2.2 堆栈结构和参数传送
每次函数调用都会创建如图1
所示的堆栈结构。
图 1
参数依照从右至左的次序传递。
最左边的2个参数用寄存器传递,但是如果它们是结构体或联合,则仍用堆栈传递。
其余参数总是用堆栈传递。
f (w ,x ,y ,z )的参数
传递如表1所列。
表 1
参 数
小于32位32位
结构体/联合
第4个参数z 堆栈堆栈
堆栈第3个参数y 堆栈
堆栈堆栈第2个参数x R14R15∶R14堆栈第1个参数w
R12R13∶R12堆栈结果
R12
R13∶R12
R12所指区域
74
74
2005112
由于通道13(接收通道)的配置与通道12类似,此处不做具体说明。
213 PI NG PONG 缓存
在上述两种情况下,EDMA 和CPU 使用同一块存储区。
EDMA 把数据搬到L2,等CPU 处理完数据后,再把数据搬出。
这种传输模式与实时信号处理是相违背的。
在实时要求很高的情况下,可以把EDMA 配置成PIN
G 图5 PI NG PONG 原理图PON G BU FFERIN G 的模式,其基本思想如图5所示。
当EDMA 在处理PIN G BU FFER 时,CPU 在处理PON G -BU FFER ,
都处理完之后相互交换。
其逻辑结构图如图6所示。
由逻辑结构图可以得到ED 2MA 的配置(以下仅以发送方式加以说明)。
为了便于CCS 实现,假设数据存储在外部存储器中。
hEdma_ch12=hEdam_ping_xmt ,它们的源地址都是ping_src 。
hEdma_pong _xmt 的源地址是pong _src 。
hEdma _ping _xmt
和
图6 PI NG PONG 逻辑结构图
hEdma_pong_xmt 的其余配置都一样。
利用EDMA 的L IN K 功能即能实现三者之间的联系。
EDMA_link (hEdma_ch12,hEdma_pong_xmt ),EDMA_link (hEdma_pong_xmt ,hEdma_ping_xmt ),
EDMA_link (hEdma_ping_xmt ,hEdma_pong_xmt ),
实现了EDMA 的通道12从两个不同的源地址搬移数
据。
同样通道13可以把数据搬移到两个不同的目的地址。
结 语
利用片上、片外以及片上资源之间的关系,构造所需要的逻辑结构图,可以引导大家写出相应的配置程序。
本文仅对逻辑结构图进行分析,具体程序还请读者自行给出。
希望这样的思想能给读者一定的帮助,也望大家提出更好的学习方法,一起探讨。
参考文献
1 李方慧,等.TMS320C6000系列DSPs 原理及应用.第2版.
北京:电子工业出版社,2003
2 T exas Instruments TMS320C6000Peripherals Reference G uide.
2001
3 Texas Instrument s TMS320C6000Chip Support library A PI
Reference Guide.2003
4 T exas Instruments TMS320C6000DSP EDMA C ontroler Refer 2ence G uide.2004
5 Texad Instrument s Application Using t he TMS320C6000En 2hanced EDMA.2001
(收稿日期:2005208215)
72 3 注意事项
3.1 堆栈空间回收
在C 语言中调用汇编函数时,若参数通过堆栈传递,必须保证堆栈空间回收。
C 语言调用汇编函数时,参数自动进栈(若需要),最后压入PC 值。
被调用汇编函数从SP 取最后一个进栈参数,依次类推。
返回前应执行如下语句:
MOV @SP ,COUN T (SP )ADD COUN T ,SP
COUN T 为堆栈中参数所占的字节数。
上述两条语
句用于释放参数占用的堆栈空间。
若不执行该语句,则参数将一直存在于堆栈中,多次运行将耗尽RAM 。
3.2 汇编调用C 语言函数
由于被调用C 函数可能使用寄存器,有必要将R4~
R15中所有可能被更改的寄存器进栈保护,并在C 函数返
回后出栈。
另外,由于EXTERN 只是将函数的入口地址(标号)导入汇编,函数的参数并没有自动传递,故调用前需要用户将参数放入堆栈或R12~R15中。
函数若有返回值,则应在恢复寄存器之前将返回值保存到空闲的寄存器或RAM 中。
对于参数需要通过堆栈传递的函数仍然要注意堆栈空间的回收。
3.3 汇编语言编写的中断服务程序
进入中断函数前,系统自动将PC 和SR 进栈。
但由于中断可能发生在一个前台函数运行期间,故中断函数入口处应将用到的任意寄存器用PUSH R x 指令保存(包括R12~R15),退出时用POP R x 指令恢复进栈保护的寄存器,最后用RETI 指令装载PC 和SR 并从中断返回。
闫建国:硕士研究生,主要研究方向为单片机控制和智能仪表的构建。
孙克怡:教授,主要研究方向为远程抄表和自动化。
(收稿日期:2005207220)。