数字信号处理课件:第4章 C语言程序设计

上传人:s9****2 文档编号:570143585 上传时间:2024-08-02 格式:PPT 页数:32 大小:156.50KB
返回 下载 相关 举报
数字信号处理课件:第4章 C语言程序设计_第1页
第1页 / 共32页
数字信号处理课件:第4章 C语言程序设计_第2页
第2页 / 共32页
数字信号处理课件:第4章 C语言程序设计_第3页
第3页 / 共32页
数字信号处理课件:第4章 C语言程序设计_第4页
第4页 / 共32页
数字信号处理课件:第4章 C语言程序设计_第5页
第5页 / 共32页
点击查看更多>>
资源描述

《数字信号处理课件:第4章 C语言程序设计》由会员分享,可在线阅读,更多相关《数字信号处理课件:第4章 C语言程序设计(32页珍藏版)》请在金锄头文库上搜索。

1、数据类型数据类型lC55x C语言支持的数据类型语言支持的数据类型:类型长度(位)内容最小值最大值字符型、带符号字符型16ASCII码-32 76832 767无符号字符型16ASCII码065 535短整型、带符号短整型16二进制补码-32 76832 767无符号短整型16二进制数065 535整型、带符号整型16二进制补码-32 76832 767无符号整型16二进制数065 535长整型、带符号长整型32二进制补码-2 147 483 6482 147 483 647无符号长整型32二进制数04 294 967 295类型长度(位)内容最小值最大值带符号特长整型40二进制补码-5.49

2、756E+115.49756E+11无符号特长整型40二进制数01.09951E+12枚举16二进制补码-32 76832 767浮点3232位IEEE 1.18E-383.40E+38双精度3232位IEEE1.18E-383.40E+38长双精度3232位IEEE1.18E-383.40E+38数据指针(小存储器模式)16二进制数00xFFFF数据指针(大存储器模式)23二进制数00x7FFFFF程序指针24二进制数00xFFFFFF关键字关键字1. const lC55x C编译器支持标准编译器支持标准C语言的语言的const关键字。关键字。l将这个关键字使用到对任意变量或数组的定义上可

3、将这个关键字使用到对任意变量或数组的定义上可以确保它们的值不改变。以确保它们的值不改变。l如果定义一个对象为如果定义一个对象为const,那么,那么const段就会为该段就会为该对象分配存储空间。使用对象分配存储空间。使用const关键字可以定义大关键字可以定义大常数表并将它们分配到系统常数表并将它们分配到系统ROM中。中。2. ioportlC55x C编译器对标准编译器对标准C语言进行了扩展,增加了语言进行了扩展,增加了ioport关键字来支持关键字来支持I/O寻址模式寻址模式uioport类型限定词可以和标准类型(数组、结构类型限定词可以和标准类型(数组、结构体、共用体和枚举)一起使用体

4、、共用体和枚举)一起使用u可以和可以和const及及volatile一起使用。当和数组一起一起使用。当和数组一起使用时,使用时,ioport限制的是数组单元而非数组类型本限制的是数组单元而非数组类型本身。身。ioport可以单独使用,这种情况下可以单独使用,这种情况下int限定词限定词就是默认的就是默认的lioport类型限定词只能用于全局或静态变量。局部变类型限定词只能用于全局或静态变量。局部变量不能用量不能用ioport限制,除非变量是个指针限制,除非变量是个指针3. interruptlC55x C编译器对标准编译器对标准C语言进行了扩展,增加了语言进行了扩展,增加了interrupt关

5、键字,来指定某个函数为中断函数。关键字,来指定某个函数为中断函数。4. onchiplOnchip关键字声明一个特殊指针,该指针所指向关键字声明一个特殊指针,该指针所指向的数据可用作双的数据可用作双MAC指令的操作数。在链接时这些指令的操作数。在链接时这些数据必须被链接到数据必须被链接到DSP片上存储器,否则会导致总片上存储器,否则会导致总线错误。线错误。例,例,onchip int x100; /* 数组声明数组声明 */onchip int *p; /* 指针声明指针声明 */存储器分配存储器分配1. C编译器生成的段编译器生成的段lC编译器生成的段有两种基本的类型,即初始化段和未初始编译

