DSP编程技巧之17---非常“关键”的关键字

发布者:WiseSage123最新更新时间:2014-09-30 来源: 互联网关键字:DSP  编程技巧  关键字 手机看文章 扫描二维码
随时随地手机看文章
  什么是“”?就是已被C语言本身使用,不能作其它用途使用的字,例如不能用作变量名、函数名等。那“关键字”到底有多关键?简单得说,就是如果不掌握它们的使用方法,程序就不能按照我们的设计产生预期的结果。C28x的支持所有的标准C89的关键字,包括const、volatile和register,标准的C99关键字,包括inline和restrict,以及支持TI自定义的扩展关键字__cregister、__asm,和__interrupt;对于FPU的操作,还支持restrict关键字。接下来我们就看一下几个常用关键字的用法,包括const,cregister,far,__interrupt等。在前面的一篇文章编程技巧之15-使用代码优化时必须考虑的五大问题中,我们已经描述了volatile和restrict的用法,在此不再重复描述。

  1. const

  const关键字用来定义值不会发生变化/不允许被改变的变量、数组等,即相当于这些变量、数组是“只读”的。通常情况下,const定义的全局变量会存放在cmd文件定义的.const段中,而.const段一般会被链接器分配到ROM或者FLASH存储,而不是RAM中;考虑到片上ROM/FLASH的空间通常比RAM的空间大,且RAM的空间经常会比较紧张,这种存储分配方式是很有优势的。但是在两种情况下const定义的全局变量仍然会被分配到RAM的地址空间中,包括:

  1) 使用const定义变量的同时还使用了volatile关键字,例如volatile const int x,volatile类型的变量是默认存放在RAM中的,volative const也会被分配到RAM中;程序中无法对volative const定义的常量进行修改(但是某些情况下外部程序可以对其修改)。

  2) 在函数的作用域内,对象被自动的存储。

  在使用const关键字的时候,其位置是非常重要的,例如:

  int * const p = &x; //指针p为constant类型(p不可变),指向的内容为可变的int类型变量

  const int * q = &x; //指针q为可变的,指向constant的int类型

  使用const关键字,我们可以定义内容较多的常数型数据表(例如一个100点的自定义数学表),并把它们分配到ROM/Flash中,例如

  const int digits[] = {0,1,2,3,4,5,6,7,8,9};

  通常情况下我们会直接使用#define来预定义某些符号的值,那#define与const的区别是什么? const定义的只读变量在程序运行过程中只有一份拷贝(比如它存放在ROM中,有固定的地址),而#define定义的宏常量在内存中有若干个拷贝。#define宏是在预编译阶段进行替换,而const修饰的只读变量是在编译的时候确定其值。#define宏没有类型,而const修饰的只读变量具有特定的类型(该是啥类型还是啥类型,只不过其值为只读的)。const 的好处是引入了常量的概念,让我们不要去修改不该修改的内存;当我们不小心尝试改变const变量的值时,就可以给出相关的错误信息提醒我们了。

  2. cregister

  使用cregister关键字,当我们定义的该类型的对象与C28x的标准的控制寄存器匹配时,会自动产生相关的代码去控制对应的寄存器,使得我们可以在高级编程语言C/C++中对寄存器进行控制;如果不匹配则产生编译器错误。目前可匹配此类型的寄存器包括:

  IER:中断使能寄存器

  IFR:中断标志寄存器

  其定义方式为;

  extern cregister volatile unsigned int IFR;

  extern cregister volatile unsigned int IER;

  cregister类型只能对整形或者指针类型进行定义,并且只在本文件的作用域内生效,它既不能在函数内定义,也不能被用在浮点类型、结构体或者共同体类型上面。如果cregister类型定义的变量是可以被外部控制修改的,那么该变量也必须同时使用volatile类型进行声明。

  在定义了寄存器之后,我们就可以直接使用寄存器的名字了,但是还有以下的限制(如果不按照规范来,则会有“Illegal use of control register”的错误提示):

  1)IFR是不能直接写的,它的置位操作只能通过“或”操作(操作符是|)进行修改,且操作数必须是立即数,它的复位操作只能被“与”操作(操作符是&)进行修改,例如:

  IFR |= 0x4;

  IFR &= 0x0800

  2)IER寄存器除了通过“或”操作或者“与”操作进行修改之外,也可直接赋值,例如:

  IER = x;

  IER |= 0x100;

  printf("IER = %x ", IER);

  3. far

  默认情况下,C/C++的编译器只支持到低64K的存储空间,且所有的指针都默认为16位的。但是C28x的存储空间一般都在16bit以上,此时通过使用far类型,C代码中的指针可以为22bit宽(需要两个存储单元来存储),并支持对高达4M的存储空间的存取。(在C++中,不支持far关键字,对高地址的存取是通过使用在编译器选项中开启large memory model选项实现的。)

  当一个变量被定义为far类型时,它被存储在高于64K的地址范围中,此时far类型的全局变量不再保存在.bss段中,而是保存在一个新的段,即.ebss中,相同的道理,far类型的const变量也被保存到.econst段中。注意:只有全局变量和静态变量可以被定义为far类型,函数中的非静态变量(自动存储对象)因为被分配到栈中,被自动当near类型来处理。对于结构体,如果结构体被声明为far类型,则全部成员都会自动继承为far类型。举例如下;

  int far *ptr; // 指针指向far类型的int,但是指针本身是near类型的

  int * far ptr; // 指针指向near类型的int,但是指针本身是far类型的

  int far * far ptr; //指针和指向的内容都是far类型的

  int far *memcpy_ff(far void *dest, const far void *src, int count);

  // 函数的参数为两个far类型的指针,且返回值也为far类型的指针

  int *far func();// 错误:far类型只能用于数据,不能用于函数

  //因为程序地址空间本身就是22位的

  最后需要注意的是,目前对于两个far类型指针相减的操作,其结果是16位的指针。

  4. _interrupt

  __interrupt用来声明一个函数是中断处理函数;在严格的ANSIC/C++模式下,也可以使用interrupt关键字来代替。中断处理函数要遵循特殊的寄存器保存规则和退出顺序,从而保证代码的安全。在C/C++程序中产生中断时,所有被中断子程序使用,或者被中断子程序调用的函数使用的状态都需要被保留。此外,__interrupt定义的函数不能有参数,也没有返回值,即:

  __interrupt void int_handler()

  {

  unsigned int flags;

  ...

  }

  唯一特殊的是c_int00函数,它是C/C++程序的入口点,被系统保留为默认的复位中断函数,并在其中调用main函数。因为c_int00函数不被任何函数所调用,所以它不需要保存任何状态(毕竟是在复位和初始化状态)。

  在/BIOS和SYS/BIOS HWI对象中,不需要使用__interrupt关键字,因为Hwi_enter/Hwi_exit宏和Hwi解包器已经包含了该函数,此时使用__interrupt关键字会产生负面的效果。

