DSP教程6C语言程序设计.pptx
- 文档编号:1369876
- 上传时间:2022-10-21
- 格式:PPTX
- 页数:58
- 大小:4.25MB
DSP教程6C语言程序设计.pptx
《DSP教程6C语言程序设计.pptx》由会员分享,可在线阅读,更多相关《DSP教程6C语言程序设计.pptx(58页珍藏版)》请在冰豆网上搜索。
,1,嵌入式DSP软件开发,第六章:
C语言程序设计目标:
本章旨在向学员介绍C语言的编程方法,内容如下:
1)C55xC语言概况,2)C55xC语言编程的基础知识3)C55xC语言与汇编语言的混合编程2,时间:
3学时教学方法:
讲授PPT+练习,3,6.1C55xC语言概述,汇编语言依赖于计算机硬件,程序的可读性和可移植性比较差。
一般高级语言具有很好的可移植性,但是难以实现汇编语言的某些功能(如对内存地址的操作、位操作等)。
C语言作为一种高级语言,既可以访问物理地址又可以进行位操作,能直接对硬件进行操作,适合用作DSP开发语言。
4,6.1.1C语言概述,C语言具有如下基本特点:
语言简洁、紧凑,使用方便、灵活运算符丰富,表达式类型多样化数据结构类型丰富,具有结构化的控制语句,语法限制不太严格,程序设计自由度大,C语言允许访问物理地址,能进行位操作,能实现汇编语言,的大部分功能,能直接对硬件进行操作,5,6.1.2C55xC语言概况这些库函数包括标准输入输出、串操作、动态内存分配、数据转换、三角函数、指数函数、双曲函数等,但是不包含信号处理函数,因为它们涉及到目标系统的具体特性,C55xC编译器全面支持ANSIC语言标准,能够把按照标准ANSIC规范编写的源程序进行全面优化,编译成C55x汇编语言源程序。
C55xC编译器工具拥有完整的实时运行库,所有的库函数均符合ANSI库标准。
C55xC编译器输出文件的特性。
C55xC编译器生成的汇编语言便于查看,使用户能够看到产生自C源程序的代码。
COFF文件允许用户在链接时定义自己的系统存储器配置,这使得用户可以把代码和数据链接进特定的内存区域,以最大限度地提高程序性能。
COFF文件支持源程序级的调试。
6,类型带符号特长整型无符号特长整型枚举浮点双精度长双精度,长度(位)404016323232,内容二进制补码二进制数二进制补码32位IEEE32位IEEE32位IEEE,最小值-5.49756E+110-327681.18E-381.18E-381.18E-38,最大值5.49756E+111.09951E+12327673.40E+383.40E+383.40E+38,数据指针(小存储器模式)数据指针(大存储器模式)程序指针,162324,二进制数二进制数二进制数,000,0xFFFF0x7FFFFF0xFFFFFF,6.2C55xC语言编程基础6.2.1数据类型表61C55xC语言支持的数据类型,7,6.2.1数据类型表61C55xC语言支持的数据类型(续),类型字符型、带符号字符型无符号字符型短整型、带符号短整型无符号短整型整型、带符号整型无符号整型长整型、带符号长整型无符号长整型,长度(位)1616161616163232,内容ASCII码ASCII码二进制补码二进制数二进制补码二进制数二进制补码二进制数,最小值-327680-327680-327680-21474836480,最大值32767655353276765535327676553521474836474294967295,8,6.2.1数据类型,定义各种数据类型时应注意如下规则:
避免设int和long为相同大小,对定点算法(特别是乘法)尽量使用int数据类型。
用long类型作乘法操作数会导致调用运行时间库(run-timelibrary)的程序使用int或unsignedint类型而非long类型来循环计数避免设char为8位或long为64位,最好使用int类型作循环指数变量和其它位数不太重要时的整型变量,因为int是对目标系统操作最高效的整数类型而不管芯片结构如何,6.2.2关键字1.const,C55x,C编译器支持标准C语言的const关键字。
将这个关键字使用到对任意变量或数组的定义上可以确保它们的值不改变。
如果定义一个对象为const,那么const段就会为该对象分配存储空间。
使用const关键字可以定义大常数表并将它们分配到系统ROM中。
9,6.2.2关键字2.ioport,C55x,C编译器对标准C语言进行了扩展,增加了ioport关键字,来支持I/O寻址模式ioport类型限定词可以和标准类型(数组、结构体、共用体和枚举)一起使用可以和const及volatile一起使用。
当和数组一起使用时,ioport限制的是数组单元而非数组类型本身。
ioport可以单独使用,这种情况下int限定词就是默认的ioport类型限定词只能用于全局或静态变量。
局部变量不能用ioport限制,除非变量是个指针10,6.2.2关键字例61ioport关键字的使用,ioportintkvoidfoo(void)ioportintiioportint*j,;/*正确*/;/*错误*/;/*正确*/,11,6.2.2关键字3.interrupt,C55x,C编译器对标准C语言进行了扩展,增加了interrupt关,键字,来指定某个函数为中断函数。
12,13,6.2.2关键字4.onchipOnchip关键字声明一个特殊指针,在链接时这些数据必须被链接到DSP片上存储器,否则会导致总线错误。
例:
onchipintx100onchipint*p,;/*数组声明*/;/*指针声明*/,14,6.2.2关键字,5.volatile,在任何情况下,优化器会通过分析数据流来避免存储器访问。
如果程序依靠存储器访问,则必须使用volatile关键字来指明这些访问。
15,6.2.3寄存器变量和参数,寄存器变量就是用register关键字声明的变量。
根据是否使用优化器,C编译器对寄存器变量采用不同的处理方式。
编译器会尽量分配好所声明的寄存器变量。
整型、浮点型和指针类型对象都可以声明为寄存器变量,而其,当不使用优化器进行编译时,编译器将使用register关键字的变量分配到寄存器中,它类型对象不行。
如果编译器运行超出了合适的寄存器,它将通过移动寄存器内容到存储器来释放寄存器。
如果定义了太多的寄存器变量,则会限制编译器用来存放临时表达式结果的寄存器数目。
这个限制会引起过量的从寄存器到存储器的移动动作。
当使用优化器进行编译时,编译器忽略任何寄存器声明,通过一种能够最有效地使用寄存器的代价算法,把寄存器分配给变量和临时量。
16,6.2.4asm指令asm指令可以直接将C55x汇编语言指令嵌入到编译器的汇编语言输出中,就好像是对叫做asm的函数的调用。
指令格式:
asm(“assemblertext”);例:
asm(“nop”);,插入一条汇编指令nop,17,6.2.5Pragma指令Pragma指令告诉编译器的预处理器如何处理函数。
必须在函数体外确定pragma,且必须出现在任何声明、定义或对函数和符号引用之前。
否则,编译器会输出警告。
C55x,C编译器支持如下pragma指令:
CODE_SECTIONC54X_CALLC54X_FAR_CALLDATA_ALIGNDATA_SECTIONFUNC_CANNOT_INLINEFUNC_EXT_CALLED,FUNC_IS_PUREFUNC_IS_SYSTEMFUNC_NEVER_RETURNSFUNC_NO_GLOBAL_ASGFUNC_NO_IND_ASGMUST_ITERATEUNROLL,18,6.2.6标准ANSIC语言模式的改变(pk、pr和ps选项),编译源代码有如下的模式:
NormalANSI模式K&RC模式,宽松ANSI模式严格ANSI模式,19,6.2.6标准ANSIC语言模式的改变(pk、pr和ps选项),1.NormalANSI模式(默认),编译器默认的模式是NormalANSI模式,在此模式下:
大多数违反ANSI标准的语句都报错违反严格ANSI标准的语句给出警告语言扩展的语句都是允许的,6.2.6标准ANSIC语言模式的改变(pk、pr和ps选项)2.兼容K&RC(-pk选项),C编译器对以前C标准代码的编译,主要用来简化用C55xANSI过程.,(pk)选项,用来改变语言的段规则来兼,编译器有一个K&R容老版本的代码.,总体说来,pk选项使编译要求比ANSI,C更加容易达到.,同时,该选项支持ANSI,C语言的新功能,如函数原型、枚举、,初始化和预处理器结构。
20,21,6.2.6标准ANSIC语言模式的改变(pk、pr和ps选项),3.严格ANSI模式(ps选项),使用-ps选项可以使编译器工作在严格ANSI模式,这种模式下:
会在违反ANSI规则的时候报错,同时可能影响程序严格形式的语言扩展不可用,这些语言扩展包括inline和asm关键字,22,6.2.6标准ANSIC语言模式的改变(pk、pr和ps选项),4.宽松ANSI模式(pr选项),使用-pr选项可以使编译器工作在宽松ANSI模式中忽略违反严格的ANSI标准的情况下而不发送警告消息(普通ANSI模式中会发送)或错误消息(严格ANSI模式中会发送),编译接受对ANSIC标准的扩展,甚至是和ANSIC冲突的时候。
23,6.2.7存储器模式,C编译器将存储器当作一个由代码子模块和数据子模块组成的线性模块。
每个由C程序生成的代码子模块或数据子模块被放到各自的连续存储空间中。
编译器认为目标存储器的全部24位地址都有效。
编译器支持两种存储器模型:
小存储模式和大存储器模式。
说明:
1.两种存储模式的数据在存储器中的放置和访问不同。
大存储器模式不限制.bss段的大小,对于全局变量和静态变量来说,具有无限的空间。
24,6.2.8存储器分配,1.C编译器生成的段,C编译器生成的段有两种基本的类型,即初始化段和未初始化段初始化段包含初始化数据表格和常数、const定义的字符串常量和数据、Switch语句所用表和可执行代码。
未初始化段保留了存储器空间,一段程序可以在运行期间使用这个空间来生成和存储变量:
25,6.2.8存储器分配,2.堆栈,在C编译器中,使用堆栈来放置局部变量、给函数传递参数、保存处理器状态,堆栈被放在存储器的一个连续块中,并从高地址到低地址存放数据。
编译器用堆栈指针(SP)来管理堆栈。
C55x支持第二系统堆栈,编译器使用第二堆栈指针SSP来管理第二系统堆栈。
系统堆栈和第二系统堆栈的大小都由链接器设置。
链接器会生成全局符号_STACK_SIZE和_SYSSTACK_SIZE,并给它们指定一个等于各自堆栈大小的值。
两种默认堆栈大小都是1000字节。
在链接时间内,通过链接器命令中的-stack或-sysstack选项可以改变堆栈大小。
26,6.2.8存储器分配,3.动态存储器分配,为变量动态分配存储器的函数:
malloc、calloc和realloc,27,6.2.9中断处理,1.写中断程序时,需要注意以下几点:
对所有的中断屏蔽都要进行处理(通过IER0寄存器)。
中断处理程序不能有参数,即使声明了参数也会被忽略中断处理程序不能被普通C代码调用。
中断处理程序可以处理单个中断或多个中断。
为了将中断程序和中断联系起来,需要将分支程序放在合适的中断向量中。
在汇编语言中,需要在中断程序名前加下划线。
分配堆栈到偶地址。
6.2.9中断处理2.C中断程序的使用通过interrupt关键字可以用C函数直接处理中断。
interrupt关键字可以和定义为返回void并不含参数的函数一,起使用。
中断函数体可以有局部变量,可以自由使用堆栈。
28,29,6.2.9中断处理,3.保存中断入口的现场信息,中断程序所用到的所有寄存器(包括状态寄存器)都必须被保存,30,6.2.10运行时间支持算法及转换程序,运动时间支持库包含了众多的汇编语言程序,用来为C55x指令集并不支持的C运算提供算法和转换功能这些程序包括整数除法、整数取模和浮点运算,31,6.2.11系统初始化,在运行C程序之前必须先建立C运行环境,该工作由被称为_c
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- DSP 教程 语言程序设计
![提示](https://static.bdocx.com/images/bang_tan.gif)