女人被狂躁到高潮视频免费无遮挡,内射人妻骚骚骚,免费人成小说在线观看网站,九九影院午夜理论片少妇,免费av永久免费网址

當(dāng)前位置:首頁 > 工業(yè)控制 > 電子設(shè)計(jì)自動(dòng)化
[導(dǎo)讀]摘要:目前很多嵌入式系統(tǒng)以DSP為核心構(gòu)建,但是,采用匯編語言開發(fā)DSP系統(tǒng)存在開發(fā)難度大、開發(fā)周期長、維護(hù)性差等缺點(diǎn),應(yīng)用C語言開發(fā)DSP系統(tǒng)是廣大嵌入式開發(fā)者的迫切要求。有關(guān)單片機(jī)的C語言開發(fā)有相當(dāng)多的資料可

摘要:目前很多嵌入式系統(tǒng)以DSP為核心構(gòu)建,但是,采用匯編語言開發(fā)DSP系統(tǒng)存在開發(fā)難度大、開發(fā)周期長、維護(hù)性差等缺點(diǎn),應(yīng)用C語言開發(fā)DSP系統(tǒng)是廣大嵌入式開發(fā)者的迫切要求。有關(guān)單片機(jī)的C語言開發(fā)有相當(dāng)多的資料可以參考,而DSP系統(tǒng)的C語言開發(fā)卻很少見。本文以TI公司的DSP器件TMS320F24X系列為例,講述怎樣用C語言開發(fā)一個(gè)完整的DSP嵌入式系統(tǒng)。

引言

大家在開發(fā)嵌入式產(chǎn)品時(shí)首先會(huì)想到用控制器的匯編語言編寫監(jiān)控程序,主要原因是:①匯編語言生成的程序?qū)?yīng)的二進(jìn)制代碼少,程序執(zhí)行要比高級(jí)語言生成的程序快;②控制器剛問世時(shí),沒有相應(yīng)的高級(jí)語言可供使用;③存儲(chǔ)器的價(jià)格問題和尋址空間的限制。

以上所述問題目前已基本解決,在這就不闡述了。實(shí)際情況是:在單片機(jī)的應(yīng)用領(lǐng)域,開發(fā)者已開始使用C語言進(jìn)行開發(fā)。大家發(fā)現(xiàn)用高級(jí)語言開發(fā)嵌入式產(chǎn)品是如此輕松,并且C語言程序編譯后的二進(jìn)制代碼也非常短小精練。

目前使用最多的數(shù)字信號(hào)處理器(DSP)是美國TI公司的TMS320家族,而工業(yè)控制上用得最多的又是TMS320F2XX系列。TI公司為每一個(gè)DSP芯片提供了匯編語言和C語言供開發(fā)者選用。本人一直使用C語言進(jìn)行產(chǎn)品開發(fā),而目前很少見到這方面的介紹、所以特撰此文,以TMS320F240為例,向各位同行推薦用C語言開發(fā)DSP嵌入式系統(tǒng)。

1 DSP的C語言的特殊性

大家在使用51系列C語言時(shí)已經(jīng)注意到,控制器的C語言和PC機(jī)上使用的C有一個(gè)顯著的特點(diǎn):經(jīng)常要對(duì)硬件操作,程序中有大量針對(duì)控制器內(nèi)部資源進(jìn)行操作的語句。所以,開發(fā)者要明白怎樣用C語言來操縱控制器的內(nèi)部資源,即怎樣用C語句操作寄存器和內(nèi)部存儲(chǔ)器等。

舉個(gè)例子:在51匯編中我們寫 MOV A,#20H;匯編程序能夠識(shí)別A是指累加器;而在51的C程序中我們寫ACC=32;,編譯器能夠識(shí)別ACC是指累加器而不是一般的變量。即每一個(gè)寄存器都有一個(gè)專有名字供開發(fā)者使用,它們定義在一個(gè)頭文件reg51.h中,程序員只需在程序的開始部分用#include“reg51.h”語句將該文件包含進(jìn)來即可。注意:這些寄存器的名字不能用作變量名。

同樣,在TMS320F240的C語言中也有一個(gè)頭文件C240.H定義各個(gè)寄存器的名稱,這里摘錄幾條語句進(jìn)行介紹。
比如:
#define IMR((PORT)0x0004)
#define XINTI_CR((PORT) 0x07070)
IMR、XINT1_CR就對(duì)應(yīng)兩個(gè)寄存器,實(shí)際是寄存器的地址,用高級(jí)語言的說法是指針。我們也在程序的開始部分用#include“c240.h”語句將該文件包含進(jìn)來。這樣,在DSP的C語言中使用它們只需在前面加一個(gè)星號(hào)(*),例如,
*IMR=0X1010;/*將十六進(jìn)制數(shù)1010H賦給IMR寄存器*/
*XINT1_CR=0X0A0B0;/*將十六進(jìn)制數(shù)A0B0H賦給XINT1_CR寄存器*/

