《電子技術(shù)應(yīng)用》
您所在的位置:首頁 > 可編程邏輯 > 業(yè)界動(dòng)態(tài) > DSP編程技巧之:非常“關(guān)鍵”的關(guān)鍵字

DSP編程技巧之:非常“關(guān)鍵”的關(guān)鍵字

2015-09-18
關(guān)鍵詞: DSP 編程技巧

  什么是“關(guān)鍵字”?關(guān)鍵字就是已被C語言本身使用,不能作其它用途使用的字,例如關(guān)鍵字不能用作變量名、函數(shù)名等。那“關(guān)鍵字”到底有多關(guān)鍵?簡(jiǎn)單得說,就是如果不掌握它們的使用方法,程序就不能按照我們的設(shè)計(jì)產(chǎn)生預(yù)期的結(jié)果。C28x的編譯器支持所有的標(biāo)準(zhǔn)C89的關(guān)鍵字,包括const、volatile和register,標(biāo)準(zhǔn)的C99關(guān)鍵字,包括inline和restrict,以及支持TI自定義的擴(kuò)展關(guān)鍵字__cregister、__asm,和__interrupt;對(duì)于FPU的操作,還支持restrict關(guān)鍵字。接下來我們就看一下幾個(gè)常用關(guān)鍵字的用法,包括const,cregister,far,__interrupt等。在前面的一篇文章DSP編程技巧之15-使用代碼優(yōu)化時(shí)必須考慮的五大問題中,我們已經(jīng)描述了volatile和restrict的用法,在此不再重復(fù)描述。
  1. const
  const關(guān)鍵字用來定義值不會(huì)發(fā)生變化/不允許被改變的變量、數(shù)組等,即相當(dāng)于這些變量、數(shù)組是“只讀”的。通常情況下,const定義的全局變量會(huì)存放在cmd文件定義的.const段中,而.const段一般會(huì)被鏈接器分配到ROM或者FLASH存儲(chǔ),而不是RAM中;考慮到片上ROM/FLASH的空間通常比RAM的空間大,且RAM的空間經(jīng)常會(huì)比較緊張,這種存儲(chǔ)分配方式是很有優(yōu)勢(shì)的。但是在兩種情況下const定義的全局變量仍然會(huì)被分配到RAM的地址空間中,包括:
  1) 使用const定義變量的同時(shí)還使用了volatile關(guān)鍵字,例如volatile const int x,volatile類型的變量是默認(rèn)存放在RAM中的,volative const也會(huì)被分配到RAM中;程序中無法對(duì)volative const定義的常量進(jìn)行修改(但是某些情況下外部程序可以對(duì)其修改)。
  2) 在函數(shù)的作用域內(nèi),對(duì)象被自動(dòng)的存儲(chǔ)。
  在使用const關(guān)鍵字的時(shí)候,其位置是非常重要的,例如:
  int * const p = &x; //指針p為constant類型(p不可變),指向的內(nèi)容為可變的int類型變量
  const int * q = &x; //指針q為可變的,指向constant的int類型
  使用const關(guān)鍵字,我們可以定義內(nèi)容較多的常數(shù)型數(shù)據(jù)表(例如一個(gè)100點(diǎn)的自定義數(shù)學(xué)表),并把它們分配到ROM/Flash中,例如
  const int digits[] = {0,1,2,3,4,5,6,7,8,9};
  通常情況下我們會(huì)直接使用#define來預(yù)定義某些符號(hào)的值,那#define與const的區(qū)別是什么? const定義的只讀變量在程序運(yùn)行過程中只有一份拷貝(比如它存放在ROM中,有固定的地址),而#define定義的宏常量在內(nèi)存中有若干個(gè)拷貝。#define宏是在預(yù)編譯階段進(jìn)行替換,而const修飾的只讀變量是在編譯的時(shí)候確定其值。#define宏沒有類型,而const修飾的只讀變量具有特定的類型(該是啥類型還是啥類型,只不過其值為只讀的)。const 的好處是引入了常量的概念,讓我們不要去修改不該修改的內(nèi)存;當(dāng)我們不小心嘗試改變const變量的值時(shí),編譯器就可以給出相關(guān)的錯(cuò)誤信息提醒我們了。

  2. cregister
  使用cregister關(guān)鍵字,當(dāng)我們定義的該類型的對(duì)象與C28x的標(biāo)準(zhǔn)的控制寄存器匹配時(shí),編譯器會(huì)自動(dòng)產(chǎn)生相關(guān)的代碼去控制對(duì)應(yīng)的寄存器,使得我們可以在高級(jí)編程語言C/C++中對(duì)寄存器進(jìn)行控制;如果不匹配則產(chǎn)生編譯器錯(cuò)誤。目前可匹配此類型的寄存器包括:
  其定義方式為;
  extern cregister volatile unsigned int IFR;
  extern cregister volatile unsigned int IER;
  cregister類型只能對(duì)整形或者指針類型進(jìn)行定義,并且只在本文件的作用域內(nèi)生效,它既不能在函數(shù)內(nèi)定義,也不能被用在浮點(diǎn)類型、結(jié)構(gòu)體或者共同體類型上面。如果cregister類型定義的變量是可以被外部控制修改的,那么該變量也必須同時(shí)使用volatile類型進(jìn)行聲明。
  在定義了寄存器之后,我們就可以直接使用寄存器的名字了,但是還有以下的限制(如果不按照規(guī)范來,則會(huì)有“Illegal use of control register”的錯(cuò)誤提示):
  1)IFR是不能直接寫的,它的置位操作只能通過“或”操作(操作符是|)進(jìn)行修改,且操作數(shù)必須是立即數(shù),它的復(fù)位操作只能被“與”操作(操作符是&)進(jìn)行修改,例如:
  IFR |= 0x4;
  IFR &= 0x0800
  2)IER寄存器除了通過“或”操作或者“與”操作進(jìn)行修改之外,也可直接賦值,例如:
  IER = x;
  IER |= 0x100;
  printf("IER = %x\n", IER);
  3. far
  默認(rèn)情況下,C/C++的編譯器只支持到低64K的存儲(chǔ)空間,且所有的指針都默認(rèn)為16位的。但是C28x的存儲(chǔ)空間一般都在16bit以上,此時(shí)通過使用far類型,C代碼中的指針可以為22bit寬(需要兩個(gè)存儲(chǔ)單元來存儲(chǔ)),并支持對(duì)高達(dá)4M的存儲(chǔ)空間的存取。(在C++中,不支持far關(guān)鍵字,對(duì)高地址的存取是通過使用在編譯器選項(xiàng)中開啟large memory model選項(xiàng)實(shí)現(xiàn)的。)

  當(dāng)一個(gè)變量被定義為far類型時(shí),它被存儲(chǔ)在高于64K的地址范圍中,此時(shí)far類型的全局變量不再保存在.bss段中,而是保存在一個(gè)新的段,即.ebss中,相同的道理,far類型的const變量也被保存到.econst段中。注意:只有全局變量和靜態(tài)變量可以被定義為far類型,函數(shù)中的非靜態(tài)變量(自動(dòng)存儲(chǔ)對(duì)象)因?yàn)楸环峙涞綏V校蛔詣?dòng)當(dāng)near類型來處理。對(duì)于結(jié)構(gòu)體,如果結(jié)構(gòu)體被聲明為far類型,則全部成員都會(huì)自動(dòng)繼承為far類型。舉例如下;
  int far *ptr; // 指針指向far類型的int,但是指針本身是near類型的
  int * far ptr; // 指針指向near類型的int,但是指針本身是far類型的
  int far * far ptr; //指針和指向的內(nèi)容都是far類型的
  int far *memcpy_ff(far void *dest, const far void *src, int count);
  // 函數(shù)的參數(shù)為兩個(gè)far類型的指針,且返回值也為far類型的指針
  int *far func();// 錯(cuò)誤:far類型只能用于數(shù)據(jù),不能用于函數(shù)
  //因?yàn)槌绦虻刂房臻g本身就是22位的
  最后需要注意的是,目前對(duì)于兩個(gè)far類型指針相減的操作,其結(jié)果是16位的指針。
  4. _interrupt
  __interrupt用來聲明一個(gè)函數(shù)是中斷處理函數(shù);在嚴(yán)格的ANSIC/C++模式下,也可以使用interrupt關(guān)鍵字來代替。中斷處理函數(shù)要遵循特殊的寄存器保存規(guī)則和退出順序,從而保證代碼的安全。在C/C++程序中產(chǎn)生中斷時(shí),所有被中斷子程序使用,或者被中斷子程序調(diào)用的函數(shù)使用的狀態(tài)都需要被保留。此外,__interrupt定義的函數(shù)不能有參數(shù),也沒有返回值,即:
  __interrupt void int_handler()
  {
  unsigned int flags;
  ...
  }
  唯一特殊的是c_int00函數(shù),它是C/C++程序的入口點(diǎn),被系統(tǒng)保留為默認(rèn)的復(fù)位中斷函數(shù),并在其中調(diào)用main函數(shù)。因?yàn)閏_int00函數(shù)不被任何函數(shù)所調(diào)用,所以它不需要保存任何狀態(tài)(畢竟是在復(fù)位和初始化狀態(tài))。
  在DSP/BIOS和SYS/BIOS HWI對(duì)象中,不需要使用__interrupt關(guān)鍵字,因?yàn)镠wi_enter/Hwi_exit宏和Hwi解包器已經(jīng)包含了該函數(shù),此時(shí)使用__interrupt關(guān)鍵字會(huì)產(chǎn)生負(fù)面的效果。

