版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第4章
DSP的软件开发与C语言编程本章内容:4.1DSP开发工具与软件开发流程4.2集成开发环境CCS4.3DSP的C工程文件
4.4DSPC语言程序设计基础4.5DSPC程序举例11/17/20221山东大学控制学院张东亮第4章DSP的软件开发与C语言编程本章内容:11/9/24.1DSP开发工具与软件开发流程1.DSP开发工具硬件TIXDS510(ExtendedDevelopmentSystem)硬件仿真器。DSK(DSPStarterKit)初学者开发套件。瑞泰ICETEK-5100PP/USBDSP开发系统。评估板。DSP教学实验系统。开发工具包括硬件、软件两部分。硬件部分主要是仿真器(Emulator),软件主要是集成开发环境CCS(CodeComposerStudio)。DSP开发系统(仿真器)有PCI插卡式、并口式、USB接口式,目前多用USB接口式,即DSP开发系统通过USB接口与PC机相连,开发系统通过JTAG(基于扫描的仿真)接口与用户目标板相连,实现DSP软硬件调试与程序烧写。11/17/20222山东大学控制学院张东亮4.1DSP开发工具与软件开发流程1.DSP开发工具
DSP评估板(也称为EVM板、目标板、DEMO板、实验板等),包括基本的DSP芯片及必要的电源、时钟、复位电路外,还经常包括用于程序调试的片外扩展存储器、扩展的A/D、D/A转换器、键盘显示电路、EEPROM、RS232串行接口、SPI接口、CAN接口驱动电路、简单应用电路等。F2812DSP评估板11/17/20223山东大学控制学院张东亮DSP评估板(也称为EVM板、目标板、DEF2812DSP评估板原理框图开发系统与评估板11/17/20224山东大学控制学院张东亮F2812开发系统11/9/20224山东大学控制学院张2812EVM板的主要性能指标如下:(1)TMS320F2812,运行速度150MIPS。(2)片内RAM18K字。(3)扩展RAM64K字。(4)片内16路12位A/D转换器,最大采样速率12.5MSPS。(5)扩展的4路12位D/A转换器DAC7617。(6)两路UART串行接口,符合RS-232C标准。(7)16路PWM输出。(8)CAN总线标准接口。(9)用户开关与指示灯。(10)片内128K字Flash存储器,带128位加密位。(11)IEEE1149.1兼容的逻辑扫描电路即JTAG接口,用于仿真调试。(12)+5V电源输入,板上3.3V,1.8V电源管理。11/17/20225山东大学控制学院张东亮2812EVM板的主要性能指标如下:11/9/20225山11/17/20226山东大学控制学院张东亮11/9/20226山东大学控制学院张东亮2.软件开发流程软件开发流程框图11/17/20227山东大学控制学院张东亮2.软件开发流程软件开发流程框图11/9/20227山
软件开发流程
1)编辑:生成源程序(*.asm,*.c)、头文件(*.h)与命令文件(*.cmd)。2)编译与汇编:生成目标文件(*.obj,公共目标文件COFF格式)及列表文件(*.lst)。3)连接:生成可执行代码文件(*.out)及映射文件(*.map)。4)调试:通过JTAG接口下载到目标系统EVM。5)通过JTAG接口将程序固化烧写到Flash存储器。11/17/20228山东大学控制学院张东亮软件开发流程1)编辑:生成源程序(*.asm,*.c)软件开发工具主要有源程序编辑器(Editor)编译器(Compiler)汇编器(Assembler)链接器(Linker)归档器(Archiver)运行时支持库(Run-Time-SupportLibrary)库建立程序(Library-buildUtility)HEX转换程序(HexConversionUtility)3.软件工具11/17/20229山东大学控制学院张东亮软件开发工具主要有3.软件工具11/9绝对列表器(AbsoluteLister)和交叉引用列表器(Cross-ReferenceLister)调试工具(Debuggingtools)C++名称复原程序(C++NameDemanglingUtility)GEL语言(GeneralExtensionLanguage,通用扩展语言)DSP/BIOS等。11/17/202210山东大学控制学院张东亮绝对列表器(AbsoluteLister)和交叉引用列表1.CCS软件安装与设置CCS2.0’C2000(CCS3.3)驱动程序设置。Simulator:PC模拟软件仿真。Emulator:实时DSP硬件仿真。4.2集成开发环境CCS11/17/202211山东大学控制学院张东亮1.CCS软件安装与设置CCS2.0’C2000(CCS运行主窗口
11/17/202212山东大学控制学院张东亮CCS运行主窗口11/9/202212山东大学控制学院CCS主要工具源程序编辑器(Editor)。C编译器(CCompiler)。汇编器(Assembler)。连接器(Linker)。调试工具(Debug)。十六进制转换公用程序(HexConversionUtility)。11/17/202213山东大学控制学院张东亮CCS主要工具源程序编辑器(Editor)。11/9/2022.CCS主要菜单与功能典型的CCS运行界面如图所示。CCS的功能可以通过菜单或工具条按钮实现。主要的菜单项有File、Edit、View、Project、Debug等。这些菜单的使用与常用的集成开发软件VisualC++等使用方法基本一样。11/17/202214山东大学控制学院张东亮2.CCS主要菜单与功能典型的CCS运行界典型CCS运行界面11/17/202215山东大学控制学院张东亮典型CCS运行界面11/9/202215山东大学控制学院CodeComposerStudio™Components
Robust,Easy-to-UseDevelopmentEnvironmentHelpCPUWindowMemorywindowGraphwindowProjectManager:Source&objectfilesFiledependenciesCompiler,Assembler&LinkerbuildoptionsStatuswindowFullC/C++&AssemblyDebugging:C&ASMSourceMixedmodeDisassembly(patch)SetBreakPointsSetprobePointsWatchwindowProductiveEditor:StructureExpansionMenusorIcons11/17/202216山东大学控制学院张东亮CodeComposerStudio™ComponenReal-timeDebuggingAllowsyoutohaltinnon-criticalcodefordebugwhiletime-criticalinterruptscontinuetobeserviced.Accessmemoryandregisterswithoutstoppingtheprocessor.Implementedinsilicon,notbyadebugmonitor:Easy-to-use,noapplicationresourcesrequiredInterruptvoidISR_1(){………}Main(){……}function(){
……}Haltandsinglestepnon-timecriticalcodeTime-criticalinterruptsarestillserviced.InControl,IfTheProcessorStops,TheSystemCanGoOutOfControl11/17/202217山东大学控制学院张东亮Real-timeDebuggingAllowsyouFile菜单11/17/202218山东大学控制学院张东亮File菜单11/9/202218山东大学控制学院张东亮Project菜单11/17/202219山东大学控制学院张东亮Project菜单11/9/202219山东大学控制学院View菜单11/17/202220山东大学控制学院张东亮View菜单11/9/202220山东大学控制学院张东亮Debug菜单11/17/202221山东大学控制学院张东亮Debug菜单11/9/202221山东大学控制学院张东3.采用CCS开发应用程序的步骤创建一个新工程(project)。编辑源程序(*.asm,*.c)与连接命令文件(*.cmd)。将文件添加到该工程中(*.asm,*.c,*.h,*.cmd)。编译汇编连接。装载程序。调试程序。程序固化。11/17/202222山东大学控制学院张东亮3.采用CCS开发应用程序的步骤创建一个新工程(proje调试程序连续运行与单步运行。设置断点。查看与修改存储单元。查看与修改寄存器内容。观察和编辑变量。程序Animate运行和数据图形显示。11/17/202223山东大学控制学院张东亮调试程序连续运行与单步运行。11/9/202223山东大学控C工程(Project)几种基本文件CCS工程文件(扩展名为.pjt)。由CCS自动生成。在CC(CodeComposer)软件环境中,扩展名为.mak。
源程序:汇编语言文件(*.asm),C文件(*.c)。头文件(*.h):定义寄存器映射地址,用户自定义的常量等。例如,头文件DSP281x_Adc.h定义了ADC寄存器,头文件DSP281x_PieVec.h定义了PIE中断矢量。链接命令文件(*.cmd)。库文件(*.lib)。运行时支持库rts2800_ml.lib。目标文件(*.obj):COFF公共目标文件格式。列表文件(*.lst):汇编生成的文件。映射文件(*.map):存储器分配。可执行代码文件(*.out)。4.3DSP的C工程文件11/17/202224山东大学控制学院张东亮C工程(Project)几种基本文件CCS工程文件(扩展名为4.3.1公共目标文件格式COFF编译、汇编与链接程序建立的目标文件采用共用目标文件格式(CommonObjectFileFormat,COFF),便于模块化编程、管理代码段和存储器,即不必为程序代码或变量指定目标地址。汇编器根据命令用适当的段将各部分程序代码和数据连在一起,构成目标文件。链接器分配存储单元,即把各个段重新定位到目标存储器中。段(section,也称为块)是目标文件的最小单位,是在存储器中占据连续空间的代码和数据块,各段相互独立。11/17/202225山东大学控制学院张东亮4.3.1公共目标文件格式COFF编译、汇编与链目标文件中段与目标存储器之间的关系
汇编器的COFF文件格式包括三个默认的段:.text段,即程序段,该段通常包含可执行代码即程序。.data段,即数据段,该段通常包含已初始化的数据。.bss段,即保留数据空间段,该段通常为未初始化的数据保留空间。11/17/202226山东大学控制学院张东亮目标文件中段与目标存储器之间的关系汇编器的COFF文件格式汇编器和链接器允许用户建立和链接自定义的段。所有段可以分为初始化段和未初始化段两类。初始化段包含程序代码和数据。未初始化段则为未初始化的数据保留存储空间。汇编命令.sect和.usect可以分别用来创建自定义的初始化段和未初始化段。C编译器对C程序编译后也产生初始化段和未初始化段两类,具体的段名稍有不同,除了不使用.data段之外,还产生一些新的段。11/17/202227山东大学控制学院张东亮汇编器和链接器允许用户建立和链接自定义的段。编译器对C语言编译后除了生成2个基本段,即.text、.bss外,还生成其他一些段。可分为初始化段和未初始化段。初始化段包含可执行代码或常数表。C编译器产生的初始化段有.pint、.const、.econst、.text、.cinit、.switch。.text段,包含可执行代码和常量(constant)。.cinit段和.pint段,包含初始化变量和常量。.const段,包含串常量,全局变量、静态变量的声明和初始化。.econst段,包含串常量,全局变量、静态变量的声明和初始化。变量由farconst修饰,或用大存储器模型,初始化后放进远(far)存储器。.switch段,包含switch语句表。11/17/202228山东大学控制学院张东亮编译器对C语言编译后除了生成2个基本段,即.t未初始化段用于保留存储器(通常为RAM)空间。C编译器产生的为初始化段有.bss、.ebss、.stack、.sysmem和.esysmem段。.bss段,为全局和静态变量保留空间。.ebss段,为全局和静态变量保留空间。变量由far修饰,或用大存储器模型使用。.stack段,为C系统堆栈。用于保护函数的返回地址、分配局部变量、调用函数时传递参数。.sysmem段,为动态存储器分配保留空间,malloc函数使用。.esysmem段,为动态存储器分配保留空间,farmalloc函数使用。11/17/202229山东大学控制学院张东亮未初始化段用于保留存储器(通常为RAM)空间。C编译器产生的初始化段链接
段名称描述限制.text可执行代码和常量程序.cint已初始化的全局与静态变量的C初始化记录低64K数据.pint全局构造器(C++constructor)表程序.switch实现switch语句表程序/低64K数据.const已初始化的全局与静态const修饰变量,串常量低64K数据.econstfarcostant变量数据任何位置11/17/202230山东大学控制学院张东亮初始化段链接段名称描述限制.text可执行代码和常量程序.未初始化段链接
段名称内容限制.bss全局与静态变量低64K数据.ebssfar全局与静态变量数据任何位置.stack堆栈空间低64K数据.sysmemmalloc函数存储区低64K数据.esysmemfarmalloc函数存储区数据任何位置11/17/202231山东大学控制学院张东亮未初始化段链接段名称内容限制.bss全局与静态变量低64K存储器映射表
段(Section)存储器类型(TypeofMemory)页面(Page).textROM或RAM0.cintROM或RAM0.pintROM或RAM0.switchROM或RAM0,1.constROM或RAM1.econstROM或RAM1.bssRAM1.ebssRAM1.stackRAM1.sysmemRAM1.esysmemRAM111/17/202232山东大学控制学院张东亮存储器映射表段(Section)存储器类型(Typeof4.3.2链接命令文件CCS的链接器可以有很多选项,如-l(包含库文件)、-stack(定义堆栈)、-o(定义输出文件)等,并且将用户软件定义的段与目标系统存储器物理地址对应关系定义清楚。链接器选项的实现通常采用工程选项菜单或链接器命令文件(.cmd)两种方法。编写一个链接器命令文件,将所有链接器选项写在文件中,并将此文件加入到工程,这样CCS在进行编译链接时,会自动按照链接器命令文件中的选项进行。有两条链接器命令MEMORY和SECTIONS可以实现对程序存储器和数据存储器空间的分配。MEMORY命令定义目标存储器的配置,SECTIONS命令定义编程段与目标存储器的关系。11/17/202233山东大学控制学院张东亮4.3.2链接命令文件CCS的链接器可以有MEMORY命令
MEMORY命令定义目标系统中可以使用的存储器范围,每个存储器范围具有名字、起始地址和长度。一般形式为MEMORY{PAGE0:name:origin=constant,length=constant;…PAGEn:name:origin=constant,length=constant;}PAGEn:定义存储器空间。n=0~254.通常PAGE0定义程序存储器,PAGE1定义数据存储器。name:存储器范围名字。可以是1~8个字符。origin或简写为o:存储器范围的起始地址。length或简写为l:存储器范围的长度。11/17/202234山东大学控制学院张东亮MEMORY命令MEMORY命令定义目标系统中可以SECTIONS命令SECTIONS命令用于将输出各段定位到所定义的存储器。一般形式为SECTIONS{name:[property,property,…]name:[property,property,…]…}在段名之后是是特性列表,定义段的内容以及是怎样分配的。段的特性(property)是装载位置、运行位置、输入段、段类型等。通常的特性符号“>”表示输出段装载位置。
11/17/202235山东大学控制学院张东亮SECTIONS命令SECTIONS命令用于将输4.4DSPC语言程序设计基础4.4.1数据类型4.4.2C语言运算符与基本语句4.4.3函数4.4.4指针4.4.5编译预处理命令4.4.6C语言与汇编语言混合编程4.4.7C28xDSP编译器的关键字11/17/202236山东大学控制学院张东亮4.4DSPC语言程序设计基础4.4.1数据类型11C语言程序设计优缺点汇编语言程序设计:
执行速度快。开发周期长、移植性和可读性差。C语言程序设计:开发周期短、移植性和可读性好。执行速度可以满足要求。11/17/202237山东大学控制学院张东亮C语言程序设计优缺点汇编语言程序设计:C语言程序设计:11/C28xDSP具有优化的C编译器,它支持ANSIC标准。还具有一些不同于标准C的特征。DSP的基本数据类型如表所示,还具有数组、结构、联合等构造类型数据。4.4.1数据类型11/17/202238山东大学控制学院张东亮C28xDSP具有优化的C编译器,它支持ANSITMS320C28xC的数据类型
1.C28x编译器基本数据类型11/17/202239山东大学控制学院张东亮TMS320C28xC的数据类型1.C28x编译器基本片内外设寄存器通常通过结构与联合变量的方法进行访问。2.结构例如,GPIOA口的MUX复用控制寄存器可用位段(bitfield)结构表示structGPAMUX_BITS{
unsignedintPWM1_GPIOA0:1; //第0位
unsignedintPWM2_GPIOA1:1;
…
unsignedintC2TRIP_GPIOA14:1;
unsignedintC3TRIP_GPIOA15:1; //第15位
};11/17/202240山东大学控制学院张东亮片内外设寄存器通常通过结构与联合变量的方法进例如,GPIOD口的MUX复用控制寄存器结构structGPDMUX_BITS{
unsignedintT1CTRIP_PDPA_GPIOD0:1; //第0位
unsignedintT2CTRIP_PDPA_GPIOD1:1; //1
unsignedintrsvd1:3; //4:2,保留unsignedintT3CTRIP_PDPA_GPIOD5:1; //5
unsignedintT4CTRIP_PDPA_GPIOD6:1; //6
unsignedintrsvd2:9; //15:7,保留
};当一个结构中有效字段(位段)的长度不足16位时,可以加入保留字段,以保证数据的完整性。结构变量的定义与成员变量的引用,例如,
structGPDMUX_BITSbit;//bit为GPDMUX_BITS类型变量
bit.T1CTRIP_PDPA_GPIOD0=1//将D0位定义为PDPA功能11/17/202241山东大学控制学院张东亮例如,GPIOD口的MUX复用控制寄存器结构struct联合体(也称为共用体)类型,可以将不同类型的数据存放在同一个地方,且占据同样大小的存储空间。例如,定义联合体类型GPDMUX_REG,
unionGPDMUX_REG{
unsignedintall; //all为无符号整型变量 structGPDMUX_BITSbit;//bit为结构型变量
};联合变量的定义与成员变量的引用,例如,
unionGPDMUX_REGGPDMUX;//GPDMUX为联合类型变量
GPDMUX.all=1;//将D0引脚定义为PDPA功能,其他为数字I/O3.联合11/17/202242山东大学控制学院张东亮联合体(也称为共用体)类型,可以将不同类型的联合可以出现在结构和数组中,结构和数组也可以出现在联合中。例如,结构类型GPIO_MUX_REGS,
structGPIO_MUX_REGS{
unionGPAMUX_REGGPAMUX;
unionGPDMUX_REGGPDMUX;
};结构变量的定义与成员变量的引用,例如,
structGPIO_MUX_REGSGpioMuxRegs;
//表示GpioMuxRegs是结构GPIO_MUX_REGS的一个变量
可以采用点运算符的方法引用各成员变量,
GpioMuxRegs.GPAMUX.all=0x077F;//CAP1-3,PWM1-6,T1pwm
GpioMuxRegs.GPDMUX.bit.T1CTRIP_PDPA__GPIOD0=1;//PDPA
GpioMuxRegs.GPDMUX.bit.T2CTRIP_SOCA__GPIOD1=0;//GPIOD1
GpioMuxRegs.GPDMUX.bit.T3CTRIP_PDPB__GPIOD5=0;//GPIOD5
GpioMuxRegs.GPDMUX.bit.T4CTRIP_SOCB__GPIOD6=0;//GPIOD6
定义GPIOA口时,采用了一条C语句。而定义GPIOD口时,采用了4条C语句。编程风格可以编程者自己决定。11/17/202243山东大学控制学院张东亮联合可以出现在结构和数组中,结构和数组也可以4.4.2C语言运算符与基本语句
1.C语言运算符2.C语言基本语句C语言运算符有算术运算符、关系运算符、逻辑运算符、位操作运算符等。不同的运算符可以有不同的优先级、运算对象个数与结合方向。C语句有控制语句、表达式语句、函数调用语句、空语句和复合语句五类。控制语句有9种。11/17/202244山东大学控制学院张东亮4.4.2C语言运算符与基本语句1.C语言运算符2
与普通的C语言程序类似,DSPC程序是由若干模块化的函数构成。函数是C程序的基本模块,子程序就是由函数来实现的。用户可以根据需要定义自己的功能函数,也可以调用C编译器提供的标准函数(库函数)来完成某种特定的功能。注意函数调用的规则。4.4.3函数11/17/202245山东大学控制学院张东亮与普通的C语言程序类似,DSPC程序是由若干C函数的一般格式为类型函数名(形式参数及其类型表){变量声明部分;执行语句部分;}一个函数在程序中可以三种形态出现:函数定义(Definition)、函数调用和函数声明(Declaration)。函数定义相当于汇编语言中的一般子程序。函数调用相当于调用子程序。函数定义和函数调用不分先后,但若调用在定义之前,那么在调用前必须先进行函数声明。函数声明是一个没有函数体的函数定义,而函数调用则要求有函数名和实际参数表。11/17/202246山东大学控制学院张东亮C函数的一般格式为11/9/202246山东大学控制
可以用指针的方法访问变量,用指针访问数组、结构、联合变量非常方便。4.4.4指针
例如,指向结构类型的指针变量p
structGPDMUX_BITS*p;
structGPDMUX_BITSbit;
p=&bit;
bit的成员T1CTRIP_PDPA_GPIOD0可用下述3种形式之一访问
bit.T1CTRIP_PDPA_GPIOD0
(*p).T1CTRIP_PDPA_GPIOD0
p->T1CTRIP_PDPA_GPIOD011/17/202247山东大学控制学院张东亮可以用指针的方法访问变量,用指针访问数组、结构、ANSIC新标准增加了一种void*指针类型,即可以定义一个指针变量,但不指定它是指向哪一种数据类型,例
unsignedlong
*Source=(void*)&PieVectTableInit;地址&PieVectTableInit被(void*)强制成了void*类型。指针Source为unsignedlong类型。例如,描述中断矢量表的指针PINTtypedef
unsignedintUint16; //定义一种类型Uint16Uint16i;typedefinterruptvoid(*PINT)(void);//指针PINT指向中断函数struct PIE_VECT_TABLE{ PINTPIE1_RESERVED; PINTPIE2_RESERVED;…}11/17/202248山东大学控制学院张东亮ANSIC新标准增加了一种void*C语言用指针访问数据存储器(或片内外设寄存器)可以用指针方法实现。例如,从扩展的外设接口读取开关状态,然后输出到扩展的指示灯外设接口。#defineLBDS(*((unsignedint*)0xc0000))//扩展的外设寄存器,指示灯#defineDIPS(*(unsignedint*)0xc0001)//扩展的外设寄存器,开关LBDS=DIPS; //读取拨码开关状态直接送指示灯显示一般将这些定义放到一个头文件,使用时,用编译预处理命令include包含该头文件即可。11/17/202249山东大学控制学院张东亮C语言用指针访问数据存储器(或片内外设寄存器)main(){
inti;
unsignedint*px,*py,*pz; px=(unsignedint*)0x80000; py=(unsignedint*)0x80100; for(i=0,pz=px;i<16;i++,pz++) (*pz)=i; for(i=0,pz=py;i<16;i++,pz++) (*pz)=0x1234; for(i=0;i<16;i++,px++,py++) (*py)=(*px); while(1){;}}例4-3,将数据存储器80000H开始的16个单元复制到80100H开始的单元。11/17/202250山东大学控制学院张东亮main()例4-3,将数据存储器80000H开始的16个例4-4扩展外部接口,编写C程序将4个开关状态反应到4个指示灯。#include"DSP281x_Device.h"//DSP281xHeadfileIncludeFile//定义指示灯控制寄存器地址和寄存器类型#defineLBDS(*((unsignedint*)0xc0000))//定义拨码开关控制寄存器地址和寄存器类型#defineDIPS(*(unsignedint*)0xc0001)main(){ InitSysCtrl(); //初始化DSP运行时钟,自定义函数 while(1) LBDS=DIPS; //读取拨码开关状态直接送指示灯显示} 11/17/202251山东大学控制学院张东亮例4-4扩展外部接口,编写C程序将4个开关状态反应到4宏定义#define #definePI3.14159 #defineUint16unsignedint(typedefunsignedintUint16;) #defineEINTasm(“clrcINTM”) EINT; #defineEALLOWasm(“EALLOW”)4.4.5编译预处理
文件包含#include #include<math.h> #include“DSP281x_Device.h”1.宏定义、文件包含与条件编译11/17/202252山东大学控制学院张东亮宏定义#define4.4.5编译预处理文件包含#i条件编译 #ifdef标识符 程序段1 #else 程序段2 #endif11/17/202253山东大学控制学院张东亮条件编译11/9/202253山东大学控制学院张东亮pragma是一类编译预处理命令(directive),通知编译预处理器如何处理函数。C28xC/C++支持如下pragma命令, CODE_SECTION(func,“sectionname”) DATA_SECTION(symbol,“sectionname”) INTERRUPT(func) FUNC_EXT_CALLED(func) FAST_CALL(func)2.pragma命令11/17/202254山东大学控制学院张东亮pragma是一类编译预处理命令(dire
CODE_SECTION代码段它为函数func在一个名为sectionname的段(section)中指定空间。将一个代码对象连接到一个不同于.text段的空间时,该语法非常有用。例如charbufferA[80];#pragmaCODE_SECTION(funA,“codeA”)charfunA(inti);voidmain(){charc;c=funA(1);}charfunA(inti){returnbufferA[i[];}11/17/202255山东大学控制学院张东亮CODE_SECTION代码段11/9/202255山
DATA_SECTION数据段它为符号symbol在一个名为sectionname的段中指定空间。将一个数据对象连接到一个不同于.bss段的空间时,该语法非常有用。例如#pragmaDATA_SECTION(bufferB,“my_sect”)charbufferB(512);数据块bufferB被定位于my_sect段中,my_sect段在.cmd文件中规定物理地址。11/17/202256山东大学控制学院张东亮DATA_SECTION数据段11/9/2022564.4.6C语言与汇编语言混合编程在C程序中直接嵌入汇编语句。独立的C模块和汇编模块接口。独立编写C程序与汇编程序,分别编译、汇编生成目标代码模块,然后用连接器连接起来。从C程序中访问汇编程序变量。11/17/202257山东大学控制学院张东亮4.4.6C语言与汇编语言混合编程在C程序中直接嵌入汇编语1.在C程序中直接嵌入汇编语句C程序嵌入汇编语句是一种直接的C模块和汇编模块接口方法。可以在C程序中实现用C语言难以实现的一些硬件控制功能。另一方面,也可以用这种方法在C程序中的关键部分用汇编语句代替C语句以优化程序。这种方法的一个缺点是它比较容易破坏C环境,因为C编译器在编译嵌入了汇编语句的C程序时并不检查或分析所嵌入的汇编语句。直接在C语言程序中相应位置嵌入汇编语句,只需在汇编语句加上双引号和小括号,前面加asm标识符号,双引号内第一个字符应是空格。即,
asm(“汇编语句”)例如asm(“NOP”);#defineEINTasm(“CLRCINTM”)//开放中断 EINT;11/17/202258山东大学控制学院张东亮1.在C程序中直接嵌入汇编语句C程序嵌入汇编语句是一种直接2.独立的C模块和汇编模块接口在编写独立的汇编程序时,必须注意以下几点:(1)不论是用C语言编写的函数还是用汇编语言编写的函数,都必须遵循寄存器使用规则。(2)必须保护函数要用到的几个特定寄存器。(3)中断程序必须保护所有用到的寄存器。(4)从汇编程序调用C函数时,第一个参数(最左边)必须放入累加器A中,剩下的参数按自右向左的顺序压入堆栈。(5)调用C函数时,注意C函数只保护了几个特定的寄存器,而其他寄存器可以自由使用。(6)长整型和浮点数在存储器中存放的顺序是低位字在高地址,高位字在低地址。11/17/202259山东大学控制学院张东亮2.独立的C模块和汇编模块接口在编写独立的汇编程序时,必须(7)如果函数有返回值,返回值存放在累加器中。(8)汇编语言模块不能改变由C模块产生的.cinit段,如果改变其内容将会引起不可预测的后果。(9)编译器在所有标识符(函数名、变量名等)前加下划线“_”。(10)任何在汇编程序中定义的对象或函数,如果需要在C程序中访问或调用,则必须用汇编指令.global定义。11/17/202260山东大学控制学院张东亮(7)如果函数有返回值,返回值存放在累加器中。11/9/23.从C程序中访问汇编程序变量从C程序中访问在汇编程序中定义的变量或常数,可以分为以下3种情况:(1)访问在.bss段中定义的变量。(2)访问不在.bss段中定义的变量。(3)对于在汇编程序中用.set和.global伪指令定义的全局常数,也可以使用特殊的操作从C程序中访问它们。11/17/202261山东大学控制学院张东亮3.从C程序中访问汇编程序变量从C例4-5,在C程序中访问在.bss段中定义的变量。汇编程序:.bss_var,1 ;定义变量.global_var ;声明为外部变量C程序:externintvar //声明为外部变量var=1 //访问变量11/17/202262山东大学控制学院张东亮例4-5,在C程序中访问在.bss段中定义的变量。11/9/例4-6,在C程序中访问不在.bss段中定义的变量。汇编程序:.global_sine ;声明为外部变量.sect“sine_tab” ;建立一个独立的段_sine: ;常数表起始地址.float0.0.float0.015987.float0.022145C程序:externfloatsine[] //声明为外部变量float*sine_p=sine; //声明一个指针指向该变量f=sine_p[4]; //作为普通数组访问sine数组11/17/202263山东大学控制学院张东亮例4-6,在C程序中访问不在.bss段中定义的变量。11/94.4.6C28xDSP编译器的关键字C28xDSPC/C++编译器,支持标准的const、register、volatile等关键字,还扩展了cregister、interrupt、far、near等关键字。关键字const
该关键字可以优化存储器的分配。加const到任何变量的定义可以确保其内的值不变。11/17/202264山东大学控制学院张东亮4.4.6C28xDSP编译器的关键字关键字volatile该关键字所定义的变量是可变的,可以被其他硬件修改,而不仅仅只能由C程序修改。优化器会尽量减少存储器的访问,所以有时必须禁止优化,特别是循环控制变量。例子
volatileunsignedint*ctrl;while(*ctrl!=0xff);//循环等待,直到ctrl地址的内容为0xff11/17/202265山东大学控制学院张东亮关键字volatile11/9/202265山东大学控制学院关键字cregster该扩展关键字允许高级语言读/写控制寄存器。在F281xC中,cregister仅限于中断使能寄存器IER和中断标志寄存器IFR,程序中应有如下声明externcregistervolatileunsignedintIER;externcregistervolatileunsignedintIFR;可以用|(位或)和&(位与)进行操作,例如IFR|=0x100;IFR&=0x100; 11/17/202266山东大学控制学院张东亮关键字cregster11/9/202266山东大学控制学院关键字interrupt该扩展关键字用来说明函数是一个中断函数。中断函数被定义成返回void类型,而且无参数调用,例如,
interruptvoidint_handler() { unsignedintflags; … }11/17/202267山东大学控制学院张东亮关键字interrupt11/9/202267山东大学控制学关于中断函数中断的使能和屏蔽必须由程序员自己设置。中断程序没有参数传递,既使说明,也会被忽略。中断处理程序不能被正常的C程序调用。为了使中断程序与中断一致,在相应的中断矢量中必须放置一条转移指令,可以用.sect汇编伪指令建立一个简单的跳转指令表来完成此项功能。在汇编语言中断程序中,注意在符号名前面加上一个下划线,例如c_int00记为_c_int00。中断程序使用的所有寄存器,包括状态寄存器和程序中调用函数使用的寄存器都必须予以保护。11/17/202268山东大学控制学院张东亮关于中断函数中断的使能和屏蔽必须由程序员自己设置。11/9关键字farC/C++编译器的默认寻址空间是64K。所有指针的默认大小为16位。C28x支持的寻址空间达4M字,即22位。加上far关键字限定符的指针大小为22位,可以寻址4M字空间。11/17/202269山东大学控制学院张东亮关键字far11/9/202269山东大学控制学院张东亮#include"DSP281x_Device.h"//DSP281xHeaderfileIncludeFile//定义指示灯寄存器地址和寄存器类型#defineLBDS(*((unsignedint*)0xc0000))//指定地址的整型变量voidDelay(unsignedintnDelay); //延时子程序,函数声明main(){ unsignedintuLED[4]={1,2,4,8};//控制字0001,0010,0100,1000数组 inti; InitSysCtrl(); //初始化DSP运行时钟,自定义函数 //系统时钟150MHz,使能外设时钟,禁止WDwhile(1)例4-7
4个LED指示灯接到DSP通过CPLD扩展的外部简单接口电路,其地址为0xc0000。用C语言编程使之闪烁。+3.3V1kLED4.5DSPC程序举例11/17/202270山东大学控制学院张东亮#include"DSP281x_Device.h"{for(i=0;i<4;i++) { LBDS=uLED[i]; //正向顺序送控制字 Delay(256); //延时 }for(i=3;i>=0;i--) { LBDS=uLED[i]; //反向顺序送控制字 Delay(256); //延时 } }}11/17/202271山东大学控制学院张东亮{11/9/202271山东大学控制学院voidDelay(unsignedintnDelay)//延时程序,自定义函数{ intii,jj,kk=0; for(ii=0;ii<nDelay;ii++) { for(jj=0;jj<512;jj++){kk++;} }}11/17/202272山东大学控制学院张东亮voidDelay(unsignedintnDelay#include"DSP281x_Device.h" //DSP281xHeaderfileIncludeFile//定义指示灯寄存器地址和寄存器类型voidDelay(unsignedintnDelay); //延时子程序,函数声明#defineCTRGR*(int*)0x108000 //控制板全局控制寄存器#defineCTRLR*(int*)0x108007 //控制板辅助控制寄存器main(){
InitSysCtrl(); //初始化PLL,CLKOUT=150M,使能外设时钟,禁止WDEALLOW;//GpioMuxRegs.GPBMUX.all=00;//ConfigureMUXsasdigitalI/OsGpioMuxRegs.GPBDIR.all=0x00FF;//GPIODIRselectGPIOB7:1asoutputEDIS;
例4-81个LED指示灯接到DSP的通用输入输出接口GPIOB5。用C语言编程使之闪烁。+3.3V1kLED11/17/202273山东大学控制学院张东亮#include"DSP281x_Device.h"voidDelay(unsignedintnDelay)//延时程序,自定义函数{ intii,jj,kk=0; for(ii=0;ii<nDelay;ii++) for(jj=0;jj<512;jj++)kk++;} CTRGR=0; //初始化ICETEK-CTR CTRGR=0x80; CTRGR=0; CTRLR=0; //关闭东西方向的交通灯 CTRLR=0x40; //关闭南北方向的交通灯 CTRGR=2;while(1){GpioDataRegs.GPBDAT.bit.GPIOB5=0;Delay(10);GpioDataRegs.GPBDAT.bit.GPIOB5=1;Delay(10);}}
11/17/202274山东大学控制学院张东亮voidDelay(unsignedintnDelay例4-9,1个LED指示灯接到DSP通过扩展的外部简单接口电路的最低位,其地址为0xc0000。采用通用定时器T1中断方式定时200ms,用C语言编程使之闪烁,即引脚上产生周期为400ms的方波,XCLKIN=30MHz,SYSCLKOUT=150MHz。#include"DSP281x_Device.h" //DSP281x寄存器头文件#defineLBDS*((unsignedint*)0xc0000) //定义指示灯寄存器地址interruptvoideva_timer1_isr(void);void EVA_Timer1() //定时器初始化{EvaRegs.GPTCONA.all=0; //初始化EVATimer1EvaRegs.T1PR=0x9895;//定时周期为5.12us*(T1PR+1)=0.2sEvaRegs.EVAIMRA.bit.T1PINT=1;//使能定时器1的周期中断EvaRegs.EVAIFRA.bit.T1PINT=1;//写1清除定时器1的周期中断标志EvaRegs.T1CNT=0x0000; //计数寄存器从0开始EvaRegs.T1CON.all=0x1740;//连续增计数,128分频,打开定时器}11/17/202275山东大学控制学院张东亮例4-9,1个LED指示灯接到DSP通过扩展的外部简单接口main(){ InitSysCtrl(); //初始化DSP运行时钟,时钟频率150MHz EALLOW; SysCtrlRegs.HISPCP.all=0x0003;//高速时钟频率=25MHz EDIS; DINT; //关闭总中断 IER=0x0000; //清中断使能 IFR=0x0000; //清中断标志 InitPieCtrl(); //初始化PIE控制寄存器 InitPieVectTable(); //初始化PIE中断向量表 EVA_Timer1(); //初始化EVATimer1 EALLOW; PieVectTable.T1PINT=&eva_timer1_isr; //中断服务程序入口地址放入中断向量表 EDIS;11/17/202276山东大学控制学院张东亮main()11/9/202276山东大学控制学院张东//依次使能各级中断:外设中相应中断位->PIE控制器->CPU PieCtrlRegs.PIEIER2.all=M_INT4; //GP定时器1使能位于PIE第2组第4个,将其使能 IER|=M_INT2;//使能的PIE第2组可屏蔽中断2(INT2) EINT; //开总中断 LBDS=0; //指示灯全灭 while(1){;} //等待中断}interruptvoideva_timer1_isr(void){LBDS^=1; //产生方波,最低位指示灯亮灭切换EvaRegs.EVAIMRA.bit.T1PINT=1; //使能定时器1的周期中断EvaRegs.EVAIFRA.bit.T1PINT=1; //写1清除定时器1的周期中断标志PieCtrlRegs.PIEACK.all=PIEACK_GROUP2; //清零PIEACK中的第2组中断对应位}11/17/202277山东大学控制学院张东亮//依次使能各级中断:外设中相应中断位->PIE控制器->C思考题与习题DSP应用系统的软件开发流程是什么?采用CCS集成开发环境进行软件开发调试的步骤是什么?DSP的硬件仿真器与软件仿真器有什么异同点?什么是COFF格式?它有什么特点?说明.text段、.data段、.bss段分别包含什么内容?链接命令文件包括哪些内容?MEMORY命令和SECTION命令分别有什么作用?DSPC语言有哪些特点?C28xDSP编译器有哪些数据类型?11/17/202278山东大学控制学院张东亮思考题与习题DSP应用系统的软件开发流程是什么?11/9/2如何访问片内外设寄存器的某些位?如何直接访问存储器单元?pragma编译预处理命令有什么用途?C语言与汇编语言混合编程有哪些方法?C28xDSP的C编译器扩展了哪几个关键字?1个LED指示灯接到DSP的通用I/O引脚GPIOB4。采用通用定时器T1中断方式定时200ms,用C语言编程使之闪烁,XCLKIN=30MHz,SYSCLKOUT=150MHz。11/17/202279山东大学控制学院张东亮如何访问片内外设寄存器的某些位?11/9/202279山东大第4章
DSP的软件开发与C语言编程本章内容:4.1DSP开发工具与软件开发流程4.2集成开发环境CCS4.3DSP的C工程文件
4.4DSPC语言程序设计基础4.5DSPC程序举例11/17/202280山东大学控制学院张东亮第4章DSP的软件开发与C语言编程本章内容:11/9/24.1DSP开发工具与软件开发流程1.DSP开发工具硬件TIXDS510(ExtendedDevelopmentSystem)硬件仿真器。DSK(DSPStarterKit)初学者开发套件。瑞泰ICETEK-5100PP/USBDSP开发系统。评估板。DSP教学实验系统。开发工具包括硬件、软件两部分。硬件部分主要是仿真器(Emulator),软件主要是集成开发环境CCS(CodeComposerStudio)。DSP开发系统(仿真器)有PCI插卡式、并口式、USB接口式,目前多用USB接口式,即DSP开发系统通过USB接口与PC机相连,开发系统通过JTAG(基于扫描的仿真)接口与用户目标板相连,实现DSP软硬件调试与程序烧写。11/17/202281山东大学控制学院张东亮4.1DSP开发工具与软件开发流程1.DSP开发工具
DSP评估板(也称为EVM板、目标板、DEMO板、实验板等),包括基本的DSP芯片及必要的电源、时钟、复位电路外,还经常包括用于程序调试的片外扩展存储器、扩展的A/D、D/A转换器、键盘显示电路、EEPROM、RS232串行接口、SPI接口、CAN接口驱动电路、简单应用电路等。F2812DSP评估板11/17/202282山东大学控制学院张东亮DSP评估板(也称为EVM板、目标板、DEF2812DSP评估板原理框图开发系统与评估板11/17/202283山东大学控制学院张东亮F2812开发系统11/9/20224山东大学控制学院张2812EVM板的主要性能指标如下:(1)TMS320F2812,运行速度150MIPS。(2)片内RAM18K字。(3)扩展RAM64K字。(4)片内16路12位A/D转换器,最大采样速率12.5MSPS。(5)扩展的4路12位D/A转换器DAC7617。(6)两路UART串行接口,符合RS-232C标准。(7)16路PWM输出。(8)CAN总线标准接口。(9)用户开关与指示灯。(10)片内128K字Flash存储器,带128位加密位。(11)IEEE1149.1兼容的逻辑扫描电路即JTAG接口,用于仿真调试。(12)+5V电源输入,板上3.3V,1.8V电源管理。11/17/202284山东大学控制学院张东亮2812EVM板的主要性能指标如下:11/9/20225山11/17/202285山东大学控制学院张东亮11/9/20226山东大学控制学院张东亮2.软件开发流程软件开发流程框图11/17/202286山东大学控制学院张东亮2.软件开发流程软件开发流程框图11/9/20227山
软件开发流程
1)编辑:生成源程序(*.asm,*.c)、头文件(*.h)与命令文件(*.cmd)。2)编译与汇编:生成目标文件(*.obj,公共目标文件COFF格式)及列表文件(*.lst)。3)连接:生成可执行代码文件(*.out)及映射文件(*.map)。4)调试:通过JTAG接口下载到目标系统EVM。5)通过JTAG接口将程序固化烧写到Flash存储器。11/17/202287山东大学控制学院张东亮软件开发流程1)编辑:生成源程序(*.asm,*.c)软件开发工具主要有源程序编辑器(Editor)编译器(Compiler)汇编器(Assembler)链接器(Linker)归档器(Archiver)运行时支持库(Run-Time-SupportLibrary)库建立程序(Library-buildUtility)HEX转换程序(HexConversionUtility)3.软件工具11/17/202288山东大学控制学院张东亮软件开发工具主要有3.软件工具11/9绝对列表器(AbsoluteLister)和交叉引用列表器(Cross-ReferenceLister)调试工具(Debuggingtools)C++名称复原程序(C++NameDemanglingUtility)GEL语言(GeneralExtensionLanguage,通用扩展语言)DSP/BIOS等。11/17/202289山东大学控制学院张东亮绝对列表器(AbsoluteLister)和交叉引用列表1.CCS软件安装与设置CCS2.0’C2000(CCS3.3)驱动程序设置。Simulator:PC模拟软件仿真。Emulator:实时DSP硬件仿真。4.2集成开发环境CCS11/17/202290山东大学控制学院张东亮1.CCS软件安装与设置CCS2.0’C2000(CCS运行主窗口
11/17/202291山东大学控制学院张东亮CCS运行主窗口11/9/202212山东大学控制学院CCS主要工具源程序编辑器(Editor)。C编译器(CCompiler)。汇编器(Assembler)。连接器(Linker)。调试工具(Debug)。十六进制转换公用程序(HexConversionUtility)。11/17/202292山东大学控制学院张东亮CCS主要工具源程序编辑器(Editor)。11/9/2022.CCS主要菜单与功能典型的CCS运行界面如图所示。CCS的功能可以通过菜单或工具条按钮实现。主要的菜单项有File、Edit、View、Project、Debug等。这些菜单的使用与常用的集成开发软件VisualC++等使用方法基本一样。11/17/202293山东大学控制学院张东亮2.CCS主要菜单与功能典型的CCS运行界典型CCS运行界面11/17/202294山东大学控制学院张东亮典型CCS运行界面11/9/202215山东大学控制学院CodeComposerStudio™Components
Robust,Easy-to-UseDevelopmentEnvironmentHelpCPUWindowMemorywindowGraphwindowProjectManager:Source&objectfilesFiledependenciesCompiler,Assembler&LinkerbuildoptionsStatuswindowFullC/C++&AssemblyDebugging:C&ASMSourceMixedmodeDisassembly(patch)SetBreakPointsSetprobePointsWatchwindowProductiveEditor:StructureExpansionMenusorIcons11/17/202295山东大学控制学院张东亮CodeComposerStudio™ComponenReal-timeDebuggingAllowsyoutohaltinnon-criticalcodefordebugwhiletime-criticalinterruptscontinuetobeserviced.Accessmemoryandregisterswithoutstoppingtheprocessor.Implementedinsilicon,notbyadebugmonitor:Easy-to-use,noapplicationresourcesrequiredInterruptvoidISR_1(){………}Main(){……}function(){
……}Haltandsinglestepnon-timecriticalcodeTime-criticalinterruptsarestillserviced.InControl,IfTheProcessorStops,TheSystemCanGoOutOfControl11/17/202296山东大学控制学院张东亮Real-timeDebuggingAllowsyouFile菜单11/17/202297山东大学控制学院张东亮File菜单11/9/202218山东大学控制学院张东亮Project菜单11/17/202298山东大学控制学院张东亮Project菜单11/9/202219山东大学控制学院View菜单11/17/202299山东大学控制学院张东亮View菜单11/9/202220山东大学控制学院张东亮Debug菜单11/17/2022100山东大学控制学院张东亮Debug菜单11/9/202221山东大学控制学院张东3.采用CCS开发应用程序的步骤创建一个新工程(project)。编辑源程序(*.asm,*.c)与连接命令文件(*.cmd)。将文件添加到该工程中(*.asm,*.c,*.h,*.cmd)。编译汇编连接。装载程序。调试程序。程序固化。11/17/2022101山东大学控制学院张东亮3.采用CCS开发应用程序的步骤创建一个新工程(proje调试程序连续运行与单步运行。设置断点。查看与修改存储单元。查看与修改寄存器内容。观察和编辑变量。程序Animate运行和数据图形显示。11/17/2022102山东大学控制学院张东亮调试程序连续运行与单步运行。11/9/202223山东大学控C工程(Project)几种基本文件CCS工程文件(扩展名为.pjt)。由CCS自动生成。在CC(CodeComposer)软件环境中,扩展名为.mak。
源程序:汇编语言文件(*.asm),C文件(*.c)。头文件(*.h):定义寄存器映射地址,用户自定义的常量等。例如,头文件DSP281x_Adc.h定义了ADC寄存器,头文件DSP281x_PieVec.h定义了PIE中断矢量。链接命令文件(*.cmd)。库文件(*.lib)。运行时支持库rts2800_ml.lib。目标文件(*.obj):COFF公共目标文件格式。列表文件(*.lst):汇编生成的文件。映射文件
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 合同封皮专题模板
- 企业安全保证书
- 有机认证核桃采购合同
- 合同补充协议中的按揭问题解答
- 业务员提成奖励协议书
- 户外广告牌投放区域合同
- 环保劳保鞋采购
- 金融服务合同在国际金融发展的贡献
- 七天无理由退换保证
- 道路亮化照明工程招标详情
- 铸牢中华民族共同体意识-形考任务1-国开(NMG)-参考资料
- 磨床精度检查表
- 神华煤直接液化煤液化 – 装置03操作规程(试行)
- Euler方法与改进的Euler方法的应用
- 鼓乐铿锵导学案
- GB 10767-2021 食品安全国家标准 幼儿配方食品(高清版)
- 食品小作坊食品原料进货台账【精选文档】
- 初中人音版音乐七年级下册.第四单元红河谷.(13张)ppt课件
- (完整版)周转材料验收标准
- 110~750kV架空输电线路设计规范
- word带圈数字序号1-99可复制
评论
0/150
提交评论