关键字:DSP  编程技巧  关键字 引用地址:DSP编程技巧之17---非常“关键”的关键字

上一篇:详解嵌入式系统技术核心:DSP器件
下一篇:基于FPGA+DSP架构视频处理系统设计

推荐阅读最新更新时间:2024-05-02 23:12

CEVA-TeakLite-III DSP通过DTS-HD Master Audio Logo认证
CEVA公司宣布,其CEVA-TeakLite-III DSP内核通过了DTS-HD Master Audio™ Logo认证。这项认证是在实际的CEVA-TeakLite-III DSP内核硬件平台上,利用全面优化的软件(SW)实现方案来完成的,可为高端音频SoC开发人员提供一种已获验证的硬件和软件解决方案,帮助其简化设计流程,大幅缩短DTS-HD兼容产品的上市时间。 CEVA原生的32位CEVA-TeakLite-III DSP内核最近获Linley Group在其2010年CPU 和 DSP内核报告中评为业界最佳音频处理器,它也是CEVA-HD-Audio解决方案的构建基础。这款单核解决方案可集成在家庭娱乐及消费电
[嵌入式]
CEVA和Silentium合作为CEVA-TeakLite DSP提供主动主动噪声消除方案
CEVA,智能和互联设备的信号处理IP授权许可厂商 (纳斯达克股票交易所代码:CEVA) 和主动噪声消除(Active Noise Cancellation)技术和自适应声音管理解决方案领先供应商Silentium公司宣布,两家企业已经合作为耳机和听觉产品提供低功耗的主动噪声消除解决方案。CEVA和Silentium在1月9日至12日在美国拉斯维加斯举行的2018国际消费类电子产品展览会(CES)上展示基于该解决方案的耳机参考设计。如要在CEVA的私人会议室安排演示,请发送邮件至 sales@ceva-dsp.com 。 对于不断寻求提升无线耳机、耳塞和听觉设备体验的消费者,主动噪声消除是必备功能。耳机芯片开发人员需要一个灵活
[家用电子]
基于ARM11和DSP协作视频流处理技术的3G视频安全帽设计
  1.引言   为提高在高危工作场所现场作业的可控性,本文采用仿生学原理和高集成度设计实现了与人眼同视角的3G视频安全帽。本设计由视频安全帽和腰跨式数据处理终端两部分组成,采用高可靠性航空插头连接。其中图像处理采用三星公司的S3C6410ARM11处理器和TMS320DM642 DSP处理器组成。本设计结合DSP处理器在视频压缩方面的优势和运行于ARM之上的Linux操作系统在数据管理与任务调度机制方面的出色表现,由DSP完成图像处理功能,并通过高速接口把视频数据传输给嵌入式微处理系统,完成视频数据的传输、存储功能。   2.系统构成   本设计由视频安全帽和腰跨式视频终端两部分组成。视频安全帽中包含1路视频输
