当前位置:首页 > 模拟 > 模拟
[导读]设计良好的混合编程软件既能有效地满足嵌入式系统对功能与性能的需求,同时也可以为程序的扩展和移植预留足够的空间。混合编程是编制复杂的LF240xA控制软件的有效方法,同时也是嵌入式系统软件最优化的重要途径。

引 言
    DSP(数字信号处理器)凭借其高速数字信号处理功能、实时性强、低功耗、高集成度等嵌入式微计算机的特点,已在通信、航空航天、工业控制、医疗、国防、汽车等领域得到了广泛的应用。TMS320LF240xA DSP(以下简称LF240xA)是美国TI公司推出的高性能16位数字信号处理器,它具有运算速度快,在片集成的外设丰富等特点,故又称其为DSP控制器。应用领域主要针对工业测控、电机控制、家用电器和消费电子等场合。
    LF240xA的软件开发过程,既可以使用汇编语言,也可以使用C语言。汇编语言的代码执行效率高、运行速度快,可以直接对寄存器进行操作,充分发挥了DSP控制器的硬件性能;但其开发的工作量大,程序可读性、移植性差。与汇编语言不同的是,C语言可读性强、编程简单、调试方便,适合编写结构和算法比较复杂的程序。然而,对于控制来说,用C语言开发程序也有其明显的缺点:首先,C语言代码有冗余,降低了执行效率,对于实时性要求很高的某些控制领域来说不符合要求;其次,C语言无法实现某些底层的操作。
    在具体软件开发过程中,可以将汇编语言和C语言结合起来编程,发挥各自的优点。这样既能满足实时性要求又能实现所需的功能,同时兼顾程序的可读性和编程效率。为此,了解及掌握C语言和汇编语言的混合编程技术对于DSP的软件开发具有重要的意义。


1 准备工作
    在进行混合编程之前,首先要创造一个运行的基本环境。这个基本环境包括存储空间的分配、DSP寄存器映射地址的定义以及中断向量的定义等方面。
    (1)存储空间的分配
    命令文件(*.cmd)用来实现对程序存储器和数据存储器空间的分配。一是目标存储器定义(由MEMORY命令定义),二是各段的定位(由SECTIONS命令定义)。
    (2)寄存器映射地址的定义
    头文件(*.h)用来定义所用到的DSP控制器内部寄存器的映射地址,以及用户自定义的常量、寄存器等。通常,头文件在主程序的开始,使用汇编指示符“.include”和“.copy”对其调用。头文件的定义有2种方式。第1种是以指针变量的形式定义各种寄存器,即采用如下形式:
    volatile unsigned int T1CMPR Ox7402第2种则是用宏定义的方式定义各种寄存器的名称:
    # define T1CMPR Ox7402
    (3)中断向量的定义
    LF240xA内部提供了多个中断,如INTl~INT6、TRAP等。复位中断向量(c_intO)是在实时运行支持库(rts2xx.1ib)中定义的一种特殊的中断,它的作用是先进行软件堆栈操作,然后初始化全局变量,最后调用主程序main()。所以当复位(Reset)时,程序跳转到c_int0进行相应的处理。中断向量表则是将主程序中用到的中断子程序和相应中断级别类型连接起来的一个简单的跳转指令表。表中每个中断向量占2个字,在命令文件中将其声明到程序存储器空间的0000h~003Fh。

2 混合编程的一般方法
   
对于LF240xA的混合编程一般有3种方法:一、对C语言程序编译后形成的汇编程序进行手工修改与优化;二、在C语言程序中直接嵌人汇编语句;三、分别编写C语言程序和汇编语言程序,然后独立编译成目标代码模块,再进行链接。第一种编程方式要求对汇编与C语言都极其熟悉,并且这样的编程方式对程序的可读性和扩展性的负面影响比较大,一般不建议使用。第二种方法适用于语句执行频率非常高,并且C编程与汇编编程效率差异较大的情况,例如进入中断的通用中断子程序等。第三种方式是混合编程最常用的方式之一,在这种方式下,C语言程序与汇编语言程序均可使用另一方定义的函数与变量。下面着重介绍后两种方法。
2.1 C语言程序中嵌入汇编语言
    C语言程序支持asm指令,所以可以利用这条指令直接将汇编语句嵌入到C语言程序中。LF240xA中一些C语言无法操作的控制位,可以采用这种方式来实现。这种方法只需在汇编语句两边加上双引号并用小括号括起来,前面再加上asm关键字,即“asm(“汇编语句”);”。需要注意的是,汇编语句不能紧挨着前一个双引号,它们之间必须用空格、Tab或标号开头。例如,在汇编语言中开中断指令SETC INTM,嵌入到C语言中为“asm(“SETCINTM”);”。这种方式虽然操作简单,但是汇编代码很有可能破坏原来的C语言环境,从而导致不可预料的结果。因此只提倡在程序开始的系统初始化部分少量使用,而在C语言中嵌入实现某一完整功能的多句汇编语言时,不提倡采用这种方式。