6、器生成的段有两种基本的类型,即初始化段和未初始化段化段l初始化段有:初始化段有:u.cinit段,包含初始化数据表格和常数段,包含初始化数据表格和常数u.pinit段,包含实时运行时调用的数据表格段,包含实时运行时调用的数据表格u.const段,包含用段,包含用const定义(不能同时被定义(不能同时被volatile定义)的字符串定义)的字符串常量和数据常量和数据u.switch段,包含段,包含switch语句所用表语句所用表u.text段,包含所有可执行代码段,包含所有可执行代码汇编器生成了汇编器生成了.data段,但段,但C编译编译器并不使用这个段。器并不使用这个段。l未初始化段保留了存

7、储器空间未初始化段保留了存储器空间,一段程序可以在运行期一段程序可以在运行期间使用这个空间来生成和存储变量:间使用这个空间来生成和存储变量:u.bss段,为全局和静态变量保留了空间。在启动和段,为全局和静态变量保留了空间。在启动和装载的时候,装载的时候,C启动程序或装载程序从启动程序或装载程序从.cinit段段(通常在(通常在ROM中)复制数据并用这些数据来初始化中)复制数据并用这些数据来初始化.bss段中的变量段中的变量u.stack段,为段,为C系统堆栈分配存储地址。这个存储系统堆栈分配存储地址。这个存储地址用来传递变量和局部存储地址用来传递变量和局部存储u.sysstack段,为第二系统

8、堆栈分配存储地址段,为第二系统堆栈分配存储地址u.sysmem段,为动态存储分配保留空间。这个空间被段,为动态存储分配保留空间。这个空间被malloc、calloc和和realloc函数调用。如果函数调用。如果C程序不使用程序不使用这些函数,编译器就不会创建这些函数,编译器就不会创建.sysmem段段u.cio段,支持段,支持C I/O。这个空间用来作为标签为。这个空间用来作为标签为_CIOBUF_缓冲区。当任何类型的缓冲区。当任何类型的C I/O被执行(如被执行(如printf和和scanf),就会建立缓冲区。缓冲区包含一个对),就会建立缓冲区。缓冲区包含一个对stream I/O类型的内部

9、类型的内部C I/O命令(和需要的参数)及命令(和需要的参数)及从从C I/O命令返回的数据。命令返回的数据。.cio段必须放在链接器命令文段必须放在链接器命令文件中才能使用件中才能使用C I/O段及其存储位置段及其存储位置2. 堆栈堆栈l在在C编译器中,使用堆栈来放置局部变量、传递参数给函编译器中,使用堆栈来放置局部变量、传递参数给函数、保存处理器状态,堆栈被放在存储器的一个连续块中,数、保存处理器状态,堆栈被放在存储器的一个连续块中,并从高地址到低地址存放数据。并从高地址到低地址存放数据。l编译器用堆栈指针(编译器用堆栈指针(SP)来管理堆栈。)来管理堆栈。l代码不会检查是否在运行时间内堆

10、栈出现溢出,必须为堆代码不会检查是否在运行时间内堆栈出现溢出,必须为堆栈分配合适的存储空间。栈分配合适的存储空间。lC55x支持第二系统堆栈,编译器使用第二堆栈指针支持第二系统堆栈,编译器使用第二堆栈指针SSP来管理第二系统堆栈。来管理第二系统堆栈。l系统堆栈和第二系统堆栈的大小都由链接器设置。链接器系统堆栈和第二系统堆栈的大小都由链接器设置。链接器会生成全局符号会生成全局符号_STACK_SIZE和和_SYSSTACK_SIZE,并给它,并给它们指定一个等于各自堆栈大小的值。两种默认堆栈大小都们指定一个等于各自堆栈大小的值。两种默认堆栈大小都是是1000字节。在链接时间内,通过链接器命令中的

11、字节。在链接时间内,通过链接器命令中的-stack或或-sysstack选项可以改变堆栈大小。选项可以改变堆栈大小。3.动态存储器分配动态存储器分配l由编译器提供的运行时间支持库包含几个在运行时间内为由编译器提供的运行时间支持库包含几个在运行时间内为变量动态分配存储器的函数(变量动态分配存储器的函数(malloc、calloc和和realloc)l存储器被从一个在存储器被从一个在.sysmen段定义的全局池(段定义的全局池(pool)或堆)或堆(heap)中分配出来。可以通过)中分配出来。可以通过-heap size选项和链接选项和链接器命令来设置器命令来设置.sysmem段的大小。链接器会生

