07 第七讲 TMS320F28x的C语言编程基础--力天手把手教你学DSP之入门篇
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
PAGE 1 : RAMM0 : origin = 0x000000, length = 0x000400 RAMM1 : origin = 0x000400, length = 0x000400 RAML1 : origin = 0x009000, length = 0x001000 RAMH0 : origin = 0x3F8000, length = 0x002000 }
主讲人:侯长波
版权:力天电子
www.LT430.com
关键字
cregister 使用: cregister 数据类型 变量名; 允许采用高级语言直接访问控制寄存器。 注意:在F281x的C语言中, cregister仅限于声明寄存器IER和 IFR。如 extern cregister volatile unsigned int IFR; extern cregister volatile unsigned int IER; interrupt 使用: interrupt void 中断函数名(void); 说明函数是中断函数,这样编译器会自动为中断函数产生保护现 场和恢复现场所需执行的操作。 举例:interrupt void XINT1_ISR(void); 版权:力天电子
主讲人:侯长波
版权:力天电子
www.LT430.com
CCS文件类型
文件类型 *.C:C源文件,项目管理器将对这一文件进行编译和链 接; *.ASM:汇编源文件,项目管理器将对这一文件进行汇 编和链接; *.OBJ:目标文件,每一个源文件都会生成一个相应的 目标文件,项目管理器将对这一文件进行链接; *.LIB:库文件,项目管理器将对这一文件进行链接; *.CMD:链接命令文件,项目管理器在链接各个文件时 根据此文件分配系统程序空间、数据空间; *.out:可执行文件,下载到RAM或Flash调试。
主讲人:侯长波
版权:力天电子
www.LT430.com
CODE_SECTION
CODE_SECTION用于为函数func在一个名为section name 的段中指 定空间。 C语言的标准用法是: # pragma CODE_SECTION(func,“section name”); 举例: # pragma CODE_SECTION(sum,“codeA”); int sum(int a,int b); void main(void) { int a=1,b=2,c; c=sum(a,b); } int sum(int a,int b) { return(a+b); }
主讲人:侯长波
版权:力天电子
www.LT430.com
举例
SECTIONS { .cinit : > FLASH, PAGE = 0 .text : > FLASH, PAGE = 0 .const : > FLASH, PAGE = 0 .econst : > FLASH, PAGE = 0 .stack : > RAMM0, PAGE = 1 .bss : > RAML1, PAGE = 1 .ebss : > RAML1, PAGE = 1 }
主讲人:侯长波
www.LT430.com
在C语言中嵌入汇编语言
TMS320C28x编译器允许在C程序中嵌入汇编指令,通 过下面声明实现: asm(“assembler text”); 其中assembler text指汇编代码。asm指令一般用来处理 C/C++语句较难实现的硬件操作。 举例: #define EINT asm(" clrc INTM") #define DINT asm(" setc INTM")
主讲人:侯长波
版权:力天电子
www.LT430.com
DATA_SECTION
DATA_SECTION用于为变量symbol在一个名为section name 的段 中指定空间。 C语言的标准用法是: # pragma DATA_SECTION(symbol,“section name”); 举例: # pragma DATA_SECTION(SysCtrlRegs,“dataA”); volatile struct SYS_CTRL_REGS SysCtrlRegs;
力天手把手教你学DSP ——之F2812入门篇
主 讲: 侯长波 策 划:张 勇 学习板:LT-DSP2812
力天电子版权所有 技术交流QQ群:31646346 www.LT430.com
第七讲 TMS320C28x的 C语言编程基础
数据类型 关键字 存储器模型 pragma伪指令 CMD文件 外设寄存器定义 CCS使用
主讲人:侯长波
版权:力天电子
www.LT430.com
ห้องสมุดไป่ตู้
数据类型
主讲人:侯长波
版权:力天电子
www.LT430.com
关键字
const 使用:const 数据类型 变量名; 优化存储器的分配,表示变量的内容是常数,不会改 变。 举例:const char tab[1024]={显示数据}; volatile 使用: volatile 数据类型 变量名; 用于声明存储器或外设寄存器,以此来说明所定义的变 量是“可变的”,是可以被DSP的其他硬件修改的,而不 仅仅由C程序本身修改。 举例:volatile struct SYS_CTRL_REGS SysCtrlRegs;
主讲人:侯长波
版权:力天电子
www.LT430.com
举例
MEMORY { PAGE 0 : FLASH BEGIN ROM RESET RAML0
: origin = 0x3D8000, length = 0x01FF80 /* FLASH */ : origin = 0x3F7FF6, length = 0x000002 : origin = 0x3FF000, length = 0x000FC0 : origin = 0x3FFFC0, length = 0x000002 : origin = 0x008000, length = 0x001000 /* RAM M0 */ /* RAM M1 */ /* RAM L1 */ /* RAM H0 */
主讲人:侯长波
版权:力天电子
www.LT430.com
SECTIONS伪指令
作用:分配段到存储空间,也就是指定段的实际硬件地址空间。 语法如下: SECTIONS { name 0 : > 存储空间名称, PAGE = 页数 name n : > 存储空间名称, PAGE = 页数 } name :编译器输出段的名称。 存储空间名称:采用MEMORY伪指令指示的存储器空间名称。 PAGE :前面存储器空间名称对应的存储器页。
主讲人:侯长波
版权:力天电子
www.LT430.com
未初始化段
非初始化段: 在存储器(通常是RAM)中保留空间,程序在运行 时可在此空间创建和存储变量。C编译器创建如下非初始化块: .bss段:为全局和静态变量保留空间。程序引导过程中,C引导程 序会将ROM中的.cint块中的数据复制到.bss块中; .ebss段:为用far声明的或大存储器模式下的全局和静态变量保留 空间。程序引导过程中,C引导程序会将ROM中的.cint块中的数据 复制到.bss块中; .stack段:为C系统的堆栈分配的空间,用于函数调用时传递参数 以及为局部变量分配空间; .sysmem段:为动态存储器分配保留空间,如果未用到malloc函 数,则该块的空间为0; .esysmem段:为动态存储器分配保留空间,如果未用到far malloc 函数,则该块的空间为0。 版权:力天电子
www.LT430.com
外设寄存器的定义
第一步:采用结构体、共用体、位域结构体定义寄存器 变量。 第二步:通过pragma伪指令将寄存器变量分配到数据 段。 第三步:通过MEMORY伪指令指示寄存器的实际硬件 空间。 第四步:通过SECTIONS伪指令将寄存器数据段分配到 实际硬件空间。
主讲人:侯长波
版权:力天电子
www.LT430.com
外设寄存器的定义
传统方法: #define CPUTIMER0 (volatile unsigned long *) 0x0C00 缺点: 不便于对寄存器的值进行位操作; 无法单独查看寄存器的某一位。
主讲人:侯长波
版权:力天电子
主讲人:侯长波
版权:力天电子
www.LT430.com
C28x存储器模型
存储器模型: TMS320C28x将存储器分成程序和数据两 个线性块。 程序存储器:包含可执行代码,初始化数据和开关量; 数据存储器:包含外部变量、静态变量和系统堆栈。 备注:编译器产生可重定位的代码,允许链接器将代码 和数据分配到适当的存储器空间,而链接器则根据链接 命令文件将代码和数据分配到目标存储器。 编译器产生好几个可重定位的代码和数据块,称为 sections(段),有两种基本的sections类型,为初始化 段和非初始化段。
主讲人:侯长波
www.LT430.com
数据块映射表
主讲人:侯长波
版权:力天电子
www.LT430.com
pragma伪指令
通过pragma伪指令告诉编译器如何对待特定的函数、对象或代码 段。 TMS320C28x C/C++编译器支持如下形式的pragma伪指令: CODE_SECTION(func,“section name”); DATA_SECTION(symbol,“section name”); 注意:func和symbol必须在函数外声明或定义。同时, pragma伪 指令也必须在函数外,且位于声明、定义或引用func和symbol之 前,否则,编译器会给出警告信息。
主讲人:侯长波
版权:力天电子
www.LT430.com
MEMORY伪指令
作用:指示存储空间。 语法如下: MEMORY { PAGE 0 : name 0[(attr)]:origin = constant, length = constant PAGE n : name n[(attr)]:origin = constant, length = constant } PAGE:用来指示存储空间的关键字。 PAGE n的最大值为255。 name:代表某一属性和地址范围的存储空间名称。长度可以是1~8个字 符,在同一页内名称不能相同,不同业内名称可以相同。 attr:用来规定存储空间的属性,共有四种属性:R-只读、W-只写、X-该 空间包含可执行代码、I-该空间可以被初始化。实际使用,常忽略此选 项。 orgin:用来定义存储空间起始地址的关键字。 length:用来定义存储空间长度的关键字。
主讲人:侯长波
版权:力天电子
主讲人:侯长波
版权:力天电子
www.LT430.com
CMD文件
链接命令文件(Link Command Files),以后缀.cmd结 尾,简称CMD文件。 CMD文件的两大功能是指示存储空间和分配段到存储 空间。 在编写CMD文件时,主要采用MEMORY和SECTIONS 两条伪指令。 在281x调试时,可以将程序代码链接到Flash或者 RAM,因此对应两种CMD文件。
主讲人:侯长波
版权:力天电子
www.LT430.com
初始化段
初始化段: 包含数据表和可执行代码。C编译器创建如 下初始化段: .text段:包含所有可执行代码和常量; .cint段:已初始化的变量和常量表(用于C程序); .pint段:已初始化的变量和常量表(用于C++程序); .const段:包含字符串常数以及用const声明的全局和静 态变量; .econst段:同.const段,但用于far const声明的变量或编 译器采用大存储器模式时; .switch段:为开关语句(switch)建立的数据表。