[嵌入式]
基于ARM11和<font color='red'>DSP</font>协作视频流处理技术的3G视频安全帽设计
DSP与PCI网卡接口设计
  基于DSP的嵌入式系统的以太网接口设计一直是热门领域,目前利用的以太网控制器大多都是ISA接口。随着PCI总线逐渐取代ISA总线的趋势,使PCI接口的以太网控制器也成为PC机的主流,但在嵌入式领域中PCI总线的应用目前并不多见。本文将介绍利用Realtek公司生产的具有PCI接口的以太网控制芯片RTL8139实现RTL8139与DSP接口的方案。   1 RTL8139   RTL8139是带PCI接口的10M/100M自适应网卡控制芯片,它提供32位PCI总线控制,支持IEEE802.3u 100Base-T和IEEE802.3x的全双工流量控制;符合PCI 2.2标准,支持高级配置和电源接口(ACPI)和PCI对现代操作
[嵌入式]
在EPP模式下利用并口实现与DSP高速数据通信
    摘要: DSP与PC机之间进行高速数据通信是DSP的一个重要应用。本文分析了并口处于EPP模式下与ADSP21060之间的高速数据交换的原理,同时详细讨论了其硬件设计的结构图及其相应的并口程序设计。     关键词: 计算机并口 EPP DSP FIFO 随着技术的进步和大量外设的增加,不仅要求计算机并行口可以连接打印机,而且可以连接到其他外设,并要求能够双向传输数据,对高速外设还要求高速数据传输,如DPS。在科技飞速发展的今天,DSP的处理能力和速度也快速提高,广泛用户在科学研究、军事及通信等电子领域。在这些应用中免不了要和PC机进行高速数据传输。计算机并口传统的传输模式为SPP(标准并口),数据传
[应用]
音频信号采集与AGC算法的DSP实现
引言 电台等由于其自办频道的广告、新闻、广播剧、歌曲和转播节目等音频信号电平大小不一,导致节目播出时,音频信号忽大忽小,严重影响用户的收听效果。在转播时,由于传输距离等原因,在信号的输出端也存在信号大小不一的现象。过去,对大音频信号采用限幅方式,即对大信号进行限幅输出,小信号不予处理。这样,仍然存在音频信号过小时,用户自行调节音量,也会影响用户的收听效果。随着电子技术,计算机技术和通信技术的迅猛发展,数字信号处理技术已广泛地深入到人们生活等各个领域。其中语音处理是数字信号处理最活跃的研究方向之一,在IP电话和多媒体通信中得到广泛应用。语音处理可采用通用数字信号处理器DSP和现场可编程门阵列(FPGA) 实现,其中DSP实现方法具
[嵌入式]
中科昊芯李任伟:首款基于RISC-V的DSP年内预计出货量达数百万颗
日前,在第二届滴水湖RISC-V论坛上,北京中科昊芯科技有限公司创始人、董事长李任伟介绍了首款基于RISC-V的DSP芯片Haawking-HX28027,并表示今年将出货数百万颗,从而为RISC-V在中国乃至行业内在DSP领域的落地生根发芽奉献更多的力量。 李任伟表示,目前DSP市场每年有9.3%的增长率,预计市场到2025年会达到200亿美元。但目前本土DSP厂商无法满足国内旺盛的需求,主要原因之一是DSP基本上被国外垄断,不像Arm或者RISC-V一样开放,市场具有较高门槛。 源于中科院的中科昊芯,其团队核心自2016年起就开始基于RISC-V的处理器研究,并从2019年公司成立之后开始基于RISC-V的DSP研发,
[嵌入式]
labview编程技巧-----xy graph如何显示连续数据
无论是CHART还是GRAPH,其横坐标都是时间轴,是等间隔的.对于两个相互关联的两组数据,比如,位移与压力,速度与扭矩等,实际就是Y=F(X)的函数关系,用XY GRAPH来表示非常合适. XY GRAPH和GRAPH一样都是表示静态数据的,如何用它来表示动态数据,类似CHART那? 我们知道,CHART自己内部有一个先入先出的缓冲区FIFO,它只所以能够不断地显示连续数据,就是每次调用时,向这个缓冲去添加新的数据,因此我们对X和Y建立两个FIFO,就可以实现XY 连续数据显示了. LABVIEW在逐点分析库提供了这样一个FIFO节点,可能很多人没有注意到. 看一下它的用法 这样,就实现了XY GRAPH
[测试测量]
labview<font color='red'>编程</font><font color='red'>技巧</font>-----xy graph如何显示连续数据
小广播
最新嵌入式文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved