




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第章處理器的軟件設計12/14/20221第一頁,共55頁。C55x處理器軟件開發流程(liúchéng)12/14/20222第二頁,共55頁。4.1C55x處理器程序基本(jīběn)結構根據任務調度的方式不同分為兩類由程序自己完成任務調度運行效率高,對硬件中斷響應快程序運行穩定,適合于任務較為單一實時性較強的應用由嵌入式操作系統完成任務調度利用處理器同時完成多個任務簡化了應用系統軟件設計良好(liánghǎo)的多任務設計有助于提高系統的穩定性和可靠性12/14/20223第三頁,共55頁。
自我調度程序組成中斷程序部分通過設置判斷標志來影響主循環部分的運行初始化部分DSP軟、硬件的初始化設置啟動(qǐdòng)系統硬件使能DSP中斷啟動(qǐdòng)DMA傳送等主循環部分數據輸入、處理和輸出等,條件判斷和處理模塊等12/14/20224第四頁,共55頁。中斷程序1 ……… 中斷程序m; Main() { DSP_INT(){……}; //DSP軟硬件初始化,啟動(qǐdòng)、使能 for(;;) //主循環 { if(條件1) //判斷條件1 { 處理模塊1; //條件滿足運行處理模塊1 }; …… if(條件n) //判斷條件n { 處理模塊n; //條件滿足運行處理模塊n }; } }12/14/20225第五頁,共55頁。
硬實時方式按照固定時鐘節拍切換任務不僅要執行無誤,而且(érqiě)要準時軟實時方式由軟件來進行任務的切換使各個任務盡快運行,而不要求限定某個任務在多長時間內完成12/14/20226第六頁,共55頁。嵌入式操作系統的核心是操作系統內核優先級的內核可以分成兩種類型不可剝奪型內核——合作型多任務要求每個任務能夠主動放棄CPU使用權每個任務相互合作,共享一個CPU異步事件由中斷服務來處理,高優先級任務由掛起態變為就緒態允許任務使用不可重入函數優點是響應中斷快,缺點是響應時間具有不確定性可剝奪型內核具有最高優先級的任務就緒,得到CPU的使用權不應直接使用不可重入函數,否則(fǒuzé)應滿足互斥條件主要工作是完成任務(線程)的調度12/14/20227第七頁,共55頁。任務(rènwu)(線程)管理任務是一個無限循環,必須處于下列五個狀態之一休眠狀態任務駐留在內存之中,但并沒有被系統內核所調用。就緒狀態任務已經準備好,但由于該任務的優先級比正在運行的任務的優先級低,還暫時(zànshí)不能運行。運行狀態任務擁有CPU的使用權,正在運行。掛起狀態任務正在等待某一個事件的發生以結束目前的等待。被中斷狀態發生中斷,CPU進入中斷服務程序,而暫時(zànshí)不能運行當前的任務。12/14/20228第八頁,共55頁。任務(rènwu)狀態轉換等待就緒12/14/20229第九頁,共55頁。兩種類型(lèixíng)二進制型—看做一個只有一位的計數器型信號量計數器型兩個任務之間利用信號量來取得同步單向同步任務用一個信號量觸發另一個任務雙向同步信號量—嵌入式操作系統的約定(yuēdìng)機制12/14/202210第十頁,共55頁。4.2C語言程序開發及優化C語言中的數據類型
12/14/202211第十一頁,共55頁。C語言中的數據類型
12/14/202212第十二頁,共55頁。定義各種數據類型時應注意如下規則:避免設int和long為相同大小。對定點算法(特別是是乘法)盡量使用int數據類型。用long類型作乘法操作數會導致調用運行時間庫(run-timelibrary)的程序。使用int或unsignedint類型而非long類型來循環計數避免設char為8位或long為64位。當所寫代碼用于多DSP目標系統中時,宜定義genetic類型。比如,一個人可以對16位整數和32位整數分別使用int16和int32。當對C55xDSP進行編譯時,這些類型會分別被定義成int和long。最好(zuìhǎo)使用int類型作循環指數變量和其它位數不太重要時的整型變量,因為int是對目標系統操作最高效的整數類型而不管芯片結構如何。12/14/202213第十三頁,共55頁。4.2關鍵字const關鍵字C55xC編譯器支持標準C語言的const關鍵字。將這個關鍵字使用到對任意變量或數組的定義上可以確保它們的值不改變(gǎibiàn)。如果定義一個對象為const,那么const段就會為該對象分配存儲空間。使用const關鍵字可以定義大常數表并將它們分配到系統ROM中。12/14/202214第十四頁,共55頁。ioport關鍵字——對I/O空間進行尋址關鍵字ioportioport類型只能用來聲明全局或靜態變量。在本地變量中使用ioport類型,則變量必須(bìxū)用指針聲明。指針(zhǐzhēn)聲明ioport類型舉例:voidfoo(void){ioportinti;/*無效的聲明*/ioportint*j;/*有效聲明*/}注意:聲明ioport類型的指針(zhǐzhēn)只有16位12/14/202215第十五頁,共55頁。在printf()中引用ioport指針的舉例(jǔlì):ioportint*p;printf(“%p\n”,(void*)p);注意:必須進行強制類型轉換(void*)在本地變量中使用(shǐyòng)ioport類型的舉例:int*ioportioport_pointer;/*ioport指針*/inti;intj;voidfoo(void){ioport_pointer=&i;j=*ioport_pointer;}編譯(biānyì)結果:_foo:MOV#_i,port(#_ioport_pointer);存儲i在I/O空間的地址MOVport(#_ioport_pointer),AR3;載入i的地址MOV*AR3,AR1;將i的內容存放到AR1中MOVAR1,*as16(#_j)將的i內容保存到jreturn12/14/202216第十六頁,共55頁。指向I/O空間數據指針(zhǐzhēn)舉例/*指向ioport數據:*/ioportint*ptr_to_ioport;ioportinti;voidfoo(void){intj;i=10;ptr_to_ioport=&i;j=*ptr_to_ioport;}編譯(biānyì)結果:_foo:MOV#_i,*abs16(#_ptr_to_ioport);存儲_i的地址MOV*abs16(#_ptr_to_ioport),AR3AADD#–1,SP;修改堆棧MOV#10,port(#_i);向_i中存入10MOV*AR3,AR1;(AR3)→AR1MOVAR1,*SP(#0)AADD#1,SP;修改堆棧return12/14/202217第十七頁,共55頁。利用(lìyòng)ioport指針指向I/O空間的數據的舉例:/*指向ioport數據的ioport指針:*/ioportint*ioportiop_ptr_to_ioport;ioportinti;ioportintj;voidfoo(void){i=10;iop_ptr_to_ioport=&i;j=*iop_ptr_to_ioport;}編譯結果如下:_foo:MOV#10,port(#_i);將10存在_i中MOV#_i,port(#_iop_ptr_to_ioport);存儲(cúnchǔ)_i的地址MOVport(#_iop_ptr_to_ioport),AR3;載入_i的地址MOV*AR3,AR1;載入_iMOVAR1,port(#_j);將10存到_j中return12/14/202218第十八頁,共55頁。interrupt關鍵字定義中斷函數中斷函數必須返回(fǎnhuí)空并且沒有參數傳遞中斷函數可以定義本地變量并且使用堆棧定義中斷(zhōngduàn)函數舉例:
interruptvoidint_handler(){unsignedintflags;...}12/14/202219第十九頁,共55頁。onchip關鍵字告訴編譯器由該關鍵字定義的指針所指向的數據(shùjù)可以作為一個雙乘法指令中的操作數用onchip定義數組和指針(zhǐzhēn)的舉例:onchipintx[100]; /*arraydeclaration*/onchipint*p; /*pointerdeclaration*/12/14/202220第二十頁,共55頁。在任何情況下,優化器會通過分析(fēnxī)數據流來避免存儲器訪問。如果程序依靠存儲器訪問,則必須使用volatile關鍵字來指明這些訪問。編譯器將不會優化任何對volatile變量的引用12/14/202221第二十一頁,共55頁。如果將未經優化的C語言程序直接運行會發現運行效率較低,并且產生的代碼較大,而通過優化可以較好地解決這些問題。優化的作用是對循環進行化簡,重新組織表達式和聲明(shēngmíng),將變量直接分配到寄存器中。通過優化可以提高程序運行效率,縮小程序編碼數量。12/14/202222第二十二頁,共55頁。第4章C55x處理器的軟件設計
C語言的優化C/C++編譯器提供了不同的優化選擇,通過修改cl55命令行中的-on選擇就可以方便地選擇不同的優化等級,n代表(dàibiǎo)優化等級,包括0、1、2和3。下面給出不同優化等級的功能。(1)o0簡化控制流圖把變量分配到寄存器分析(fēnxī)循環的各種情況,只保留一個退出循環的分支刪除未用的代碼簡化表達式和聲明把用inline聲明的函數變為調用關系12/14/202223第二十三頁,共55頁。第4章C55x處理器的軟件設計
(2)o1除了o0的各種優化功能外,還有如下功能:在分配變量時,將數值直接(zhíjiē)賦給變量而不是給出變量的索引值去掉沒有用的分配變量和表達式去掉本地通用表達式12/14/202224第二十四頁,共55頁。第4章C55x處理器的軟件設計
(3)o2除了o1的各種優化功能外,還有如下功能:完成循環優化去掉全局通用的子表達式去掉全局沒有用的分配變量和表達式完成循環的化解(huàjiě)當只用-o選項時優化器自動進行-o2優化12/14/202225第二十五頁,共55頁。第4章C55x處理器的軟件設計
(4)o3除了o2的各種優化功能外,還有如下功能:去掉未調用的函數(hánshù)簡化返回值未使用的函數(hánshù)將小函數(hánshù)進行內嵌調用對被調用的函數(hánshù)聲明進行重新排序,以便被優化的調用方能夠找到該函數(hánshù)完成文件級優化12/14/202226第二十六頁,共55頁。第4章C55x處理器的軟件設計C語言的優化優化器分析數據流時將盡量減少對內存的訪問,如果這個數據必須從內存中得到,則該數據必須用volatile關鍵字定義,這樣可以使編譯器不對該變量進行優化。例如聲明一個指針unsignedint*ctrl;當在循環(xúnhuán)中有如下語句時 while(*ctrl!=0xFF);
優化器將只在進入循環的初始化中進行一次內存讀,而在循環當中不在更新該變量的內容,如果該變量被中斷或其他程序改變(gǎibiàn),由于循環中的ctrl的值沒有更新,將會使程序不能按照正確的方式執行,這里應當用如下方法聲明ctrl:volatileunsignedint*ctrl;特別當該變量在中斷函數中被賦值,而該變量在主函數的循環中被用到時,必須用volatile聲明該變量。12/14/202227第二十七頁,共55頁。4.3C語言與匯編語言(huìbiānyǔyán)的混合編程采用匯編語言編程能夠針對所采用DSP芯片(xīnpiàn)的具體特點,所編程序執行效率高。但是,不同公司的DSP芯片(xīnpiàn)所提供的匯編語言各不相同,即使是同一公司的芯片(xīnpiàn),由于芯片(xīnpiàn)的類型不同,其匯編語言也不盡相同。用匯編語言開發DSP產品周期很長,軟件修改、升級、移植都非常困難。采用C語言編程具有開發效率高的優點,有助于提高產品開發速度,程序修改、升級和移植也很方便。但是,與匯編語言編寫的程序相比,C語言的執行效率較低,通常不能滿足實時性要求,且無法控制某些硬件。一般來說,只是在DSP運算能力不是很緊張時才采用C語言開發DSP程序,更加普遍的是采用C和匯編語言混合編程。通常,對于實時性要求不高的部分如主控程序采用C語言編寫,對于實時性要求較高的模塊如FFT、FIR/IIR濾波等則采用匯編語言編寫。12/14/202228第二十八頁,共55頁。在C語言中直接(zhíjiē)嵌套匯編語句需在嵌入的匯編語句前面加上asm標識符,左右加上一個雙引號和一個小括號。用C打開中斷(zhōngduàn)的代碼:IRQ_globalEnable(); //全局開中斷(zhōngduàn) 該代碼編譯后的結果:0115A6IRQ_globalEnable:0115A63C3BMOV#3,AR30115A8DF6105MOVuns(*AR3),AC00115AB76080040BFXTR#2048,AC0,T00115AF20NOP0115B046B2BCLRST1_INTM0115B24804RET采用(cǎiyòng)嵌套匯編語句的方法asm(“BCLRST1_INTM”)
12/14/202229第二十九頁,共55頁。在C環境下對特殊操作使用特殊寄存器有嚴格的規定,C程序中嵌入匯編程序需要(xūyào)遵循這些規則,所以DSP程序員必須懂得寄存器規則。寄存器規則規定了編譯器如何使用寄存器和如何在函數調用時保存數值。寄存器規則規定在函數調用時用到的寄存器要預先保存。這個工作部分由父函數完成,沒有被父函數保存而子函數又用到的由子函數保存。12/14/202230第三十頁,共55頁。寄存器保存者用途AC0,AC1,AC2,AC3父函數16,32或40位數據,或24位代碼指針(X)AR0~(X)AR4父函數16或23位指針,或16位數據(X)AR5~(X)AR7子函數16位數據T0,T1父函數T2,T3子函數ST0,ST1,ST2父函數ST3父函數RPTC父函數CSR父函數1.C/C++中的寄存器使用(shǐyòng)和保存規則(1)12/14/202231第三十一頁,共55頁。寄存器使用和保存(bǎocún)規則(2)寄存器保存者用途BRC0、BRC1父函數BRS1父函數BSA0、REA1父函數SPSSPPCRETA子函數CFCT子函數狀態(zhuàngtài)寄存器記錄了DSP運行狀態(zhuàngtài)。表4-3(P104)給出了狀態(zhuàngtài)寄存器ST0-55~ST3-55各字段作用、默認值及能否修改。12/14/202232第三十二頁,共55頁。2.函數調用規則(guīzé)C編譯器對函數調用有一套嚴格的規則。除了特殊的運行時間支持函數,其它任何函數不管調用還是被調用都必須(bìxū)遵循這些規則。不滿足這些規則會破壞C環境并會導致程序失敗。12/14/202233第三十三頁,共55頁。(1)父函數如何(rúhé)調用其它函數父函數將所要傳遞到子函數的參數(cānshù)放入寄存器或堆棧。如果子函數的參量用省略號聲明(表示參量數量可變),則首先把最后一個顯式聲明的參量傳到堆棧,然后再把其它參量傳到堆棧。堆棧地址將作為訪問其它未聲明參量的索引最后一個參量之前所聲明的參量遵循下面(xiàmian)的規則:編譯器通常先對要傳遞的參量分類,然后按照類型將參量放進寄存器。編譯器使用的參量有3類:數據指針(int*,long*等)16位數據(char,short,int)32位數據(long,float,double,函數指針)如果參量指向數據類型,這個參量就是數據指針;如果一個參量能放進16位寄存器,就可以看成16位數據,否則就是32位數據。12/14/202234第三十四頁,共55頁。雙字長(32位)或少于雙字長的結構體會被當成32位數據參量,并通過寄存器傳遞。如果(rúguǒ)結構體長度大于32位,則通過索引傳輸,即編譯器將該結構體的地址作為一個數據指針傳遞。如果(rúguǒ)子函數返回的值是一個結構或一個聯合,則父函數在本地堆棧為結構分配相應的大小。父函數將該空間的地址作為第一個隱含參數送給子函數,這個參數被看作一個數據指針。參量按照在函數聲明中的排列順序被分配給寄存器。參量放置的寄存器類型由參數的類型決定。如果(rúguǒ)參量的數量超過可用寄存器數量,多余的參量會被壓入堆棧。12/14/202235第三十五頁,共55頁。表4-4C語言函數調用中參數(cānshù)與寄存器的排列關系參數類型寄存器分配順序對應的數據類型16或23位數據指針(X)AR0,(X)AR1,(X)AR2,(X)AR3,(X)AR4數組,字符串,指針或占用空間超過2字節長的結構體16位數據T0,T1,AR0,AR1,AR2,AR3,AR4(無符號)字符,短整數,整數32位數據AC0,AC1,AC2長整數,浮點數和長度不大于2個字節的結構體12/14/202236第三十六頁,共55頁。運行效率高,對硬件中斷響應快參量放置的寄存器類型由參數的類型決定。MOV#10,AC0ioportinti;將的i內容保存到j中斷函數必須返回(fǎnhuí)空并且沒有參數傳遞例,寄存器參量(cānliàng)規則。數字信號處理庫采用4種方式解決溢出問題(定點):第三十五頁,共55頁。在C環境下對特殊操作使用特殊寄存器有嚴格的規定,C程序中嵌入匯編程序需要(xūyào)遵循這些規則,所以DSP程序員必須懂得寄存器規則。第二十九頁,共55頁。如果一個參量能放進16位寄存器,就可以看成16位數據,否則就是32位數據。數據輸入、處理和輸出等,條件判斷和處理模塊等編譯(biānyì)結果:SARAM2(RWIX):o=0030000h,l=0020000h比如,一個人可以對16位整數和32位整數分別使用int16和int32。子函數的返回(fǎnhuí)參數也將根據返回(fǎnhuí)參數的類型使用不同的寄存器,表給出了這一對應關系。子函數返回類型
所使用寄存器
說明
voidchar,unsignedchar,shortint,int
longint,float,doublestructT0AC0(X)AR0
無返回參數返回16位數據返回32位數據返回地址
表4-5C語言函數調用中返回參數(cānshù)所使用寄存器表12/14/202237第三十七頁,共55頁。(2)子函數保存所有的入口保存寄存器(save-on-entryregisters,T2、T3、AR5~AR7)。
父函數必須通過壓入堆棧(duīzhàn)來保存其它在調用后會用到寄存器的值。(3)父函數(hánshù)對子函數(hánshù)進行調用。(4)父函數(hánshù)收集返回值。短數據、長數據和數據指針分別返回在T0、AC0和(X)AR0中。如果子函數返回的是一個結構,則父函數在本地堆棧中為結構體分配相應大小的空間。父函數將該空間地址作為第一個隱含參量傳送給子函數,這個參數被看成一個數據指針。12/14/202238第三十八頁,共55頁。例,寄存器參量(cānliàng)規則。structbig{longx[10];};structsmall{intx;};intfn(inti1,longl2,int*p3);T0T0AC0AR0longfn(int*p1,inti2,inti3,inti4);AC0AR0T0T1AR1structbigfn(int*p1);AR0AR1intfn(structbigb,int*p1);T0AR0AR112/14/202239第三十九頁,共55頁。structsmallfn(int*p1);AC0AR0intfn(structsmallb,int*p1);T0AC0AR0intprintf(char*fmt,);T0stackstack...voidfn(longl1,longl2,longl3,longl4,inti5);AC0AC1AC2stackT0voidfn(longl1,longl2,longl3,int*p4,int*p5,AC0AC1AC2AR0AR1int*p6,int*p7,int*p8,inti9,inti10);AR2AR3AR4T0T112/14/202240第四十頁,共55頁。3.被調用函數(子函數)的響應(xiǎngyìng)(1)被調用函數為局部變量、臨時存儲空間及函數可能調用的參數分配足夠的存儲空間。這些工作在函數調用開始的時候就完成了。(2)如果子函數修改一些寄存器(T2、T3、AR5~AR7),必須將這些值壓入堆棧或存儲到一個沒用的寄存器中。如果子函數修改其它的寄存器則不用保存其中的值。(3)如果子函數的參數是一個結構,則它所接收到的是一個指向(zhǐxiànɡ)該結構的指針。如果在被調用函數中需要對結構進行寫操作,則需要把這個結構體復制到本地空間中。如果不進行寫操作,則可以直接通過指針訪問這個結構。12/14/202241第四十一頁,共55頁。(4)子函數執行代碼。(5)如果子函數返回一個值,它將該值按照以下規則放置:短整型數據值返回到T0中長整型數據值返回到AC0中數據指針值返回到(X)AR0中如果子函數返回結構體,父函數就會為結構體分配存儲空間并傳送(chuánsònɡ)指向這個空間的指針到(X)AR0中。要返回這個結構體,被調用函數只要將該結構體復制到被這個指針所指的存儲模塊中。(6)子函數存儲所有在第2步中保存的寄存器。(7)子函數將原來的值存儲到堆棧中。(8)函數返回。12/14/202242第四十二頁,共55頁。第4章C55x處理器的軟件設計
C/C++與匯編語言可以通過多種方式聯系在一起,其中包括在C/C++中引用匯編語言中的常量或變量,并可以在C語言模塊中調用(diàoyòng)匯編代碼模塊。C/C++調用(diàoyòng)匯編語言模塊時需要符合前面所述的寄存器規則和函數調用(diàoyòng)規則。在調用(diàoyòng)匯編模塊時還應注意如下問題:4.C/C++與匯編語言(huìbiānyǔyán)的接口⑴調用C54x匯編函數時,應使用C54X_CALL或C54X_FAR_CALL關鍵字。⑵如果用匯編語言編寫中斷例程,則需要保存在中斷例程中使用的所有寄存器。⑶如果在匯編程序中調用C/C++函數,則只有特定的寄存器在C/C++中被保存,而其他寄存器則可能被C/C++函數改變。⑷在定義匯編函數名和變量(biànliàng)時,需要在函數名前加上下劃線“_”來讓編譯器識別。12/14/202243第四十三頁,共55頁。第4章C55x處理器的軟件設計在C語言中調用匯編(huìbiān)函數和變量舉例調用匯編(huìbiān)函數的例子如下:C語言程序:/*聲明外部(wàibù)匯編函數*/externintasmfunc(int,int*);intgvar;/*定義全局變量*/main(){inti;i=asmfunc(i,&gvar);/*調用函數*/}匯編程序(huìbiānchénɡxù):_asmfunc:ADD*AR0,T0,T0;gvar+T0=>i,i=T0RETURN;返回12/14/202244第四十四頁,共55頁。第4章C55x處理器的軟件設計
調用匯編模塊(mókuài)中所定義變量的例子如下:匯編程序:.bss_var,1;定義變量(biànliàng).global_var;定義其為外部引用C語言程序:externintvar;/*外部(wàibù)變量*/var=1;/*使用變量*/12/14/202245第四十五頁,共55頁。第4章C55x處理器的軟件設計
⑸如果C/C++中的變量要在匯編語言(huìbiānyǔyán)中訪問,則該變量應用.global聲明。⑹編譯器所默認的CPL值為1,即采用間接絕對方式尋址,如果在匯編(huìbiān)函數中CPL被設置為0,在函數返回時應當把這個值改為1。下面的例子是對應CPL=1或=0時所使用的不同匯編(huìbiān)語句:MOV*(#global_var),AR3;CPL==1MOVglobal_var,AR3;CPL==012/14/202246第四十六頁,共55頁。⑺在匯編語言中可以通過.set、.global命令聲明全局(quánjú)常量,這些常量在C/C++中可以通過特殊的方式訪問。例如試圖訪問常量X,則在該常量名前需要加上“&”操作符,即在C/C++中該常量名為&X。例如:第4章C55x處理器的軟件設計
匯編語言:_table_size.set10000 ;定義常量.global_table_size ;定義的變量(biànliàng)可以被全局訪問C語言程序:externinttable_size; /*外部(wàibù)參數*/#defineTABLE_SIZE((int)(&table_size))…………for(i–0;i<TABLE_SIZE;++i)/*使用該常數*/12/14/202247第四十七頁,共55頁。4.4通用目標文件格式匯編器和鏈接器產生的可執行文件所采用的格式段—編譯器產生的可以重新定位的代碼和數據塊初始化段代碼段(.text段)、數據段(.data段)常數段(.const段)、存儲變量(biànliàng)段(.sect段)未初始化段存儲全局和靜態變量(biànliàng)的.bss段存儲變量(biànliàng)段(.usect段)堆棧和系統堆棧段(.stack和.sysstack)為分配動態存儲器保留的.sysmem段12/14/202248第四十八頁,共55頁。
分配數據的例子: #pragmaDATA_SECTION(bufferB,“my_sect”) charbufferA[512]; charbufferB[512]; 編譯后的結果如下: .global_bufferA .bss_bufferA,512,0,0(symbol,sizeinwords,[,blocking][,alignment]) .global_bufferB_bufferB:.usect“my_sect”,512,0,0匯編語言(huìbiānyǔyán)中為代碼分配段的例子:.textMOV#10,AC0MOVAC0,AC112/14/202249第四十九頁,共55頁。匯編語言中為數據分配(fēnpèi)段的例子:.data.word9,10.word11,12在匯編文件中可以定義變量和為數組預留空間:.def_I_east_data.def_Q_east_data.def_I_west_data.def_Q_west_data.def_x.sectinput_I_east_data:.space20*16 ;保留20個字的空間_Q_east_data:.space20*16 ;保留20個字的空間_I_west_data:.space20*16 ;保留20個字的空間_Q_west_data:.space20*16 ;保留20個字的空間_x:.word012/14/202250第五十頁,共55頁。
小存儲器模式.text(代碼段)、.switch(狀態轉化段)以及.cinit/.pinit(變量初始化段)的長度和位置都不受限制數據指針為16位(64K限制,.bss,.data,.stack,.sysstack,.system,.const應在同一段內)大存儲器模式——在編譯器中設置-ml選項數據指針為23位代碼段可以跨越頁邊界(biānjiè),其它不能C/C++系統堆棧用來保存處理器信息,向函數傳遞參數以及分配局部變量系統默認主堆棧和輔助堆棧在同一內存頁且長度都是1000個字節動態內存分配動態內存分配函數:malloc、calloc和realloc結構的對齊為結構的所有成員分配空間,并保證結構的長度為偶數12/14/202251第五十一頁,共55頁。d文件的具體(jùtǐ)實例/**********************************************************************lnk55x<objfiles...>-o<outfile>-m<mapfile>lnkd*cl55x<srcfiles...>-z-o<outfile>-m<mapfile>lnkd/********************************************************************/-c /*不區分大小寫*/-m a1.map /*生成.map文件*/-stack0x1800/*主堆棧尺寸*/-sysstack0x1800/*系統堆棧尺寸*/-heap0x100/*動態內存大小*//*SetentrypointtoResetvector*/設置復位(fùwèi)向量入口/*-AllowsResetISRtoforceIVPD/IVPHtopointtovectortable.*/-eRESET_ISR12/14/202252第五十二頁,共55頁。/*設置系統內存映射(yìngshè)*/屬性RWIX(Read,Write,Initial,eXcuted)/*載入及鏈接使用字節地址*/MEMORY{PAGE0:;originlengthMMR(RWIX):o=0000000h,l=00000C0hDARAM0(RWIX):o=00000C0h,l=000af40hDARAM1(RWIX):o=000b000h,l=0000800hDARAM2(RWIX):o=000b800h,l=0000800hDARAM3(RWIX):o=000c000h,l=0000800hDARAM4(RWIX):o=000c800h,l=0000800hDARAM5(RWIX):o=000d000h,l=0000800hDARAM6(RWIX):o=000d800h,l=0002000hDARAM7(RWIX):o=000f800h,l=0000800hSARAM0(RWIX):o=0010000h,l=0010000hSARAM1(RWIX):o=0020000h,l=0010000hSARAM2(RWIX):o=0030000h,l=0020000hCE0(RWIX):o=0050000h,l=0100000hCE1(RWIX):o=0400000h,l=0400000hPDROM(RX):o=0FF8000h,l=0008000hPAGE1:CE2(RWIX):o=0400000h,l=0200000hCE3(RWIX):o=0600000h,l=0100000hPAGE2:IOPORT(RWI):o=0000000h,l=0020000h}12/14/202253第五十三頁,
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 城市交通智能化升級項目協議
- 旅游服務行業從業及表現證明(5篇)
- 機械工程原理及設備維護案例分析
- 農業領域產品種類表
- 藝德家政考試試題及答案
- 六一助殘活動方案
- 六一商場品牌活動方案
- 六一孩子活動方案
- 醫學考試試題及答案解析
- 六一扁食活動方案
- 設備委托服務合同協議
- 2025至2030中國芳綸纖維行業需求預測及發展前景趨勢研究報告
- 初級保健按摩師(脊柱按摩師)資格理論必背考試題(附答案)
- 2025屆新高考歷史押題模擬試卷 3套(含答案解析)
- 2025年銀行從業資格證考試題庫獲取試題及答案
- 十一學校小升初入學測試數學真題及詳細解答
- 4-02-02-01 國家職業標準客運車輛駕駛員 (2025年版)
- 2024北京西城區四年級(下)期末語文試題及答案
- 【航線補貼績效評估實證研究-以華夏航空公司為例19000字(論文)】
- 婚內賭博欠債協議書范本
- 造價咨詢項目管理制度
評論
0/150
提交評論