C语言混合编程.pptx

上传人:一*** 文档编号:71820514 上传时间:2023-02-06 格式:PPTX 页数:35 大小:311.71KB
返回 下载 相关 举报
C语言混合编程.pptx_第1页
第1页 / 共35页
C语言混合编程.pptx_第2页
第2页 / 共35页
点击查看更多>>
资源描述

《C语言混合编程.pptx》由会员分享,可在线阅读,更多相关《C语言混合编程.pptx(35页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、会计学1C语言混合语言混合(hnh)编程编程第一页,共35页。提纲提纲(tgng)n n一、存储器模式一、存储器模式一、存储器模式一、存储器模式(msh)(msh)n n二、寄存器规则二、寄存器规则二、寄存器规则二、寄存器规则n n三、函数调用规则三、函数调用规则三、函数调用规则三、函数调用规则n n四、中断函数四、中断函数四、中断函数四、中断函数n n五、表达式分析五、表达式分析五、表达式分析五、表达式分析第1页/共35页第二页,共35页。DSP中增加中增加(zngji)的的C关键字关键字 p280n nConst:定义常量,保证不被改变n n例:int*const p=&x;n n con

2、st int*q=&x;n nVolatile:定义一个(y)变量,保证其不被优化掉n n 例:unsigned int*ctrln n while(*ctrl!=0 xFF)n n volatile unsigned int*ctrl第2页/共35页第三页,共35页。n nIoport:定义端口n n 例子:ioport unsigned port10n nInterrupt:定义一个中断服务函数n n 例子:interrupt void int_handler()n nNear/far:定义函数的调用(dioyng)方式n n 例子:near foo()用call来调用(dioyng)n

3、n far int foo()用fcall远程调用(dioyng)n n 第3页/共35页第四页,共35页。n n定点(dn din)DSP芯片C程序的开发过程主要分以下几个步骤:n n 1.用编辑器(如EDIT、ccs等)编辑一个或多个C程 序,如example1.c,example2.c。2.编译C程序,形成目标文件,如example1.obj,example2.obj:dspcl_v25_g_mn_o2 example1.cdspc_v50_g_mn_o2 example1.c 命令选项中的_v25表示是TMS320C2X,若是TMS320C5X,则选项为_v50。第4页/共35页第五页

4、,共35页。n n3.根据实际应用编辑一个链接命令文件(wnjin),如example.cmd。n nMEMORYn nPAGE0:VECS:origin=0h len=30hPAGE0:PROG:orgin=30h len=0EFDOh/*程序空间*/PAGE1:DATA:origin=800h len=OE800h/*数据空间*/第5页/共35页第六页,共35页。SECTIONSSECTIONS.vectors:VECS/*.vectors:VECS/*中断矢量中断矢量(sh(sh ling)*/ling)*/.text:PROG PAGE0/*.text:PROG PAGE0/*代码代码

5、*/*/.cinit:PROG PAGE0/*C.cinit:PROG PAGE0/*C初始化表初始化表*/*/.switch:PROG PAGE0 /*switch.switch:PROG PAGE0 /*switch语句表语句表*/*/.bss:DATA PAGE1/*.bss:DATA PAGE1/*变量变量*/*/.const:DATA PAGE1/*.const:DATA PAGE1/*常数变量常数变量*/*/.stack:DATA PAGE1/*.stack:DATA PAGE1/*系统堆栈系统堆栈*/*/.sysmem:DATA PAGE1/*.sysmem:DATA PAGE1

6、/*动态存储器动态存储器*/*/第6页/共35页第七页,共35页。n n4.链接(lin ji)形成example.out:dsplnk example.cmd5.用C源码调试器进行调试(模拟器、硬件仿真器等)。n n第7页/共35页第八页,共35页。n n例:用C语言编写一个TMS320C5X的输入输出程序,并用simulator进行调试。/*本程序是TMS320C5X的一个I/O口输入和输出程序,程序从I/O口地址(dzh)0 x0读入8位数据并存入数组中,同时将另一数组的数值写至I/O口地址(dzh)0 x1*/第8页/共35页第九页,共35页。include ioports.h/*包含

7、(bohn)ioports.h头文件*/define RD_PORT 0 x00;/*定义输入I/O口*/define WR_PORT 0 x01;/*定义输出I/O口*/int indata5,outdata5;/*定义全局数组*/main()int i;for(i=0;i5;i+)outdata=i2;/*初始化outdata数组*/for(i=0;i5;i+)/*循环5次*/inport(RD_PORT,&indata);/*读I/O口*/outport(WR_PORT,&outdata);/*写I/O口*/第9页/共35页第十页,共35页。n n用用TMS320C5X simulato