2.2 C语言与汇编语言程序相互调用
    (1)C语言程序调用汇编函数
    C语言程序中调用的汇编函数,在汇编语言中其名称以程序标号的形式出现。程序标号作为操作数用.global进行定义,在前面加下划线“_”。汇编函数也可以利用累加器给C语言程序传递返回值。
    LF240xA有8个辅助寄存器(AR0~AR7)可供使用,在C语言环境中这些寄存器都有明确的分工。
    ①AR0:帧指针(Frame Pointer,FP)。LF240xA只提供了大小为8个字的硬件栈,不能满足需要。因此,C环境定义了一段特殊的存储器空间,作为软件栈。软件栈的作用是分配局部变量、传递函数的参数、保存处理器的状态、保存临时结果等。AR0指向软件栈中函数局部数据空间的起始处。
    ②ARl:软件栈的栈顶指针(Stack Pointer,SP)。ARl为指向软件栈栈顶的专用指针。
    ③AR2:局部变量指针(Local Variable Pointer,LVP)。AR2存放局部变量的偏移量,与AR0(FP)一起对局部变量进行寻址定位。
    ④AR6、AR7:寄存器型变量。在C语言程序中用register修饰的变量存放在AR6、AR7中。
    ⑤AR3~AR5:用户自定义。AR3~AR5没有特殊的约定,可以由用户自由决定其用途。在汇编程序的入口处,假设ARP已经被设置为ARl,这是由C编译器自动完成的。C语言程序调用汇编函数时,汇编函数程序必须遵循下述规范:
    ①从硬件堆栈中弹出返回地址,然后把它压入软件堆栈;
    ②把C程序的数据结构指针FP压入堆栈;
    ③如果汇编程序改变了AR6或AR7,也需要把它们
压入堆栈;
    ④分配局部数据结构;
    ⑤执行汇编程序的实际任务代码;
    ⑥如果汇编程序有返回值,则把这个返回值放入累加器中;
    ⑦设置ARP为ARl;
    ⑧解除分配的局部数据结构;
    ⑨如果AR6和AR7曾经被保存过,则从软件堆栈恢复它们的值;
    ⑩从软件堆栈恢复FP;
    ⑾把软件堆栈中存储的返回地址压入硬件堆栈;
    ⑿返回。
    当汇编函数调用完毕后,C语言程序要弹出先前压入堆栈的传递参数。这个操作通过下面的命令语句实现:SBRK i(i是C程序向汇编程序传递的参数个数)。在上述操作过程中,对软件堆栈的处理至关重要。图1所示为C语言程序调用时软件堆栈的分配示意图,具体步骤如下:

    ①在C语言程序的局部帧后将汇编函数的参数依次压栈;
    ②程序指针(PC)跳转到汇编函数的代码段;
    ③保存出口地址;
    ④保存C语言程序局部帧指针;
    ⑤分配局部变量;
    ⑥调用结束前将以上所有内容弹出软件栈。
    下面以具体例子来讲述这个操作过程。

   
    (2)汇编语言程序调用C函数
    汇编语言程序中调用C函数。被调用的C函数在C语言环境中需要用extern进行定义,在汇编程序中用.ref说明为外部标号,且函数名加“_”。在调用C函数之前应手工编程将参数以逆序写入当前运行任务所使用的任务堆栈中,压栈之前堆栈指针可不作调整。被调用的C函数即可正常访问调用者传递的参数,函数调用完毕后需要调整堆栈指针,清除函数调用中参数所占用的堆栈空间。C函数的返回值可以通过访问累加器获得。具体例子如下。
    C语言模块中编写乘法函数:

   