開發(fā)者最好將c240.h這個(gè)文件打印出來,弄清楚各個(gè)寄存器的定義名稱。至于不涉及硬件的語法和ANSI語法一樣。需要注意的是,有些ANSI標(biāo)準(zhǔn)中的函數(shù)在DSP的編譯器中不提供,讀者可以參考DSP編譯器的C語言手冊(cè)。搞清楚了這些特殊性,由匯編語言轉(zhuǎn)到C語言開發(fā)是很容易的事。當(dāng)然,沒有匯編語言編程基礎(chǔ)的人同樣可以用C語言開發(fā)DSP應(yīng)用系統(tǒng)。

有關(guān)嵌入式系統(tǒng)的C語言編程可參考《單片機(jī)與嵌入式系統(tǒng)應(yīng)用》2001年1~6期《嵌入式C編程技術(shù)》,本文不作討論。下面只針對(duì)以TMS320F240芯片為處理器的嵌入式C語言編程進(jìn)行闡述,希望能夠指導(dǎo)讀者進(jìn)行具體操作。

2 TMS320F240芯片的C語言開發(fā)過程

簡(jiǎn)單地說,整個(gè)過程包括以下5個(gè)步驟:
①編輯C語言源程序;
②編譯源程序(注意編譯參數(shù));
③鏈接目標(biāo)文件(注意用CMD文件);
④在線仿真;
⑤固化程序。

2.1源程序的編輯

可以用任何一個(gè)編輯器書寫源程序,如EDIT。NOTEPAD等,最后以.C為后綴存盤。源代碼可以寫在一個(gè)C文件中,也可寫在多個(gè)C文件中;有些預(yù)定義變量和函數(shù)原型聲明可以集中放在一個(gè)頭文件中。

注意事項(xiàng):不要忘記在C程序的前面用 #in-clude “c240.h”將寄存器定義文件包括進(jìn)來。

2.2源程序的編譯

源程序編輯好后可以用DSPCL編譯程序進(jìn)行編譯,生成OBJ文件。

使用格式:DSPCL源文件名 參數(shù)

例如: DSPCL EX1.C-V2XX-GK-MN
 
常用參數(shù)的意義:
V2XX——表示C編譯器選擇處理器2XX系列;
GK——保留編譯生成的匯編文件(.ASM文件);
MN——進(jìn)行正常優(yōu)化。

其它參數(shù)請(qǐng)參考DSP編譯器的手冊(cè)。如果有多個(gè)源文件分別編譯,每一個(gè)源文件經(jīng)編譯后產(chǎn)生一個(gè)OBJ文件和ASM文件。

2.3 目標(biāo)文件的鏈接

2.3.1 TI公司的COFF文件格式

TI公司新的匯編器和編譯器創(chuàng)建的目標(biāo)文件采用COFF(Common Object File Format)的目標(biāo)文件格式。采用COFF格式有利于模塊化編程,為管理代碼段和目標(biāo)系統(tǒng)存儲(chǔ)器提供更加有力和靈活的方法。基于COFF格式編寫匯編程序或C語言程序時(shí),不必為程序代碼和變量指定目標(biāo)地址;為程序編寫和程序移植提供了極大的方便。

COFF格式的基本思想是:鼓勵(lì)程序員在用匯編語言或C語言編程時(shí)運(yùn)用代碼塊和數(shù)據(jù)塊的概念。這種塊稱為SECTION,是目標(biāo)文件中的最小單位。

所有的塊分為兩大類:已初始化塊和未初始化塊。已初始化塊包含程序代碼和數(shù)據(jù),未初始化塊是為未初始化的數(shù)據(jù)在存儲(chǔ)器中的保留塊。C編譯器對(duì)C程序編譯后產(chǎn)生已初始化塊和未初始化塊,已初始化塊如.text塊、.const塊、.cinit塊;未初始化塊如.bss塊。

舉個(gè)例子,當(dāng)程序員用C語句float data[100];定義一個(gè)數(shù)組時(shí),不需要指定這100個(gè)數(shù)組元素的具體位置,編譯器會(huì)在數(shù)據(jù)區(qū)預(yù)留所需空間。到鏈接時(shí)鏈接器會(huì)具體定位。