8、rTMS320C5X simulator调试调试I/OI/O口时,将口时,将I/OI/O口与一文件相关联。口与一文件相关联。这里我们建立两个文件这里我们建立两个文件RD.DATRD.DAT和和WR.DATWR.DAT,并将,并将RD.DATRD.DAT文件初文件初始化为:始化为:0 x00110 x00110 x00220 x00220 x00330 x00330 x00440 x00440 x00550 x0055上述上述(shngsh)(shngsh)程序运行结束后,可以观察数组程序运行结束后,可以观察数组indataindata及文件及文件WR.DATWR.DAT。正确的结果应为。正确的

9、结果应为indata5=0 x11,0 x22,0 x33,0 x44,0 x55indata5=0 x11,0 x22,0 x33,0 x44,0 x55,文件文件WR.DATWR.DAT应为应为0 x00000 x00000 x00040 x00040 x00080 x00080 x00C00 x00C00 x0010 0 x0010 第10页/共35页第十一页,共35页。5.DSP混合混合(hnh)编程程序设编程程序设计计第11页/共35页第十二页,共35页。n n虽然c编译器的优化功能可以使c代码的效率大大增加,但是在某些情况下,c代码的效率还是无法与手工编写的汇编代码的效率相比。这是

10、因为,即使是最佳的c编译器,也无法在所有的情况下都能够最佳地利用DSP芯片所提供的各种资源。n n用c语言编写的中断程序(chngx)虽然可读性很好,但由于在进入中断程序(chngx)后,有时不管程序(chngx)中是否用到,中断程序(chngx)都将寄存器进行保护,从而大大降低中断程序(chngx)的效率。如果中断程序(chngx)频繁被调用,那么即使是一条指令也是至关重要的。第12页/共35页第十三页,共35页。n n此外,用c语言实现DSP芯片的某些(mu xi)硬件控制也不如汇编程序方便,有些甚至无法用C语言实现。因此,在很多情下,DSP应用程序往往需要用c语言和汇编语言的混合编程方法

11、来实现,以达到最佳利用DSP芯片软硬件资源的目的。第13页/共35页第十四页,共35页。C语言和汇编语言语言和汇编语言(hu bin y yn)的混合编程方法的混合编程方法(1)独立编写c程序和汇编程序,分开编译或汇编,形成各自的目标代码模块,然后用链接(lin ji)器将c模块和汇编模块链接(lin ji)起来。例如,FFT程序一般采用汇编语言编写,形成目标代码模块,与c模块链接(lin ji)就可以在c程序中调用FFT程序;(2)直接在C语言程序的相应位置嵌入汇编语句;(3)对C程序进行编译,生成相应的汇编程序,然后手动修改和优化。第14页/共35页第十五页,共35页。5.1 独立独立(d

12、l)编程,再编程,再链接链接第15页/共35页第十六页,共35页。n n这是一种常用的这是一种常用的c c和汇编语言接口方法。采用和汇编语言接口方法。采用这种方法时需注意的是在编写汇编语言和这种方法时需注意的是在编写汇编语言和c c语语言时必须遵循有关的调用规则和寄存器规则。言时必须遵循有关的调用规则和寄存器规则。如果遵循了这些规则,那么如果遵循了这些规则,那么c c和汇编函数和汇编函数(hnsh)(hnsh)之间的接口是非常方便的。之间的接口是非常方便的。n nc c程序既可以调用汇编程序,也可以访问汇编程序既可以调用汇编程序,也可以访问汇编程序中定义的变量。同样,汇编程序也可以调程序中定义