3 注意事项
    (1)中断的处理
    LF240xA发生中断时,程序指针(PC)就指向相应的中断向量,并通过中断向量映射到相应的中断服务子程序。例如,在0004h~0005h处是INT2的中断向量,在此存储了1条跳转指令,跳转至INT2的服务子程序。LF240xA的C语言有interrupt修饰符可以用来定义中断服务子程序,如下所示:


    将上述2个模块分别编译后链接,就能响应INT2中断了。
    (2)字母大小写
    在C语言环境中,对于字母大小写的区分是很严格的,因此在混合编程的过程中也应该严格遵守这一点。例如,在写命令文件时,误将“.data”写成“.daTA”,此时系统将无法给初始化代码分配存储空间,导致程序无法执行。
    (3)C语言库函数应用
    TI的C编译器中内置了很多函数,包含在rts2xx.1ib的函数库中。库函数并不是C语言的一部分,它是由人们根据需要编制并提供给用户直接使用的。每一种C编译系统都提供了一批库函数,不同的编译系统所提供的库函数的数目、函数名及函数功能是不完全相同的。要使用库函数,只需在源文件中添加语句“#include”函数名.h””,就可使用相应的库函数了。

结 语
    以上提到的LF240xA DSP的C语言和汇编语言混合编程技术已经在笔者参与开发的卷烟机重量控制系统的控制软件中得到应用。实践证明,采用混合编程的软件更加契合一般嵌入式系统对时问和空间的严格约束。设计良好的混合编程软件既能有效地满足嵌入式系统对功能与性能的需求,同时也可以为程序的扩展和移植预留足够的空间。混合编程是编制复杂的LF240xA控制软件的有效方法,同时也是嵌入式系统软件最优化的重要途径。

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

助力科研与检测新突破 上海2024年5月15日 /美通社/ -- 全球知名的科学仪器和服务提供商珀金埃尔默公司今日在上海举办了主题为"创新不止,探索无界"的新品发布会,集中展示了其在分析仪器领域的最...

关键字: 质谱仪 BSP DSC 气相色谱

上海2024年5月16日 /美通社/ -- 2024年5月10日至5月13日,富士胶片(中国)投资有限公司携旗下影像产品创新力作亮相北京P&E 2024。在数码相机展览区域,全新制定的集团使命"为世界绽...

关键字: 富士 数码相机 影像 BSP

贝克曼库尔特目前已成为MeMed Key免疫分析平台和MeMed BV检测技术的授权经销商 在原有合作的基础上,继续开发适用于贝克曼库尔特免疫分析仪的MeMed BV检测 加州布瑞亚和以色列海法2024年5月16日...

关键字: BSP IO 检测技术 免疫分析仪

英国英泰力能的燃料电池是可产业化的产品解决方案 英国首个专为乘用车市场开发的燃料电池系统 在 157kW 功率下,此燃料电池比乘用车的其他发动机更为强大 &...

关键字: ENERGY INTELLIGENT 氢燃料电池 BSP

深爱人才,共赴"芯"程 深圳2024年5月15日 /美通社/ -- 5月11日,深圳国资国企"博士人才荟"半导体与集成电路产业专场活动在深圳市重投天科半导体有限公司(简...

关键字: 半导体 集成电路产业 BSP 人工智能

武汉2024年5月15日 /美通社/ -- 北京时间4月26日-5月4日,2024 VEX 机器人世界锦标赛于美国得克萨斯州达拉斯市举办。本届 VEX 世锦赛为期九天,设有 VIQRC 小学组/初中组、V5RC 初中组/...

关键字: 机器人 BSP RC POWERED

上海2024年5月15日 /美通社/ -- 由生成式人工智能(AI)驱动的临床阶段生物医药科技公司英矽智能宣布,与复星医药(600196.SH;02196.HK)合作开发的潜在"全球首创"候选药物IS...

关键字: ISM BSP PC 人工智能

上海2024年5月13日 /美通社/ -- 5月8日,浦东新区国资委组织陆家嘴集团等9家区属企业与立邦中国召开合作交流会,旨在贯彻落实浦东新区区委、区政府工作要求,进一步放大进博会溢出带动效应,持续扩大区属企业与进博会重...

关键字: BSP 数字化 自动化立体仓库 智慧园区

上海2024年5月13日 /美通社/ -- 在数字化时代,高效的税务管理和ERP系统成为企业发展的关键。为了满足这一需求商应信息科技与Exact Software 易科软件就金四全电票税系统与ERP系统集成及商务合作建立...

关键字: AC 软件 BSP 数字化

北京2024年5月13日 /美通社/ -- 5月11日,鲲鹏昇腾开发者大会2024期间,华为举办"昇思AI框架及大模型技术论坛",软通动力数字基础设施与集成事业部总经理谢睿受邀出席、软通动力...

关键字: AI 模型 BSP 精度
关闭
关闭