2.3.2 鏈接器對(duì)塊的處理鏈接器對(duì)塊的處理有兩個(gè)功能:其一,將COFF目標(biāo)文件中的塊用來建立程序塊和數(shù)據(jù)塊,并將這些塊組合成可以被DSP芯片執(zhí)行的COFF輸出模塊;其二,鏈接器為輸出塊指定存儲(chǔ)位置。

鏈接器提供兩個(gè)命令實(shí)現(xiàn)上述功能:MEMORY和SECTIONS。MEMORY命令定義目標(biāo)系統(tǒng)的存儲(chǔ)器,程序員可以定義每一塊存儲(chǔ)器并指定起始地址和長度;SECTIONS命令用來定義輸入塊的組合和輸出塊在存儲(chǔ)器中的存放位置。若不用MEMORY和SECTIONS命令,鏈接器采用缺省的分配算法。推薦使用這兩個(gè)命令,但要注意這兩個(gè)命令在CMD文件(鏈接器命令文件)中使用。

下面分析一個(gè)TMS320F240芯片的典型CMD文件。(假設(shè)文件名 EX1.CMD。)

(1)CMD文件的構(gòu)成及其詳細(xì)解釋
BOOT.OBJ /*F240的中斷矢量表,參見后面的說明*/
EX1.OBJ /*源程序編譯后對(duì)應(yīng)的目標(biāo)文件*/
/*若程序有多個(gè)目標(biāo)文件,一塊寫在這里*/
-STACK 0X400 /*設(shè)定系統(tǒng)堆棧*/
-C /*ROM初始化*/
-O EX1.OUT /*輸出的文件名*/
-M EX1.MAP /*輸出映像文件名*/
-L RTS2XX.LIB /*漣接RTS2XX.LIB庫*/
MEMORY /*MEMORY命令規(guī)定系統(tǒng)的存儲(chǔ)器配置*/

PAGEO:ROM0:origin=0000h,length=003fh
/*FLASH ROM*/
PAGE0:ROM1:origin=0040h,length=0200h
/*FLASH ROM*/
PAGEO:ROM2:origin=0240h,length=3000h
/*FLASH ROM*/
PAGE1:RAM_B2:origin=0060h,length=0020h
/*內(nèi)部RAMB2*/
PAGE1:RAM_B1:origin=0300h,length=0100h
/*內(nèi)部RAM B1*/
PAGE1:RAM_B0:origin=0100h,length=0100h
/*內(nèi)部RAM B0*/
PAGE1:RAM_EX:origin=0d000h,length=2800h
/*外部擴(kuò)展RAM*/
}
SECTIONS /*SECTIONS命令規(guī)定了程序中塊的具體分配方法*/
{
.vectors:load=ROM0 /*規(guī)定矢量表的存放位置*/
.cinit:load=rom1 /*C初始化表的存放位置*/
.text: load=ROM2 /*系統(tǒng)程序的存放位置*/
.bSS load=RAM_B0 /*未初始化數(shù)據(jù)的存放位置*/
.const load=RAM_B1 *已初始化數(shù)據(jù)的存放位置*/


(2)TMS320F240鏈接時(shí)所需的中斷矢量表文件

TMS320F240的目標(biāo)文件在鏈接時(shí)要用到中斷矢量表。中斷矢量表用匯編語言編寫,和具體的DSP芯片有關(guān)。假設(shè)TMS320F240的中斷矢量表對(duì)應(yīng)的匯編程序?yàn)锽OOT.ASM,匯編后的文件名為BOOT.OBJ。

下面是一個(gè)典型的矢量表文件。(假設(shè)程序名為BOOT.ASM。)

.port /*定義中斷函數(shù)的名字*/
.globl_c_int0 /*中斷0對(duì)應(yīng)的函數(shù)名*/
.globl_c_int1 /*中斷1對(duì)應(yīng)的函數(shù)名,以下語句的意義相同*/
.globl_c_int2 /*可以將中斷函數(shù)名看作中斷入口地址*/
.globl_c_int3 /*矢量表的存放不需程序員干預(yù)*/
.globl_c_int4
.globl_c_int5
.globl_c_int6
.globl_c_int7
.globl_c_int8
·sect“.vectors”/*用.sect命令自定義一個(gè)塊,用于存放中斷矢量表*/
RSVECT B _c_int0 /*中斷0發(fā)生后,程序的跳轉(zhuǎn)目的地址*/
INT1 B _c_int1 /*中斷1發(fā)生后,則跳到c_int1()函數(shù)處*/
INT2 B _c_int2 /*意義同上,下同*/
INT3 B _c_int3
INT4 B _c_int4
INT5 B _c_int5
INT6 B _c_int6