12、成一个全局段的大小。链接器会生成一个全局符号符号_SYS MEM _SIZE,并为它指定等于,并为它指定等于heap字节数的字节数的值。默认大小为值。默认大小为2000字节字节l动态分配的对象必须用指针寻址。为了在动态分配的对象必须用指针寻址。为了在.bss段中保留空段中保留空间,可以通过从堆中定义大数组来实现,而不是将其定义间,可以通过从堆中定义大数组来实现,而不是将其定义为全局或静态变量为全局或静态变量l例如,不用如下定义:例如,不用如下定义:struct big table100;而使用指针并调用而使用指针并调用malloc函数:函数:struct big *table;table=(s

13、truct big*)malloc(100*sizeof(struct big);存储器模式存储器模式lC编译器将存储器当作一个由代码子模块和数据子模块编译器将存储器当作一个由代码子模块和数据子模块组成的线性模块。每个由组成的线性模块。每个由C程序生成的代码子模块或数程序生成的代码子模块或数据子模块被放到各自的连续存储空间中。编译器认为据子模块被放到各自的连续存储空间中。编译器认为目标存储器的全部目标存储器的全部24位地址都有效。位地址都有效。l编译器支持两种存储器模型:编译器支持两种存储器模型:u小存储模式和大存储器模式。小存储模式和大存储器模式。u两种存储模式的数据在存储器中的放置和访问不

14、同。两种存储模式的数据在存储器中的放置和访问不同。1.小存储器模式(默认模式)小存储器模式(默认模式)l使用小存储器模式将得到比使用大存储模式时更少的使用小存储器模式将得到比使用大存储模式时更少的代码和数据。代码和数据。l 在小存储器模式中,在单页(在小存储器模式中,在单页(64KB)存储器内的以)存储器内的以下段必须都分配合适:下段必须都分配合适:u.bss和和.data段(所有静态和全局数据)。段(所有静态和全局数据)。u.stack和和sysstack段(第一和第二系统堆栈)。段(第一和第二系统堆栈)。u.sysmem段(动态存储空间)。段(动态存储空间)。u.const段。段。l在小存

15、储器模式中,对在小存储器模式中,对.text段(代码)、段(代码)、.switch段段(switch语句)和语句)和.cinit段(变量初始化)的大小和段(变量初始化)的大小和位置没有限制。位置没有限制。l小存储器模式下编译器使用小存储器模式下编译器使用16位数据指针来访问数据。位数据指针来访问数据。XARn寄存器的高寄存器的高7位用来设置指向包含位用来设置指向包含.bss段的存储段的存储页。在程序执行过程中它们仍指向原来那些值。页。在程序执行过程中它们仍指向原来那些值。2.大存储器模式大存储器模式l大存储器模式支持不严格的数据放置。用大存储器模式支持不严格的数据放置。用-ml shell选选

16、项就可以应用该模式。项就可以应用该模式。l在大存储器模式下,数据指针为在大存储器模式下,数据指针为23位,在存储器中占位,在存储器中占2字空间。字空间。.stack和和.sysstack段必须在同一页上。段必须在同一页上。 l在大存储器模式下编译代码时,必须和在大存储器模式下编译代码时,必须和rts55x.lib运行运行时间库链接。时间库链接。应用程序中的所有文件都必须使用相同应用程序中的所有文件都必须使用相同的存储器模式。的存储器模式。l链接器不允许同时存在大存储器模式和小存储器模式。链接器不允许同时存在大存储器模式和小存储器模式。Pragma指令lPragma指令告诉编译器的预处理器如何处

17、理函数。指令告诉编译器的预处理器如何处理函数。l必须在函数体外确定必须在函数体外确定pragma,且必须出现在任何声,且必须出现在任何声明、定义或对函数和符号引用之前。否则,编译器会明、定义或对函数和符号引用之前。否则,编译器会输出警告。输出警告。l C55x C编译器支持如下编译器支持如下pragma指令指令:CODE_SECTIONC54X_CALLC54X_FAR_CALLDATA_ALIGNDATA_SECTIONFUNC_CANNOT_INLINEFUNC_EXT_CALLEDFUNC_IS_PUREFUNC_IS_SYSTEMFUNC_NEVER_RETURNSFUNC_NO_GL

18、OBAL_ASGFUNC_NO_IND_ASGMUST_ITERATEUNROLLl CODE_SECTION指令及其用法指令及其用法u语法:语法:#pragma CODE_SECTION(func_name, ”section_name”)u作用:作用: 把把C函数函数func_name的代码配置到由的代码配置到由section_name定义的程序段中定义的程序段中u语法:语法: #pragma DATA_SECTION(var_name,”section_name”)u作用:作用: var_name是包含在是包含在C函数内的变量名称,该函数内的变量名称,该指令将数据指令将数据var_nam