13、的变量。同样,汇编程序也可以调用用c c函数函数(hnsh)(hnsh)或访问或访问c c程序中定义的变量。程序中定义的变量。第16页/共35页第十七页,共35页。(1)注意注意(zh y)的问题的问题n n包括存储器、寄存器和函数调用等规则;n n汇编模块不能改变由c程序产生的.cinit块,如果改变其内容则会引起不可预测的后果(hugu)。n n编译器在所有的标识符(函数名、变量名等)前要加一下划杠“_”。因此,编写汇编语言程序时,必须在c程序可以访问的所有对象前加“_”。例如,在c程序中定义了变量x,如果在汇编程序中要使用,要标记为“_x”。第17页/共35页第十八页,共35页。(1)注

14、意注意(zh y)的问题的问题n n任何在汇编程序中定义的对象任何在汇编程序中定义的对象(duxing)(duxing)或函数,如果需要在或函数,如果需要在C C程序中访问或调用,程序中访问或调用,则必须用汇编指令则必须用汇编指令.global.global定义。同样,如定义。同样,如果在果在c c程序中定义的对象程序中定义的对象(duxing)(duxing)或函数,或函数,需要在汇编程序中访问或调用,在汇编程需要在汇编程序中访问或调用,在汇编程序中也必须用序中也必须用.gIobal.gIobal指令定义。指令定义。第18页/共35页第十九页,共35页。从从C程序程序(chngx)中访中访问

15、汇编程序问汇编程序(chngx)变变量量 n n从c程序中访问在汇编程序中定义的变量或常数需根据变量或常数定义的方式采取不同方法。总的来说,可以分为(fn wi)三种不同的情形:变量在.bss块中定义;变量不在.bss块定义;常数。对于访问在.bss块中定义的变量,可用如下步骤实现:n n(1)采用.bss命令定义变量:n n(2)用.global命令定义为外部变量;n n(3)在变量名前加一下划线“_”;n n(4)在c程序中将变量说明为外部变量。n n采用上述方法后,在c程序中就可以访问这个变量第19页/共35页第二十页,共35页。在在C中访问汇编中访问汇编(hubin)变量的变量的例子例

16、子1汇编程序汇编程序(hu bin chn x)第20页/共35页第二十一页,共35页。从从C程序中访问程序中访问(fngwn)汇编程汇编程序变量序变量n n对于访问不在.bss块中定义的变量,其方法复杂一些。在汇编中定义的常数表是这种情形一种常见的例子。在这种情况(qngkung)下,必须定义一个指向该变量的指针,然后在c程序中间接地访问这个变量。步骤是:n n(1)申明一个指向该表起始的全局标号。n n(2)可以为这个表定义一个独立的块,也可以在现有的块中定义。如果定义为一个独立的块,则可以在链接时将它分配至任意可用的存储器空间。n n(3)在c程序中访问该表时,必须另外申明一个指向该表的

17、指针。第21页/共35页第二十二页,共35页。在在C中访问中访问(fngwn)汇编变量的汇编变量的例子例子2汇编程序汇编程序(hu bin chn x)第22页/共35页第二十三页,共35页。从从C程序中访问程序中访问(fngwn)汇编常汇编常数数n n对于在汇编中用.set和.global命令定义的全局常数,也可以从c程序中访问,不过访问的方法更复杂些。n n一般对于在c或汇编中定义的变量,符号实际上包含的是变量值的地址,而非变量值本身。然而,对于在汇编中定义的常数,符号包含的是常数的值。而编译器不能区分符号表中哪些是变量值,哪些是变量的地址。n n因此(ync),在c程序中访问汇编中的常数

