- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
基于DSP混合编程关键问题的研究.doc
基于DSP混合编程关键问题的研究|第1
input type=hidden value=lunC/OS-IIv2.62。该内核已历经近十年的应用与改进,在实用性与可靠性方面得到了广泛的好评。开放源代码的优势也使它尤其适合设计中自检测,以及故障诊断与定位的要求。
C与汇编混合编程的一般规则
C语言的mC/OS-II内核带来了编程方式选择的问题。一方面,采用C语言设计效率较高,利于实现模块化、组态化的设计目标。另一方面,信号采集处理频率较高,如400Hz交流信号、频率信号和分辨率较高的开关量信号;同时,程序运行既要符合mC/OS-II时钟节拍,也要满足数据总线上大小周期的定义。这导致对定时的要求较高,对中断程序设计要求严格。因此混合编程是合理的编程方式。
一般混合编程方法
混合编程的一般方法有三种:一是对C程序编译后形成的汇编程序进行手工的修改与优化。二是直接在C语言程序中嵌入汇编语句。三是分别编写C程序和汇编程序,再独立编译成目标代码模块,再进行链接。
第一种编程方式要求对汇编与C语言都极其熟悉,并且这样的编程方式对程序的可读性和扩展性的负面影响比较大。第二种方法适用于语句执行频率非常高,并且C编程与汇编编程效率差异较大的情况,例如进入中断的通用中断子程序等。第三种方式是混合编程最常用的方式之一。在这种方式下,C程序与汇编程序均可使用另一方定义的函数与变量。
变量定义的规则与数组、指针的使用
变量定义是混合编程的基本问题。C程序与汇编程序定义的变量相互之间可以进行访问。在汇编程序中定义时,需要在变量前加下划线“_”,然后再用.global定义为全局变量。在C程序中则需要说明为extern变量。
C语言中常用的数组与指针也可以很方便地在汇编程序中定义并互相访问。如例,在汇编语言中用.usect定义占用6*32个字的全局变量_AC_RSLT,在C程序中被说明成一个6*32的16位无符号数的二位数组。当然,在汇编程序中,数据的存放格式需要满足C对二维数组数据存放格式的要求。即在存储器中,从低地址到高地址,二维数组的内容从第一行起各行依次放入存储器中。实际上,这个数组定义也可以看作是指针定义。
汇编程序:
_AC_RSLT.usect“ADDATA”,(6*32)
.global_AC_RSLT
C程序:
externINT16UAC_RSLT[6][32];
(externINT16U*AC_RSLT;)
依此类推,只要具有明确的数据存放格式,C语言中各种类型的变量在汇编语言中都可以方便地定义和使用。
函数调用的一般规则
C程序中调用汇编函数
C程序中调用的汇编函数,在汇编中其名称以程序标号的形式出现。程序标号作为操作数用.global进行定义。并且同变量一样,在前面加下划线“_”。汇编函数也可以给调用者传递返回值,它实际上是通过被写入累加器返回的。汇编函数一般具有如下例的形式:
_calcu:
POPD*+将返回地址压入任务栈
SARAR0,*+存储调用者的帧指针
SARAR1,*
LARAR0,#01h
LARAR0,*0+,AR2堆栈指针复制到AR0并创建局部帧
SETCSXM注意:改变了状态寄存器
MAR*,AR2
LARAR2,#0FFFDhAR2=-3
MAR*0+
LACC*访问调用者传递的参数
...
MAR*,AR3
LACL*传递返回值
MAR*,AR1
SBRK#02h
LARAR0,*-
PSHD*
RET
汇编程序中调用C函数
汇编程序中调用C函数相对比较简单,编译器已经提供了相当完善的支持。函数在C中需要用extern进行定义,函数名加“_”后在汇编程序中用.ref说明为外部标号。在调用函数之前应手工编程将参数以逆序写入到当前运行任务所使用的任务堆栈中,压栈之前堆栈指针可不作调整。被调用的C函数即可正常访问调用者传递的参数,函数调用完毕后需要调整堆栈指针,清除函数调用中参数所占用的堆栈空间。C函数的返回值可以通过访问累加器获得。
参数的访问与堆栈指针的调整
如果希望被C程序调用的汇编函数含有参数,那么就必须按照编译器对含参数的C函数的参数处理原则,利用任务堆栈指针访问参数。其方式如上例中所示。在DSP中,堆栈指针的调整借助辅助寄存器(ARx或者XARx)实现。如例,通过AR2实现了带符号数的补码运算,这样可以根据需要移动堆栈指针,实现对函数参数的访问,此外,调用者与被调用函数的局部数据结构的创建与释放也是通过堆栈指针实现的。值得一提的是,在μC/OS-II移植中任务调度与中断部分程序需要注意因参数而产生的堆栈指针调整,应用任务的参数定义也必须与之保持一致。
混合编程中程序运行环境的改变与保持
不管采用哪种混合编程方式,运行环境的改变与保持对程序运行正常与否有着重要影响。正常的运行环境不仅关系到DSP状态
文档评论(0)