19、e配置到由配置到由section_name定定义的数据段中义的数据段中l DATA_SECTION指令及其用法指令及其用法n#pragma DATA_SECTION(S,”newsect”);nUnsigned int s100;nVoid main(void)nn n C和汇编语言混合编程概述和汇编语言混合编程概述l采用汇编语言编程能够针对所采用采用汇编语言编程能够针对所采用DSP芯片的具体特芯片的具体特点,所编程序执行效率高。但是,不同公司的点,所编程序执行效率高。但是,不同公司的DSP芯芯片所提供的汇编语言各不相同,即使是同一公司的芯片所提供的汇编语言各不相同,即使是同一公司的芯片,由于

20、芯片的类型不同,其汇编语言也不尽相同。片,由于芯片的类型不同,其汇编语言也不尽相同。用汇编语言开发用汇编语言开发DSP产品周期很长,软件修改、升级、产品周期很长,软件修改、升级、移植都非常困难。移植都非常困难。l采用采用C语言编程具有开发效率高的优点,有助于提高语言编程具有开发效率高的优点,有助于提高产品开发速度,程序修改、升级和移植也很方便。但产品开发速度,程序修改、升级和移植也很方便。但是,与汇编语言编写的程序相比,是,与汇编语言编写的程序相比,C语言的执行效率语言的执行效率较低,通常不能满足实时性要求,且无法控制某些硬较低,通常不能满足实时性要求,且无法控制某些硬件。件。1. 在在C代码

21、中访问汇编语言函数代码中访问汇编语言函数l在定义汇编函数时,需要在函数名前加下划线在定义汇编函数时,需要在函数名前加下划线“_”来来让编译器识别。让编译器识别。从从C代码中访问汇编语言函数。代码中访问汇编语言函数。(a)C程序:程序:/*声明汇编函数声明汇编函数*/extern int asmfunc(int,int *);int gvar ;/*定义全局变量定义全局变量*/main()int i;i=asmfunc(i,&gvar) ;/*调用函数调用函数*/(b)汇编程序)汇编程序:_asmfunc:ADD *AR0,T0,T0 ; T0+gvar=i,i=T0 RET;2. 在在C代码中

22、访问汇编语言变量代码中访问汇编语言变量l访问访问.bss段或段或.usect段中没有初始化的变量:段中没有初始化的变量:u使用使用.bss或或.usect指令来定义变量指令来定义变量u使用使用.global指令来定义为外部变量指令来定义为外部变量u在汇编语言中的变量前加下划线在汇编语言中的变量前加下划线“_”u在在C代码中声明变量为外部变量并正常地访问它代码中声明变量为外部变量并正常地访问它从程序中访问定义在从程序中访问定义在.bss段的变量段的变量(a)C程序:程序:extern int var;/* 外部变量外部变量 */var = 1;/* 使用变量使用变量 */(b)汇编语言程序:)汇

23、编语言程序:.bss var,1;定义变量定义变量.gloabal bar;声明变量为外部变量声明变量为外部变量l当变量不是被存放在当变量不是被存放在.bss段时,比如用汇编语言定义的段时,比如用汇编语言定义的查找表并不希望放在查找表并不希望放在RAM中,这时应该定义一个指向该中,这时应该定义一个指向该变量的指针并从变量的指针并从C语言中对其间接访问。语言中对其间接访问。u首先,要定义变量首先,要定义变量u其次,声明一个指向该变量起始地址的全局指针,这其次,声明一个指向该变量起始地址的全局指针,这个变量就可以被链接到存储空间的任何地方个变量就可以被链接到存储空间的任何地方u最后,在程序中访问时

24、,必须先声明该对象为最后,在程序中访问时,必须先声明该对象为extern型,并且不能在其名称前面加下划线,然后就型,并且不能在其名称前面加下划线,然后就可以正常访问它了可以正常访问它了在在C代码中访问没有在代码中访问没有在 .bss段中声明的变量。段中声明的变量。(a)C程序:程序:extern float sine ;/*这就是对象这就是对象*/float *sine_p=sine;/*声明指针指向它声明指针指向它*/f=sine_p2;/*正常访问该对象正常访问该对象*/(b)汇编程序:)汇编程序:.global _sine;声明变量为外部变量声明变量为外部变量.sect ”sine_ta