18、不能直接使用常数的符号名,而应在常数名之前加一个地址操作符“”。如在汇编中的常数名为“_x”,则在C程序中的值应为“&x”。第23页/共35页第二十四页,共35页。在在C中访问汇编中访问汇编(hubin)常数的常数的例子例子第24页/共35页第二十五页,共35页。在汇编程序中访问在汇编程序中访问(fngwn)C程序变量程序变量 在编写独立的汇编程序在编写独立的汇编程序(chngx)(chngx)时,经常需要访问在时,经常需要访问在c c程程序序(chngx)(chngx)中定义的全局变量或数组。下面的例子介绍了如中定义的全局变量或数组。下面的例子介绍了如何在汇编程序何在汇编程序(chngx)(

19、chngx)中访问中访问c c程序程序(chngx)(chngx)定义的变量和定义的变量和数组。数组。第25页/共35页第二十六页,共35页。.end第26页/共35页第二十七页,共35页。5.2 在在C程序程序(chngx)中中直接嵌入汇编语句直接嵌入汇编语句第27页/共35页第二十八页,共35页。n n优点:采用这种方法一方面可以在c程序中实现用c语言无法实现的一些硬件(yn jin)控制功能,如修改中断控制寄存器、中断使能成无效、读取状态寄存器和中断标志寄存器等。另一方面,也可以用这种方法在c程序中的关键部分用汇编语句代替c语句以优化程序。n n采用这种方法的一个缺点是比较容易破坏c环境

20、,因为c编译器在编译嵌入了汇编语句的c程序时,并不检查或分析所嵌入的汇编语句。第28页/共35页第二十九页,共35页。n n 嵌入汇编语句的方法比较简单,只须征汇编语句的左右加上一个(y)双引号,用小括弧将汇编语句括住,在括弧前加上asm标识符即可,如下所示。n n asm(“汇编语句 ”);在在c程序中嵌入程序中嵌入(qin r)汇编语句的例汇编语句的例子:子:第29页/共35页第三十页,共35页。void main()int val,i,wl8,wr8;int min_asm,min_c;/register settingasm(stm#0,SWWSR);asm(stm#0 x00A0,P

21、MST);val=-100;val=abs(val);return;第30页/共35页第三十一页,共35页。需要特别注意的是,采用这种方法后,对程序进行编译时不能采用优化功能,否则将使程序产生不可预测(yc)的结果。第31页/共35页第三十二页,共35页。混合编程实例混合编程实例(shl)(实验(实验5)n n源代码文件:Mix.c addfun.s54n n主程序:main()C编程n n子程序:mix_func_c(wl,wr,val)C编程n n mix_func(wl,wr,val)汇编编程n n变量的初始化:主程序用C编写(binxi);n n寄存器的初始化:在主程序中嵌入汇编指令赋

22、值n n核心算法:可用汇编编写(binxi)(效率高);可用C编 写(开发时间短);在主程序中调用;第32页/共35页第三十三页,共35页。堆栈堆栈(duzhn)的使用的使用wl,8wr,1val,1val,1i,1wr,8栈底(地址(dzh)大)栈顶(地址(dzh)小)main函数分配(逆序)调用mix_func(逆序)temp,8局部帧局部帧ST1,1第一个参数wl呢?frame off_m第33页/共35页第三十四页,共35页。考前复习考前复习(fx)(开卷)(开卷)一、题型:二、重点(zhngdin):1.PPT中的例题(lt)和例程;2.CMD文件的编写3.混合编程的编写1.填空(20分):2.单指令执行(4题,20分):3.读程序(30分):4.写程序(20分):第34页/共35页第三十五页,共35页。

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 管理文献 > 管理工具

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com