用匯編器匯編該程序,命令形式:DSPABOOT.ASM-V2XX生成BOOT.OBJ文件供鏈接器使用。這樣,就可以按如下形式在C源程序中編寫中斷函數(shù):

voidc_inx() /*x為1~8中之一*/

中斷程序的C語句系列;


注意事項(xiàng):c_int0()是系統(tǒng)入口函數(shù),用戶不能編寫。

經(jīng)過上面對(duì)命令文件(CMD文件)和中斷矢量表的介紹,接下來可以鏈接命令文件來生成所需要的OUT文件供DSP芯片執(zhí)行或進(jìn)行軟仿真。

命令形式:DSPLNK CMD文件名

例如:DSPLNK EX1.CMD

另一種情況是,不使用CMD文件,使用缺省配置,簡(jiǎn)單介紹如下:

命令形式:DSPLNK OBJ文件名參數(shù)

例如:DSPLNK EX1.OBJ BOOT.OBJ-O XX1.OUT-M XX1.MAP

2.4程序的仿真

用EMURST仿真器復(fù)位命令

EMU2XXW EX1.OUT

載入COFF格式的二進(jìn)制代碼仿真運(yùn)行。有關(guān)調(diào)試器的使用略。
 
2.5程序的固化

程序仿真運(yùn)行正確后,需要固化到Flash ROM中。TMS320F240內(nèi)部有16K字的Flash ROM可以用來固化程序,而不需要外擴(kuò)EPROM(程序不大于16K字的情況下)。

TI公司提供有固化程序的軟件,可以通過仿真器經(jīng)JTAG口將程序?qū)懭胄酒瑑?nèi)、目前發(fā)展了一種新的固化技術(shù),可以通過串口寫入DSP芯片,特別適合于現(xiàn)場(chǎng)調(diào)試。下面介紹通過JTAG口的固化方法。

首先用EMURST命令復(fù)位調(diào)試器,然后執(zhí)行下面三個(gè)批處理文件。

第一步,執(zhí)行BCO.BAT批處理文件,將FlashROM清除(CLEAR),使全為0。

第二步,執(zhí)行BE0.BAT批處理文件,將FlashROM擦除(ERASE),使全為1。

(以上兩步不需要修改軟件包中自帶的這兩個(gè)BAT文件。)

第三步,執(zhí)行BP16K.BAT批處理文件,將自己的OUT文件寫入到DSP內(nèi)部的Flash ROM中。執(zhí)行這一步之前,要先修改BP16K,BAT,將待寫入的OUT文件替換成自己的OUT文件。下面看一下這個(gè)批處理文件。假設(shè)軟件包的安裝目錄為C:DSP,該目錄下有一個(gè)子目錄SRC。

prg2xx-p240-m0x0006-w6srcc2xx_bpx.out要寫入的OUT文件

如果要將EX1.OUT寫入到DSP的Flash中,則執(zhí)行下面的命令:

prg2xx-p240-m0x0006-w6srcc2xx_bpX.out c:dspEX1.out

經(jīng)過以上步驟即完成了程序固化,可以將系統(tǒng)放到現(xiàn)場(chǎng)實(shí)驗(yàn)了。

注意:固化程序時(shí),CPU一定要工作在20MHz的頻率下。在SRC子目錄下有一個(gè)配置文件C240_CFG.I,讀者可以根據(jù)程序說明并結(jié)合自己系統(tǒng)的外部晶振頻率將CPU的工作頻率設(shè)為20MHz(寫入時(shí)的頻率)。

歡迎轉(zhuǎn)載,信息來自維庫電子市場(chǎng)網(wǎng)(www.dzsc.com)


來源:ks990次

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

在工業(yè)物聯(lián)網(wǎng)設(shè)備部署中,Modbus通信故障是導(dǎo)致系統(tǒng)停機(jī)的首要原因之一。據(jù)統(tǒng)計(jì),超過60%的現(xiàn)場(chǎng)問題源于通信配置錯(cuò)誤或數(shù)據(jù)解析異常。本文從嵌入式系統(tǒng)開發(fā)視角,系統(tǒng)闡述Modbus通信調(diào)試的方法論,結(jié)合實(shí)際案例解析如何高...

關(guān)鍵字: 嵌入式系統(tǒng) Modbus通信

