版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第三章软件开发基础工信部十二五规划教材《DSP控制器原理与应用技术》编写组第3章软件开发基础3.1软件开发流程3.2汇编程序开发基础3.3C/C++程序开发基础3.4C/C++和汇编混合编程3.5集成开发环境及其应用3.6基于示例模版的驱动程序开发
一、软件开发流程图3.1软件开发流程二、软件开发步骤3.1软件开发流程1.编制源程序
(1)汇编语言:速度快,效率高,直接控制硬件底层资源。
(2)C语言:通用性、可移植性好
(3)混合编程2.产生可执行代码
C工具:C编译器(C→
汇编)
汇编工具:
汇编器(Assembler):汇编文件→COFF目标文件
连接器(Linker):COFF文件→可执行模块;3.调试代码
4.固化代码3.2.1寻址方式与指令系统一、寻址方式(1)直接寻址——访问数据空间的低4M字C28x模式:16位DP+6位偏移量=22位有效物理地址C2xLP模式:9位DP+7位偏移量=16位有效物理地址。(a)AMODE=0(C28x寻址模式)MOVWDP,#VarA ;VarA所在页面装载DPADDAL,@VarA ;将VarA的值加至AL3.2汇编程序开发基础(2)堆栈寻址——可访问数据空间的低64K
低64K字作为软件堆栈,由堆栈指针SP给出。三种方式:*-SP[6bit]、*SP++和*SP--ADDAL,*-SP[5] ;将(SP-5)堆栈单元的16位内容加到AL中MOV*SP++,AL ;将16位AL的内容压入堆栈,且SP=SP+1ADDAL,*SP-- ;将16位内容弹出并加至AL中,且SP=SP-1一、寻址方式(3)间接寻址——可访问4G字的数据空间操作数地址指定:
32位辅助寄存器XAR0~XAR7工作寄存器指定:
C28x:直接在指令中给出;
C2xLP:由辅助寄存器指针ARP指定。五种方式:*XARn++、*--XARn、*+XARn[AR0]、*+XARn[AR1]和*+XARn[3bit]。一、寻址方式(3)间接寻址——可以访问整个4G字的数据空间MOVLACC,*XAR2++ ;将XAR2所指向存储单元的内容装入ACC,之后XAR2+2MOVLACC,*--XAR2 ;将XAR2-2,然后将XAR2所指向存储单元的内容装入ACCMOVLACC,*+XAR2[AR0] ;将(XAR2+AR0)所指向存储单元的内容装入ACCMOVLACC,*+XAR2[AR1] ;将(XAR2+AR1)所指向存储单元的内容装入ACCMOVLACC,*+XAR2[5] ;将(XAR2+5)所指向存储单元的内容装入ACC一、寻址方式(4)寄存器寻址:直接访问寄存器的内容32位寻址:ACC、P、XT、XARn等16位寻址:AL、AH、PL、PH、TH、T和ARn等
MOVL@ACC,XT ;32位寄存器寻址,将XT寄存器的内容装入ACCADD@AH,AL ;16位寄存器寻址,AH=AH+AL(5)数据/地址/IO空间立即寻址方式(6)程序空间间接寻址方式。一、寻址方式3.2.1寻址方式与指令系统语法:操作码目的操作数,源操作数操作码:指示处理器所要执行的操作;操作数:指示指令执行过程中所需数据(或其地址)。例如:ADDACC,#16位常数{<<0-16} ;将16位常数移位后加至ACCADDBACC,#8位常数;将8位常数加至ACCADDLACC,loc32;将“loc32”指定单元的32位数加至ACC二、指令系统三、混合编程时常用汇编指令总结一、段(Section)
三个默认段:.text,.data,.bss
段分为两大类:初始化段,未初始化段。1.初始化段(包含程序代码和数据)
.text段:包含可执行代码
.data段 :包含已初始化的数据
.sect段:.sect伪指令创建的自定义段2.未初始化段
.bss段:为未初始化的变量保留空间
.usect段:.usect伪指令创建的自定义段3.2.2公共目标文件格式CommonObjectFileFormat简称COFF3.2.2公共目标文件格式二、汇编器对段的处理汇编器根据伪指令识别程序各部分。将汇编程序内容分门别类归入各个段。三、连接器对段的处理
(1)建立可执行的COFF输出模块
(2)为输出模块选择存储器地址(定位)。MEMORY伪指令:定义目标存储器映像(分块,块起始地址及长度);SECTIONS伪指令:组合输入段以及定位输出段。1.MEMORY伪指令语法MEMORY{PAGEn:name[attr]:origin=const,length=const}
PAGE——存储空间。0:程序存储器,1:数据存储器。
name——存储区名称。origin——起始地址。
length——长度,。2.SECTIONS伪指令语法SECTIONS{name:[property,property,…]}运行的位置。语法:run=allocation或run>allocation加载的位置。语法:
load=allocation或load>allocation或
allocation3.连接器命令文件
连接时可编写一个通用的连接器命令文件模板:
MEMORY:定义存储器及其地址;SECTIONS:将各输出段定位到相应存储区。
MEMEORY{PAGE0:/*程序空间*/ZONE0:origin=0x004000,length=0x001000/*XINTFzone0*/RAML0:origin=0x008000,length=0x001000/*on-chipRAMblockL0*/……}SECTIONS{/*分配程序区域:*/.cinit:>FLASHAPAGE=0.pinit:>FLASHA,PAGE=0.text:>FLASHAPAGE=0……}3.2.4汇编程序设计一、汇编伪指令
1.定义段的伪指令伪指令语法功能描述.text.text将其后的源语句汇编至.text(代码)段.data.data将其后的源语句汇编至.data(数据)段.sect.sect“段名”将其后源语句汇编至“段名”规定的段内.bss.bss符号,字长在.bss段内保留字长(字数).usect符号.usect“段名”,字长在未初始化自定义段“段名”中保留字长2.初始化常数的伪指令.space位长(在当前段内保留位长,并填0)
.word 数值列表(将一个或者多个16位初始化数值存放在当前段内连续个存储单元中。)(1)语法:.include “文件名”功能:通知汇编器从指定文件读取源语句。(2)语法:.def/.ref/.global符号名列表.def(定义):在当前模块定义而在其它模块中引用.ref(引用):在当前模块引用而在其它模块中定义.global(全局):可以是以上2种情况3.引用其它文件的伪指令
二、示例文件例3.2(10+2)的汇编语言程序代码*.global_main.text_main:MOVACC,#10MOVT,#2ADDACC,T3.3.1TMS320x28xxC/C++优化编译器1、C/C++编译器支持ANSIC和ISO/IET14882-1998C++:能将标准ANSIC/C++程序转换成相应的汇编程序。3.3C/C++程序开发基础C编译器中包含了运行支持库(.lib)。
2、代码的优化优化目的:提高程序执行速度,缩减程序代码。优化操作:简化循环、软件流水线操作、重组语句或简化表达式,变量重定位等优化等级:0、1、2、3、4
数字越大,优化等级越高。一、C语言数据类型1.变量和标识符:3.3.2C/C++编程基础2.数据类型二、C语言关键词1.interrupt关键字作用:定义中断服务程序(中断函数)。voidinterrupt函数名(){}2.ioport关键字作用:定义C中访问IO端口空间的端口变量。ioport类型标示符端口编号端口编号为16进制表示的I/O端口的绝对地址。C28xI/O空间与存储空间统一,故不使用该关键字。3.volatile关键字作用:避免变量被优化。通知编译器每次访问被声明变量时均需从其地址读取。4.register关键字作用:定义寄存器变量,以加快访问速度。二、C语言关键词5.cregister关键字作用:在C中直接访问IER和IFR。例如:externcregistervolatileunsignedintIER;IER|=0x0100;volume=4.0/3.0*PI*radius*radius*radius6.inline关键字作用:定义可直接插入被调用处的短小函数。inlineintvolume_sphere(floatr){retrurn4.0/3.0*PI*r*r*r;}volume=volume_sphere(radius);7.const关键字作用:保护变量或数组的值不被改变。8.far关键字作用:指定22位长度的指针。intfarsym;/*声明sym位于远内存,为far类型的变量*/#pragma告诉预处理器怎样对待函数三、#pragma预编译器指令1.
CODE_ALIGN作用:为某一段程序指定特定的代码存储边界,以保证某函数代码存于特定位置。#pragmaCODE_ALIGN(func,constant)#pragmaCODE_ALIGN(constant)constant必须是2的幂次,以保证内存边界2.CODE_SECTION:作用:为某一段程序指定特定的代码存储段,以便单独分配存储空间作用:为某一段数据指定特定的数据存储段,以便单独分配存储空间。#pragmaDATA_SECTION(symbol,“section_name”)
为变量symbol在“section_name”段内分配空间,可将其定位至.bss以外的空间例:#pragmaDATA_SECTION(bufferB,“BufferB_sect”) charbufferB[512];3.DATA_SECTIONSECTIONS{BufferB_sect:{}>RAML4PAGE1}4.INTERRUPT作用:指明函数为中断处理函数5.FAST_FUNC_CALL作用:允许在C/C++中直接调用汇编编写的函数。调用时采用快速函数调用(FFC)机制。调用更快速。
函数返回时的asm代码是: LB*XAR76.FUNC_EXT_CALLED作用:保证程序执行期间未调用的函数不被优化掉。混合编程中,可用于防止汇编调用的函数被优化掉。7.MUST_ITERATE作用:指明循环必须执行的次数,以防止循环被优化掉。语法:四、中断处理方法
中断处理方法:使用中断服务函数。
中断函数定义方法:以c_intd(d为数字)为名称定义(c_int00保留)利用关键字interrupt定义利用#pragma指令INTERRUPT定义中断服务程序使用规则:①中断服务程序无参数。②调用效率极低。③某中断提供中断服务程序时,必须将其地址赋给相应中断向量。3.4.1C/C++编译器运行环境一、C系统堆栈
作用:存放局部变量,传递函数参数,保存处理器状态、函数返回地址、中间结果和寄存器值。管理:硬件堆栈指针SP、辅助寄存器XAR2。
SP:堆栈指针,指向当前栈顶XAR2:帧指针,指向当前帧的起始地址。局部帧:每调用一次函数,在当前栈顶产生一个新的帧,用来存放局部变量和中间值。二、
寄存器使用规则两种寄存器变量:保护调用环境,保护入口环境。
3.4C/C++和汇编混合编程
三、
函数调用规则(1)传递参数;①优先通过寄存器传递;②剩余参数进栈(2)返回地址(原RPC)进栈(3)分配局部帧:为被调用函数分配存储空间1.父函数执行操作①通过寄存器传递参数规则。(a)头4个浮点参数存放于寄存器R0H~R3H;(b)64位参数第一个放ACC和P;(c)32位参数第一个放ACC;(d)指针型参数存放于XAR4和XAR5;(e)16位参数的存放顺序为:AL、AH、XAR4、XAR5。②其它参数以逆序压入堆栈。32位参数在堆栈中从偶地址开始存放。结构体变量仅传递地址。③父函数使用LCR指令调用子函数。2.子函数的响应①返回值的处理:16位整型数存放于AL,32位整型数存放于ACC,②子函数使用LRETR指令返回。3.访问参数和局部变量
局部帧空间小于63个字时,采用SP访问
“*-SP[6位偏移量]”最大偏移量为63,
局部帧空间大于63个,使用FP(XAR2)访问。
“*+FP[偏移量]”
“*+FP[AR0/AR1]”3.4.2C和汇编接口特别注意:(1)汇编模块中被C访问的标识符前要加下划线。如,若变量x要被C程序访问,必须用_x表示。(2)汇编模块中需要被C模块引用的变量或者函数要用伪指令.def或.global声明;C模块中需要被汇编模块引用的变量或者函数在汇编模块中也必须用伪指令.global声明。例:汇编接收C传递的参数并加至C全局变量gvar返回。C主程序externintasmfunc();/*声明全局汇编函数*/intgvar; /*定义全局变量gvar*/voidmain(){inti=5;i=asmfunc(i);/*正常调用汇编函数*/}南航自动化学院DSP技术应用实验室一、
独立编写C和汇编模块汇编子程序
.global_gvar
.global_asmfunc_asmfunc:MOVWDP,#_gvarADDAL,@_gvarMOV@_gvar,ALLRETR3.4.3混合编程方法二、使用FAST_FUNC_CALL预编译器指令示例:实现两个32位数的加法运算(a)汇编程序_add_long:addlacc,*-SP[2]LB*XAR7(b)C程序#pragmaFAST_FUNC_CALL(add_long);longadd_long(long,long);voidf(){longx=0,y=0;x=67000;y=76000;y=add_long(x,y);while(1)k=0;}
asm(“汇编语句”)
三、直接在C程序中嵌入汇编语句优点:(1).程序编写方便。(2).程序保留C结构,结构清晰,可读性好。(3).程序调试方便。南航自动化学院DSP技术应用实验室注意:(1)小括号中双引号后第一列是标号位置,用空格代替。(2).编译器在编译过程中只是把内嵌指令照搬到编译生成的汇编代码的相应位置。(3).不要把跳转指令或者带标号的汇编语句嵌入C程序。a).C程序
externintvar;/*声明var为全局变量*/var=1;/*引用var*/b).汇编程序
.bss_var,1 ;定义变量_var.global_var ;声明_var为全局变量
1.访问.bss段中变量
四、在C中访问汇编变量
(a)C程序
externfloatsine[];/*说明sine为外部变量*/f=sine[2];/*把sine看作正常数组使用*/(b)汇编程序
.global_sine;说明sine为外部变量
.sect”sine_tab”;定义一个独立的段
_sine:;查找表的初始地址
.float0.0.float0.015987.float0.022145
2.访问不在.bss段中的变量五、使用内部算子访问汇编作用:内部算子(intrinsics)可将C/C++中无法描述或描述比较复杂的任务用特定汇编语句描述。使用方法:以函数形式调用,名称前加下划线。南航自动化学院DSP技术应用实验室
(1)新建一个C源文件,为汇编函数声明一个函数原型、创建C函数实体;并在main()函数中调用。(2)编译C文件。使用编译器选项“-k(保留汇编)-ss(交叉列表)-al(创建汇编列表)”。(3)观察编译之后生成的同名汇编文件。(4)利用生成的汇编函数代码创建汇编文件。(5)在C中将汇编函数原型声明为外部的,并删除为汇编函数原型创建的函数。
六、快速产生被C调用的汇编函数3.5.1集成开发环境简介一、CCS简介目前使用最广泛的DSP集成开发环境。可视化的代码编辑界面强大的程序调试、跟踪与分析工具完成代码编辑、编译、连接、调试和数据分析。两种工作模式:
软件仿真(Simulator):无需DSP硬件,可直接在计算机上对DSP的指令集和CPU进行模拟;硬件仿真(Emulator):支持在DSP芯片上在线实时运行和调试程序。3.5CCS集成开发环境3.5.1集成开发环境简介CCS的安装安装完毕,在桌面创建快捷图标2.Simulator模式配置单击“SetupCCStudioV3.3”
的图标,进入系统的配置环境二、CCS的安装与配置3.CCS的Emulator模式配置3.5.2DSP应用程序开发调试示例1目标代码的生成(1)新建工程1目标代码的生成(2)添加文件1目标代码的生成(3)生成可执行代码2目标代码的调试(1)装载文件2目标代码的调试(2)调试文件——①运行菜单2目标代码的调试(2)调试文件——③观察菜单2目标代码的调试(2)调试文件——④寄存器、存储器和观察窗口2目标代码的调试(2)调试文件——⑤设置断点⑥动画运行2目标代码的调试(2)调试文件——⑦设置探测点2目标代码的调试(2)调试文件——⑧关联文件2目标代码的调试(2)调试文件——⑧打开图形观察窗口
程序调试无误后,即可烧写到DSP的FLASH中,使DSP可以脱离仿真器独立运行
3.5.3程序烧写3.5.4通用扩展语言(GEL)简介GEL:通用扩展语言,高级脚本语言。.gel文件可扩展CCS的功能或者自动运行CCS中一系列常用命令。3.5.5DSP/BIOS工具简介BIOS:Built-InOperationSystem,嵌入式操作系统。DSP/BIOS是TI公司为其TMS320C6000、C5000TM和C28x系列DSP平台设计开发的一个尺寸可裁剪的实时多任务操作系统内核。3.6.1驱动程序开发包简介
为使DSP的CPU控制片内各功能模块正常工作,必须对其进行编程驱动,使系统时钟、片内外设等硬件资源按照各自功能和系统需求运行——应用(驱动)程序开发。3.6基于示例模版的驱动程序开发SPRC530:F2833x和F2823x头文件及片内外设应用示例代码质量高、内容全面;结构规范;开发周期短基本思路:(1)采用寄存器结构体和位定义形式定义各片内外设的寄存器(2)在编译时将其映射到DSP数据空间对应地址。3.6.2外设寄存器访问的硬件抽象层方法名称地址描述PLLSTS0x7011PLL状态寄存器Reserved0x7012~0x7019保留HISPCP0x701A高速外设时钟定标器LOSPCP0x701B低速外设时钟定标器PCLKCR00x701C外设时钟控制器寄存器0PCLKCR10x701D外设时钟控制器寄存器1LPMCR00x701E低功耗模式控制寄存器0Reserved0x701F保留PCLKCR30x7020外设时钟控制器寄存器3PLLCR0x7021PLL控制寄存器SCSR0x7022系统控制和状态寄存器WDCNTR0x7023看门狗计数器寄存器Reserved0x7024保留WDKEY0x7025看门狗复位密钥寄存器Reserved0x7026~0x7028保留WDCR0x0000-7029看门狗控制寄存器1寄存器结构体及其位定义第一步,为各寄存器定义一个位定义结构体变量structPLLCR_BITS{//位定义
Uint16DIV:4;//3:0为PLL模块设置时钟速率
Uint16rsvd1:12;//15:4保留};structPCLKCR0_BITS{//位描述
Uint16rsvd1:2;//1:0保留
Uint16TBCLKSYNC:1;//2EPWM模块TBCLK同步允许……Uint16ECANBENCLK:1;//15允许到eCAN-B的系统时钟}第二步,为每个寄存器定义一个共同体unionPLLCR_REG{Uint16all;structPLLCR_BITSbit;};unionPCLKCR0_REG{Uint16all;structPCLKCR0_BITSbit;};第三步,将某外设同类寄存器定义为一个结构体变量structSYS_CTRL_REGS{Uint16rsvd1;//0为从偶地址开始,保留一个单元
unionPLLSTS_REGPLLSTS;//1Uint16rsvd2[8];//2-9保留
unionHISPCP_REGHISPCP;//10:高速外设时钟定标器
union
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 文旅步道建设项目资金使用计划方案
- 初二【数学(北京版)】分式的基本性质(2) 教学设计
- 2026年法务合规高级专员招聘笔试试卷 招录15人
- 2026年传感智能化高级专家招聘笔试试卷 招录13人
- GBT 47874-2026 智慧园区建设与运维指南标准立项发展报告
- CN119437275A 基于改进螳螂优化算法的多目标路径规划方法及装置 (杭州电子科技大学)
- 2026 年南沙区疾控检验岗招聘考试招 4 人
- 2026年美妆行业发展行业新材料创新报告及未来五至十年行业发展趋势分析报告
- 2026年荧光增白剂行业发展行业报告
- 2026年口腔颌面外科学练习试卷(含答案及解析)
- 喷砂工考试题及答案
- 《石材加工企业职业病危害风险分级管控体系实施指南》
- 2026年黑龙江省法官逐级遴选考试题及答案
- 2026年秋季开学教师教师心理健康培训课件
- 2026重庆科瑞南海制药有限责任公司招聘15人笔试备考题库及答案详解
- 2026年秋季学期小学三年级信息科技教学计划(人教版2024上册)
- 2026-2030改性塑料产业市场发展分析及发展趋势与投资战略研究报告
- 2026小学教科版五年级科学上册全册课堂练习(分课编排附参考答案)
- 2026-2027学年人教版(新教材)小学美术五年级上册教学计划及进度表
- 2026年中医适宜技术三基培训题库(含答案)
- 制氮系统安装调试施工方案及技术措施
评论
0/150
提交评论