25、b” ;创建单独的段创建单独的段_sine: ;表从此开始表从此开始.float 0.0.float 0.015987.float 0.022145 3. 在在C语言中访问汇编语言常数语言中访问汇编语言常数l通过使用通过使用.set和和.global指令可以定义汇编语言的全局指令可以定义汇编语言的全局常数,也可以在链接命令文件中使用链接分配语句定常数,也可以在链接命令文件中使用链接分配语句定义汇编语言常数。在义汇编语言常数。在C语言中只有用特殊的运算符才能语言中只有用特殊的运算符才能访问这些常数。访问这些常数。l用用C或汇编语言定义的普通变量,其符号列表包含变量或汇编语言定义的普通变量,其符号

26、列表包含变量值的地址。但对汇编常数,符号表还包含常数值。汇值的地址。但对汇编常数,符号表还包含常数值。汇编器不能分辨符号表中哪些是值或是地址。编器不能分辨符号表中哪些是值或是地址。l如果通过名字访问一个汇编器(或链接器)常数,编如果通过名字访问一个汇编器(或链接器)常数,编译器会在符号列表的地址中取值。为了防止这种情况,译器会在符号列表的地址中取值。为了防止这种情况,必须使用必须使用&运算符来取值。运算符来取值。l如果如果x是一个汇编语言常数,它在是一个汇编语言常数,它在C代码中的值就是代码中的值就是&x。,在,在C代码中访问汇编语言常数。代码中访问汇编语言常数。(a)语言程序:)语言程序:e

27、xtern int table_size;/* 声明声明table_size为外部参数为外部参数*/#define TABLE_SIZE (int)(&table_size)For(i=0;iTABLE_SIZE;+i)/*象使用普通符号一样使用该常数象使用普通符号一样使用该常数*/(b)汇编语言程序:)汇编语言程序:_table_size .set 10000;定义常量定义常量.global _table_size;定义该常量为全局常量定义该常量为全局常量4嵌入汇编语言嵌入汇编语言l在在C程序中,可以使用程序中,可以使用asm语句来插入单行汇编语言到编语句来插入单行汇编语言到编译器创建的汇编

28、语言文件中。多个译器创建的汇编语言文件中。多个asm语句将汇编语言语句将汇编语言放入汇编器输出中而不会影响代码。放入汇编器输出中而不会影响代码。asm语句对在编译语句对在编译器输出中插入命令很有用。器输出中插入命令很有用。l使用使用asm语句时,需要注意以下几点:语句时,需要注意以下几点:u千万注意不要破坏千万注意不要破坏C语言操作环境。语言操作环境。C编译器在遇到内编译器在遇到内嵌嵌asm汇编语句时,不会对其进行分析处理。汇编语句时,不会对其进行分析处理。u避免从内嵌避免从内嵌asm汇编语句调转到语言模块中,那将汇编语句调转到语言模块中,那将极容易造成寄存器使用上的混乱,从而产生难以预料极容

29、易造成寄存器使用上的混乱,从而产生难以预料的结果。的结果。u不要在内嵌不要在内嵌asm汇编语句中改变语言模块中变量的汇编语句中改变语言模块中变量的值,但可以安全地读取它们的值。值,但可以安全地读取它们的值。u不要使用内嵌不要使用内嵌asm汇编语句插入汇编器指令来改变汇汇编语句插入汇编器指令来改变汇编环境。编环境。asm指令lasm指令可以直接将指令可以直接将C55x汇编语言指令嵌入到编译器汇编语言指令嵌入到编译器的汇编语言输出中的汇编语言输出中,就好像是对叫做就好像是对叫做asm的函数的调用。的函数的调用。l指令格式:指令格式: asm (“assembler text”);例,例, asm

30、(“nop”); 插入一条汇编指令插入一条汇编指令nopl插入的代码必须是合法的汇编语言指令插入的代码必须是合法的汇编语言指令u像其它汇编语言指令一样,包含引用的代码行必须像其它汇编语言指令一样,包含引用的代码行必须用标号、空格、星号、分号开头。编译器不检查字用标号、空格、星号、分号开头。编译器不检查字符串。如果有错,汇编器会将其检测出来符串。如果有错,汇编器会将其检测出来l使用使用asm指令存在的问题:指令存在的问题:u它容易破坏它容易破坏C环境,因为环境,因为C编译器在编译嵌入了汇编编译器在编译嵌入了汇编语言的语言的C程序时并不检查或分析嵌入的汇编语句程序时并不检查或分析嵌入的汇编语句u当使用带当使用带asm指令的优化器时必须小心。虽然优化指令的优化器时必须小心。虽然优化器不会移除器不会移除asm指令,但它可以重新改变周围代码指令,但它可以重新改变周围代码顺序并可能引起不可预知的结果顺序并可能引起不可预知的结果

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 研究生课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号