DSP(数字旌旗灯号处置器)凭仗其高速数字旌旗灯号处置功用、及时性强、低功耗、高集成度等嵌入式微核算机的特点,已在通讯、航空航天、工业节制、医疗、国防、汽车等范畴获得了普遍的使用。TMS320LF240xADSP芯片(以下简称LF240xA)是美国TI公司推出的高功能16位数字旌旗灯号处置器,它具有运算速度快,在片集成的外设丰厚等特点,故又称其为DSP节制器。使用范畴首要针对工业测控、电机节制、家用电器和消费电子等场所。
LF240xA的软件开拓进程,既可以运用汇编言语,也可以运用C言语。汇编言语的代码执行效率高、运转速度快,可以直接对存放器进行操作,充沛发扬了DSP节制器的硬件功能;但其开拓的任务量大,顺序可读性、移植性差。与汇编言语分歧的是,C言语可读性强、编程简略、调试便利,合适编写构造和算法比拟复杂的顺序。但是,关于节制来说,用C言语开拓顺序也有其分明的缺陷:起首,C言语代码有冗余,降低了执行效率,关于及时性要求很高的某些节制范畴来说不契合要求;其次,C言语无法完成某些底层的操作。 在详细软件开拓进程中,可以将汇编言语和C言语连系起来编程,发扬各自的长处。如许既能知足及时性要求又能完成所需的功用,还统筹顺序的可读性和编程效率。为此,调查及把握C言语和汇编言语的夹杂编程技能关于DSP的软件开拓具有主要的意义。 1 预备任务 在进行夹杂编程之前,起首要发明一个运转的根本情况。这个根本情况包罗存储空间的分派、DSP存放器映射地址的界说以及中缀向量的界说等方面。 (1)存储空间的分派 敕令文件(.cmd)用来完成对顺序存储器和数据存储器空间的分派。一是目的存储器界说(由MEMORY敕令界说),二是各段的定位(由SECTI敕令界说)。 (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节制软件的有用办法,还也是嵌入式系统软件最优化的主要路子。