第三章 C语言程序编写和调试环境简介 DSP软件开发平台主要包括DSP代码生成过程中所必需的C编译器,汇编器和链接器. C编译器:将C语言源代码程序自动地编译成DSP汇编语言源代码程序. 汇编器:将汇编语言源代码文件汇编成机器语言COFF目标文件. 链接器:把汇编生成的可重定位的COFF目标模块和目标库文件组合成一个可执行的COFF目标模块
3.1 C编译器概述 DSP C语言以ANSI C为基础,并对ANSI C进行了相应的 限定和扩展。 TMS320C2XX C编译器:主要功能是把标准的ANSI C语言程序转换为C2XX能够识别执行的汇编语言代码。 TMS320C2x/C2xx/C5x的C编译器可以在编译器输出的汇编语言中直接嵌入汇编语言指令。这种能力是C语言的扩展——asm语句。asm语句能够实现一些C无法实现的功能。例:asm(" clrc INTM");
•不要修改C变量,但可以任意读取C变量当前值。 •不要在内嵌汇编语句中书写修饰性汇编代码(如.text、.data等),否则会破坏汇编环境。 • 对于嵌入的汇编指令,编译器不会进行语法检查,编程者必须确认嵌入的指令合理有效。 • 使用asm指令的时候应小心不要破坏C语言的环境。如果C代码中插入跳转指令和标识符可能会引起不可预料的操作结果。能够改变块或其它影响汇编环境的指令也可能引起麻烦。 • 对带asm语句的代码使用优化器时要特别小心。尽管优化器不能删除asm指令,但它可以重新安排asm指令附近的代码顺序,这样就可能会引起不期望的结果 •不要修改C变量,但可以任意读取C变量当前值。 •不要在内嵌汇编语句中书写修饰性汇编代码(如.text、.data等),否则会破坏汇编环境。 • 内嵌汇编语句可以用来在编译输出结果中添加注释,以改善编译器输出汇编程序的可读性。。 asm(“ ***** this is an assembly language comment”);
3.2 访问I/O空间 要在程序中访问io空间地址,必须首先用关键字“ioport”对要访问的地址进行定义。 语法:ioport type port hex_num ioport 声明io空间端口变量的关键字; type变量类型,可以为char, short, int或unsigned int; port hex_num端口号,port后面接16进制数字。 /*******************************************/ ioport unsigned int port10; /******************************************/ 注:声明io空间地址必须在C文件起始声明,不允许在函数中使用ioport声明io空间地址。 例如: ioport unsigned port10; /*定义I/O空间变量10h*/ { … port10=a; /*将a写到端口10h*/ b=port10; /*从端口10h读入b*/ }
3.3 访问数据空间 访问DSP数据空间是利用指针来实现的. 例如: *(unsigned int *)0x1000=a; /*将a的值写入数据空间1000h地址*/ b = *(unsigned int *)0x1000; /*读出数据空间1000h地址的值,赋给b*/ 可见访问DSP数据空间地址不需要对要访问的单元预先定义,利用指针直接访问就可以了.
3.4 系统初始化 C程序开始运行时,必须首先初始化C运行环境,这是通过c_int0函数完成的,这个函数在运行支持库(rts,runtime-support library)中。连接器会将这个函数的入口地址放置在复位中断向量处,使其可以在初始化时被调用。 c_int0函数进行以下工作以建立C运行环境: •为系统堆栈产生.stack块,并初始化堆栈指针。 •从.cinit块将初始化数据拷贝到.bss块中相应的变量。 •调用main函数,开始运行C程序。 用户可以对c_int0函数进行修改,修改后的函数必须完成以上任务。
3.5 利用TMS320C2XX C编译器开发应用程序的步骤 开发DSP的C语言应用程序,需要四种类型的文件: 1、C语言文件或汇编语言文件(.C或.ASM) 复位和中断向量需要用汇编语言编写 2、头文件(.H) 定义DSP内部寄存器的地址分配,一般具有通用性,书写一次以后可被其他程序反复使用 3、命令文件(.CMD) 主要定义堆栈、程序空间和数据空间分配等 4、库文件rts2xx.lib 默认情况下,该文件可以在“:\tic2xx\c2000\cgtools\lib”目录中找到 注:这4中类型的文件必须存储在同一个文件夹中
3.6 头文件和链接器命令文件示例 1、头文件 定义LF240X DSP内部寄存器的地址分配 2、链接器命令文件 链接器对命令文件名的大小写是敏感的,空格和空行是没有 意义的,但可以用做定界符.MEMORY和SECTIONS是链接命令. MEMORY:标示实际存在的目标系统中可被使用的存储器范围,每个存储器范围都有名字、起始地址和长度。其中PAGE0规定程序存储器,PAGE1规定数据存储器。
SECTIONS:规定在存储器内何处放置输出段,即定义逻辑段与目标存储器的对应关系。 已初始化的段: .cinit:标号标识部分存放已明确初始化的全局变量和静态变量Page 0 .switch :标号标识部分存放对于大型的switch语句的跳转表Page 0 .const:标号标识部分存放已明确初始化的字符串常量、全局常量和静态常量Page 1 .text:标号标识部分存放可执行代码和浮点数常量Page 0 未初始化的段: .bss:标号标识部分存放没有初始化的全局变量和静态变量Page 1 .stack:用该标号定义软件堆栈Page 1
3.7 中断向量定义 .ref _c_int0,_nothing ;前面需空格 .sect ".vectors" ;前面需空格 .title "cvectors.asm" ;前面需空格 .ref _c_int0,_nothing ;前面需空格 .sect ".vectors" ;前面需空格 reset: b _c_int0 ;RESET 00H,前面需顶格 int1: b _nothing ;_INT1_ISR 02H,前面需顶格 int2: b _nothing ;_INT2_ISR 04H,前面需顶格 int3: b _nothing ;_INT3_ISR 06H,前面需顶格 int4: b _nothing ;_INT4_ISR 08H,前面需顶格 int5: b _nothing ;_INT5_ISR 0AH,前面需顶格 int6: b _nothing ;_INT6_ISR 0CH,前面需顶格 .ref伪指令定义了文件中将引用的中断处理函数_nothing和_c_int0,这两个函数在C语言中定义时前面没有“_”. .sect定义了一个段.vectors,表示开始定义中断向量段,再接下来则开始定义各个中断向量,文本中的每一行对应程序存储器中的两个地址,从0h开始(对应复位向量),第二行对应程序地址2h(INT1) . 每一行的开始(如”RSVECT”)仅仅是一个标志,重要的是在”B”后面,要写明发生此中断时要跳转的地址.
3.8 DSP程序烧写 DSP程序编写完成,调试无误后,就可以将程序烧写到DSP的FLASH(EEPROM)中,使DSP可以脱离仿真器独立运行。 烧写DSP程序也要通过仿真器来进行,仿真器制造者会提供相应的烧写程序。要注意不同型号的DSP往往使用不同的烧写程序,不同类型的仿真器对烧写环境也会有不同的要求,使用前要详细阅读相应说明(readme)。 MP/MC*模式置为0(微计算机模式) 仿真RAM不被PS*信号选中 DSP烧写步骤: 清除flash内容(bc0.bat, bc1.bat) 将FLASH(EEPROM)中的所有位清零(set to 0)。 擦除flash内容(be0.bat, be1.bat) 将FLASH(EEPROM)中的所有位置位(set to 1)。 把目标程序写进flash中(bp16k.bat, bp32k.bat) 将FLASH(EEPROM)中的所有选中的位清零(set to 0)。
复习 1 已知系统的晶振频率为10MHz,求上电复位后系统的时钟频率为多少,指令周期为多少? 2 已知系统的晶振频率为10MHz,SCSR1的配置值为81FEh,求系统的时钟频率为多少? 3 对于系统控制和状态寄存器2(SCSR2)中的WD保护位,复位时的缺省值是多少,如何通过软件对其清0? 4 对于2407的引脚BOOT EN,将其拉到高电平,当系统复位之后,系统从哪个地址开始执行程序?
5 对于以2407DSP为核心组成的系统,如果程序从片内程序地址0000h开始执行,请问2407的引脚MP/MC应该接高电平还是低电平? 6 当一个可屏蔽中断被响应时,( )的中断标志位自动清0。 2407有两个中断向量表( )和( )。 当需要打开一个外设中断时,需要打开的中断屏蔽位有( )、( )和( ) 对于2407的DARAM,共有三个块( )、( )和( ),其中的块( )根据配置位既可以映射到程序存储器,也可以影射到数据存储器。 中央算术逻辑单元CALU是( )位,辅助算术逻辑单元是( )位,两者( )同时进行运算。
11 数据存储器页面指针DP是( )位指针,共可以选择( )页。 12输入数据定标移位器ISCALE的移位需要额外占用( )个指令周期。 13乘法器MPY进行的是( )位的乘法运算,结果是( )位。乘法运算占用( )个指令周期,运算结果是二进制( )码。 14假设溢出方式位OVM=1, ACC=7FFF FFFFh,那么ACC加上100后,ACC的结果是多少? 15 51系列单片机总线采用的是( )结构,2407DSP总线采用的是( )结构。 16 决定程序存储器配置的两个因素是( )和( )。