1 / 14

第三章 C 语言程序编写和调试环境简介

DSP 软件开发平台主要包括 DSP 代码生成过程中所必需的 C 编译器 , 汇编器和链接器 . C 编译器 : 将 C 语言源代码 程序自动地编译成 DSP 汇编语言源代码 程序 . 汇编器 : 将 汇编语言源代码 文件汇编成 机器语言 COFF 目标 文件 . 链接器 : 把汇编生成的 可重定位的 COFF 目标模块 和目标库文件组合成一个 可执行的 COFF 目标模块. 第三章 C 语言程序编写和调试环境简介. 3.1 C 编译器概述. DSP C 语言以 ANSI C 为基础,并对 ANSI C 进行了相应的 限定和扩展。

indra
Télécharger la présentation

第三章 C 语言程序编写和调试环境简介

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. DSP软件开发平台主要包括DSP代码生成过程中所必需的C编译器,汇编器和链接器. C编译器:将C语言源代码程序自动地编译成DSP汇编语言源代码程序. 汇编器:将汇编语言源代码文件汇编成机器语言COFF目标文件. 链接器:把汇编生成的可重定位的COFF目标模块和目标库文件组合成一个可执行的COFF目标模块 第三章 C语言程序编写和调试环境简介

  2. 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");

  3. 􀂾•对于嵌入的汇编指令,编译器不会进行语法检查,编程者必须确认嵌入的指令合理有效。􀂾•对于嵌入的汇编指令,编译器不会进行语法检查,编程者必须确认嵌入的指令合理有效。 􀂾 •使用asm指令的时候应小心不要破坏C语言的环境。如果C代码中插入跳转指令和标识符可能会引起不可预料的操作结果。能够改变块或其它影响汇编环境的指令也可能引起麻烦。 􀂾 •对带asm语句的代码使用优化器时要特别小心。尽管优化器不能删除asm指令,但它可以重新安排asm指令附近的代码顺序,这样就可能会引起不期望的结果 •不要修改C变量,但可以任意读取C变量当前值。 •不要在内嵌汇编语句中书写修饰性汇编代码(如.text、.data等),否则会破坏汇编环境。 • 内嵌汇编语句可以用来在编译输出结果中添加注释,以改善编译器输出汇编程序的可读性。。 asm(“ ***** this is an assembly language comment”);

  4. 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*/ … }

  5. 3.3 访问数据空间 • 访问DSP数据空间是利用指针来实现的. • 例如: *(unsigned int *)0x1000=a; /*将a的值写入数据空间1000h地址*/ b = *(unsigned int *)0x1000; /*读出数据空间1000h地址的值,赋给b*/ • 可见访问DSP数据空间地址不需要对要访问的单元预先定义,利用指针直接访问就可以了.

  6. 3.4 系统初始化 C程序开始运行时,必须首先初始化C运行环境,这是通过c_int0函数完成的,这个函数在运行支持库(rts,runtime-support library)中。连接器会将这个函数的入口地址放置在复位中断向量处,使其可以在初始化时被调用。 c_int0函数进行以下工作以建立C运行环境: •为系统堆栈产生.stack块,并初始化堆栈指针。 •从.cinit块将初始化数据拷贝到.bss块中相应的变量。 •调用main函数,开始运行C程序。 用户可以对c_int0函数进行修改,修改后的函数必须完成以上任务。

  7. 3.5 利用TMS320C2XX C编译器开发应用程序的步骤 开发DSP的C语言应用程序,需要四种类型的文件: 1、C语言文件或汇编语言文件(.C或.ASM) 复位和中断向量需要用汇编语言编写 2、头文件(.H) 定义DSP内部寄存器的地址分配,一般具有通用性,书写一次以后可被其他程序反复使用 3、命令文件(.CMD) 主要定义堆栈、程序空间和数据空间分配等 4、库文件rts2xx.lib 默认情况下,该文件可以在“:\tic2xx\c2000\cgtools\lib”目录中找到 注:这4中类型的文件必须存储在同一个文件夹中

  8. 3.6 头文件和链接器命令文件示例 1、头文件 定义LF240X DSP内部寄存器的地址分配 2、链接器命令文件 链接器对命令文件名的大小写是敏感的,空格和空行是没有 意义的,但可以用做定界符.MEMORY和SECTIONS是链接命令. MEMORY:标示实际存在的目标系统中可被使用的存储器范围,每个存储器范围都有名字、起始地址和长度。其中PAGE0规定程序存储器,PAGE1规定数据存储器。

  9. SECTIONS:规定在存储器内何处放置输出段,即定义逻辑段与目标存储器的对应关系。SECTIONS:规定在存储器内何处放置输出段,即定义逻辑段与目标存储器的对应关系。 已初始化的段: .cinit:标号标识部分存放已明确初始化的全局变量和静态变量Page 0 .switch:标号标识部分存放对于大型的switch语句的跳转表Page 0 .const:标号标识部分存放已明确初始化的字符串常量、全局常量和静态常量Page 1 .text:标号标识部分存放可执行代码和浮点数常量Page 0 未初始化的段: .bss:标号标识部分存放没有初始化的全局变量和静态变量Page 1 .stack:用该标号定义软件堆栈Page 1

  10. 3.7 中断向量定义 .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”后面,要写明发生此中断时要跳转的地址.

  11. 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)。

  12. 复习 1 已知系统的晶振频率为10MHz,求上电复位后系统的时钟频率为多少,指令周期为多少? 2 已知系统的晶振频率为10MHz,SCSR1的配置值为81FEh,求系统的时钟频率为多少? 3 对于系统控制和状态寄存器2(SCSR2)中的WD保护位,复位时的缺省值是多少,如何通过软件对其清0? 4 对于2407的引脚BOOT EN,将其拉到高电平,当系统复位之后,系统从哪个地址开始执行程序?

  13. 5 对于以2407DSP为核心组成的系统,如果程序从片内程序地址0000h开始执行,请问2407的引脚MP/MC应该接高电平还是低电平? 6 当一个可屏蔽中断被响应时,( )的中断标志位自动清0。 • 2407有两个中断向量表( )和( )。 • 当需要打开一个外设中断时,需要打开的中断屏蔽位有( )、( )和( ) • 对于2407的DARAM,共有三个块( )、( )和( ),其中的块( )根据配置位既可以映射到程序存储器,也可以影射到数据存储器。 • 中央算术逻辑单元CALU是( )位,辅助算术逻辑单元是( )位,两者( )同时进行运算。

  14. 11 数据存储器页面指针DP是( )位指针,共可以选择( )页。 12输入数据定标移位器ISCALE的移位需要额外占用( )个指令周期。 13乘法器MPY进行的是( )位的乘法运算,结果是( )位。乘法运算占用( )个指令周期,运算结果是二进制( )码。 14假设溢出方式位OVM=1, ACC=7FFF FFFFh,那么ACC加上100后,ACC的结果是多少? 15 51系列单片机总线采用的是( )结构,2407DSP总线采用的是( )结构。 16 决定程序存储器配置的两个因素是( )和( )。

More Related