在嵌入式系統(tǒng)開發(fā)中,看門狗(Watchdog Timer, WDT)是保障系統(tǒng)可靠性的核心組件,其初始化時(shí)機(jī)的選擇直接影響系統(tǒng)抗干擾能力和穩(wěn)定性。本文從硬件架構(gòu)、軟件流程、安全規(guī)范三個(gè)維度,系統(tǒng)分析看門狗初始化的最佳實(shí)踐...

關(guān)鍵字: 單片機(jī) 看門狗 嵌入式系統(tǒng)

人工智能(AI)和機(jī)器學(xué)習(xí)(ML)是使系統(tǒng)能夠從數(shù)據(jù)中學(xué)習(xí)、進(jìn)行推理并隨著時(shí)間的推移提高性能的關(guān)鍵技術(shù)。這些技術(shù)通常用于大型數(shù)據(jù)中心和功能強(qiáng)大的GPU,但在微控制器(MCU)等資源受限的器件上部署這些技術(shù)的需求也在不斷增...

關(guān)鍵字: 嵌入式系統(tǒng) 人工智能 機(jī)器學(xué)習(xí)

Zephyr開源項(xiàng)目由Linux基金會(huì)維護(hù),是一個(gè)針對(duì)資源受限的嵌入式設(shè)備優(yōu)化的小型、可縮放、多體系結(jié)構(gòu)實(shí)時(shí)操作系統(tǒng)(RTOS)。近年來,Zephyr RTOS在嵌入式開發(fā)中的采用度逐步增加,支持的開發(fā)板和傳感器不斷增加...

關(guān)鍵字: 嵌入式系統(tǒng) 軟件開發(fā) 實(shí)時(shí)操作系統(tǒng) Zephyr項(xiàng)目

在資源受限的嵌入式系統(tǒng)中,代碼執(zhí)行效率和內(nèi)存占用始終是開發(fā)者需要權(quán)衡的核心問題。內(nèi)聯(lián)函數(shù)(inline functions)和宏(macros)作為兩種常見的代碼展開技術(shù),在性能、可維護(hù)性和安全性方面表現(xiàn)出顯著差異。本文...

關(guān)鍵字: 內(nèi)聯(lián)函數(shù) 嵌入式系統(tǒng)

在嵌入式系統(tǒng)和服務(wù)器開發(fā)中,日志系統(tǒng)是故障排查和運(yùn)行監(jiān)控的核心組件。本文基于Linux環(huán)境實(shí)現(xiàn)一個(gè)輕量級(jí)C語言日志庫,支持DEBUG/INFO/WARN/ERROR四級(jí)日志分級(jí),并實(shí)現(xiàn)按大小滾動(dòng)的文件輪轉(zhuǎn)機(jī)制。該設(shè)計(jì)在某...

關(guān)鍵字: C語言 嵌入式系統(tǒng)

在嵌入式系統(tǒng)和底層驅(qū)動(dòng)開發(fā)中,C語言因其高效性和可控性成為主流選擇,但缺乏原生單元測(cè)試支持成為開發(fā)痛點(diǎn)。本文提出一種基于宏定義和測(cè)試用例管理的輕量級(jí)單元測(cè)試框架方案,通過自定義斷言宏和測(cè)試注冊(cè)機(jī)制,實(shí)現(xiàn)無需外部依賴的嵌入...

關(guān)鍵字: C語言 嵌入式系統(tǒng) 驅(qū)動(dòng)開發(fā)

在嵌入式系統(tǒng)與驅(qū)動(dòng)開發(fā)中,內(nèi)存映射I/O(Memory-Mapped I/O, MMIO)是一種將硬件寄存器映射到處理器地址空間的技術(shù),允許開發(fā)者通過指針直接讀寫寄存器,實(shí)現(xiàn)高效、低延遲的硬件控制。本文通過C語言實(shí)戰(zhàn)案例...

關(guān)鍵字: 內(nèi)存映射 I/O操作 嵌入式系統(tǒng)

在嵌入式系統(tǒng)開發(fā)和多線程編程中,程序崩潰、內(nèi)存越界等復(fù)雜問題常令開發(fā)者困擾。GDB作為強(qiáng)大的調(diào)試工具,其條件斷點(diǎn)和內(nèi)存查看功能可精準(zhǔn)定位隱蔽缺陷。本文通過實(shí)際案例演示這些高級(jí)功能的應(yīng)用,幫助開發(fā)者提升調(diào)試效率。

關(guān)鍵字: GDB 嵌入式系統(tǒng)
關(guān)閉