本站內(nèi)容除特別聲明的原創(chuàng)文章之外,轉(zhuǎn)載內(nèi)容只為傳遞更多信息,并不代表本網(wǎng)站贊同其觀點(diǎn)。轉(zhuǎn)載的所有的文章、圖片、音/視頻文件等資料的版權(quán)歸版權(quán)所有權(quán)人所有。本站采用的非本站原創(chuàng)文章及圖片等內(nèi)容無法一一聯(lián)系確認(rèn)版權(quán)者。如涉及作品內(nèi)容、版權(quán)和其它問題,請(qǐng)及時(shí)通過電子郵件或電話通知我們,以便迅速采取適當(dāng)措施,避免給雙方造成不必要的經(jīng)濟(jì)損失。聯(lián)系電話:010-82306118;郵箱:aet@chinaaet.com。
亚洲一区二区欧美_亚洲丝袜一区_99re亚洲国产精品_日韩亚洲一区二区
一本一本久久a久久精品综合麻豆| 亚洲自拍偷拍一区| 99精品视频免费观看| 国产在线视频欧美一区二区三区| 欧美性一二三区| 欧美精品国产精品| 欧美a级一区| 久久久成人网| 欧美中文在线免费| 欧美影院久久久| 欧美一区二区国产| 午夜精品久久一牛影视| 亚洲一区二区在线视频| 亚洲视频免费观看| 亚洲视频视频在线| 亚洲午夜久久久| 亚洲一二三区在线观看| 亚洲天堂男人| 亚洲一区二区视频在线| 亚洲在线观看| 先锋亚洲精品| 香蕉成人啪国产精品视频综合网| 亚洲欧美制服中文字幕| 午夜亚洲一区| 欧美综合国产| 久久先锋影音| 欧美jizzhd精品欧美巨大免费| 久久综合五月天婷婷伊人| 免费视频一区| 欧美激情视频在线播放| 欧美韩日精品| 欧美日韩精品一区二区三区四区| 欧美日韩亚洲网| 国产精品久久久久一区| 国产精品一区免费观看| 国产亚洲福利一区| 在线观看欧美成人| 亚洲精品一区二区三区99| 99精品热视频| 亚洲欧美日韩中文在线制服| 欧美一区二区在线| 91久久综合| 一区二区三区精品视频在线观看| 亚洲私人影院| 久久精品盗摄| 欧美ab在线视频| 欧美婷婷六月丁香综合色| 国产欧美精品日韩区二区麻豆天美| 国产一区二区三区成人欧美日韩在线观看| 国模私拍一区二区三区| 亚洲国产天堂久久综合网| 99国产精品| 亚洲欧美日韩中文在线制服| 亚洲国产成人精品女人久久久 | 亚洲精品欧美极品| 亚洲色图综合久久| 久久国产精品高清| 亚洲美女电影在线| 午夜精品久久久久久久99黑人| 久久久久国产精品一区三寸| 欧美77777| 国产精品乱码一区二三区小蝌蚪| 国产一区二区三区四区在线观看| 亚洲国产精品免费| 亚洲一区二区三区在线视频| 亚洲黄网站黄| 亚洲影院在线观看| 欧美96在线丨欧| 国产精品欧美一区二区三区奶水 | 国语自产精品视频在线看| 有坂深雪在线一区| 国产精品99久久久久久久女警| 久久超碰97中文字幕| aaa亚洲精品一二三区| 久久精品人人做人人综合 | 欧美日韩午夜在线| 国产精品一区二区女厕厕| 亚洲国产精品va| 午夜国产精品视频免费体验区| 亚洲精选在线| 久久久久久久久久久久久久一区| 欧美日韩另类一区| 伊人成年综合电影网| 亚洲一区二区三区精品视频| 亚洲精品在线视频观看| 久久成人av少妇免费| 欧美日韩免费视频| 在线播放亚洲一区| 午夜久久一区| 亚洲一区二区不卡免费| 欧美成人午夜| 国模私拍一区二区三区| 亚洲午夜电影在线观看| 99视频精品全部免费在线| 久久免费99精品久久久久久| 国产精品久久久久久久久久久久久久| 亚洲电影免费观看高清完整版在线观看| 亚洲一区日韩在线| 中文亚洲欧美| 欧美劲爆第一页| 一区一区视频| 欧美在线亚洲在线| 欧美中文字幕视频| 国产精品一区二区你懂得| 99精品视频免费观看视频| 日韩视频永久免费观看| 免费观看久久久4p| 国外精品视频| 欧美一区日韩一区| 欧美制服第一页| 国产老女人精品毛片久久| 在线亚洲欧美视频| 中文av一区特黄| 欧美精品一区二区三区在线看午夜| 一区二区三区在线免费视频| 欧美一区二区三区电影在线观看| 午夜精品视频| 国产精品女主播| 亚洲一级电影| 午夜精品久久久久久久久久久久久 | 亚洲专区欧美专区| 欧美日本高清一区| 亚洲激情影院| 亚洲理论在线观看| 欧美成人激情在线| 尤物网精品视频| 亚洲国产老妈| 欧美成人69| 亚洲国产美女| 日韩视频在线观看免费| 欧美久久久久| 日韩网站在线看片你懂的| 日韩西西人体444www| 欧美裸体一区二区三区| 亚洲欧洲日本一区二区三区| 日韩网站在线| 欧美日韩在线播放三区| 亚洲午夜一区| 性色一区二区三区| 国产日韩欧美高清| 久久精品成人欧美大片古装| 另类图片综合电影| 亚洲精品乱码久久久久久久久| 一区二区三区高清| 国产精品美女www爽爽爽视频| 亚洲一区二区少妇| 久久av一区二区三区漫画| 国产亚洲成av人片在线观看桃 | 一区二区三区精品国产| 国产精品xxxav免费视频| 亚洲在线电影| 久久蜜桃资源一区二区老牛 | 亚洲国产成人精品女人久久久| 亚洲美女在线看| 欧美日韩日韩| 亚洲无亚洲人成网站77777| 欧美一区二区三区视频免费| 国产一区二区三区成人欧美日韩在线观看 | 亚洲网站在线| 久久精品人人做人人爽电影蜜月| 伊人久久亚洲美女图片| 一区二区三区日韩在线观看 | 国产日本欧美一区二区| 久久精品国内一区二区三区| 欧美h视频在线| 一区二区成人精品 | 亚洲综合国产激情另类一区| 国产日产欧产精品推荐色| 亚洲欧洲日产国产网站| 欧美午夜视频| 久久福利影视| 欧美日韩在线播| 久久国产精彩视频| 欧美日韩在线影院| 久久精品2019中文字幕| 欧美日韩精品久久| 欧美中文字幕精品| 欧美日韩在线视频一区二区| 香蕉久久夜色| 欧美日韩另类国产亚洲欧美一级| 亚洲欧美日韩国产中文在线| 欧美国产欧美亚州国产日韩mv天天看完整 | 一区二区三区中文在线观看| 一区二区三区 在线观看视| 国产欧美va欧美不卡在线| 亚洲人成免费| 国产精品久久久一区二区三区| 久久av一区二区三区| 欧美日韩一区二区在线观看| 久久精品99国产精品日本| 欧美日韩国产美女| 欧美影视一区| 欧美性感一类影片在线播放| 亚洲国产成人久久| 国产精品日韩| av成人免费| 伊人婷婷久久| 久久本道综合色狠狠五月| 99国产精品99久久久久久粉嫩| 久久久噜噜噜久久狠狠50岁|