版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、2020/8/1,東華理工大學(xué)機(jī)械與電子工程學(xué)院,1,第4章 C55x處理器的軟件設(shè)計(jì),C55x處理器程序基本結(jié)構(gòu) C語(yǔ)言程序開發(fā)及優(yōu)化 C語(yǔ)言與匯編語(yǔ)言的混合編程 通用目標(biāo)文件格式 C55x處理器的數(shù)字信號(hào)處理庫(kù)和圖像、視頻處理庫(kù),2020/8/1,東華理工大學(xué)機(jī)械與電子工程學(xué)院,2,C55x處理器軟件開發(fā)流程,2020/8/1,東華理工大學(xué)機(jī)械與電子工程學(xué)院,3,4.1 C55x處理器程序基本結(jié)構(gòu),根據(jù)任務(wù)調(diào)度的方式不同分為兩類 由程序自己完成任務(wù)調(diào)度 運(yùn)行效率高,對(duì)硬件中斷響應(yīng)快 程序運(yùn)行穩(wěn)定,適合于任務(wù)較為單一 實(shí)時(shí)性較強(qiáng)的應(yīng)用 由嵌入式操作系統(tǒng)完成任務(wù)調(diào)度 利用處理器同時(shí)完成多個(gè)任務(wù)
2、 簡(jiǎn)化了應(yīng)用系統(tǒng)軟件設(shè)計(jì) 良好的多任務(wù)設(shè)計(jì)有助于提高系統(tǒng)的穩(wěn)定性和可靠性,2020/8/1,東華理工大學(xué)機(jī)械與電子工程學(xué)院,4,4.1.1 自我調(diào)度程序的基本結(jié)構(gòu),自我調(diào)度程序組成 中斷程序部分 通過(guò)設(shè)置判斷標(biāo)志來(lái)影響主循環(huán)部分的運(yùn)行 初始化部分 DSP軟、硬件的初始化設(shè)置 啟動(dòng)系統(tǒng)硬件 使能DSP中斷 啟動(dòng)DMA傳送等 主循環(huán)部分 數(shù)據(jù)輸入、處理和輸出等,條件判斷和處理模塊等,2020/8/1,東華理工大學(xué)機(jī)械與電子工程學(xué)院,5,中斷程序1 中斷程序m; Main( ) DSP_INT( ); /DSP軟硬件初始化,啟動(dòng)、使能 for(;)/主循環(huán) if(條件1)/判斷條件1 處理模塊1;/
3、條件滿足運(yùn)行處理模塊1 ; if(條件n)/判斷條件n 處理模塊n;/條件滿足運(yùn)行處理模塊n ; ,2020/8/1,東華理工大學(xué)機(jī)械與電子工程學(xué)院,6,4.1.2 應(yīng)用嵌入式操作系統(tǒng),硬實(shí)時(shí)方式 按照固定時(shí)鐘節(jié)拍切換任務(wù) 不僅要執(zhí)行無(wú)誤,而且要準(zhǔn)時(shí) 軟實(shí)時(shí)方式 由軟件來(lái)進(jìn)行任務(wù)的切換 使各個(gè)任務(wù)盡快運(yùn)行,而不要求限定某個(gè)任務(wù)在多長(zhǎng)時(shí)間內(nèi)完成,2020/8/1,東華理工大學(xué)機(jī)械與電子工程學(xué)院,7,嵌入式操作系統(tǒng)的核心是操作系統(tǒng)內(nèi)核 優(yōu)先級(jí)的內(nèi)核可以分成兩種類型 不可剝奪型內(nèi)核合作型多任務(wù) 要求每個(gè)任務(wù)能夠 主動(dòng)放棄CPU使用權(quán) 每個(gè)任務(wù)相互合作,共享一個(gè)CPU 異步事件由中斷服務(wù)來(lái)處理,高優(yōu)先
4、級(jí)任務(wù)由掛起態(tài)變?yōu)榫途w態(tài) 允許任務(wù)使用不可重入函數(shù) 優(yōu)點(diǎn)是響應(yīng)中斷快 ,缺點(diǎn)是響應(yīng)時(shí)間具有不確定性 可剝奪型內(nèi)核 具有最高優(yōu)先級(jí)的任務(wù)就緒,得到CPU的使用權(quán) 不應(yīng)直接使用不可重入函數(shù),否則應(yīng)滿足互斥條件 主要工作是完成任務(wù)(線程)的調(diào)度,2020/8/1,東華理工大學(xué)機(jī)械與電子工程學(xué)院,8,任務(wù)(線程)管理,任務(wù)是一個(gè)無(wú)限循環(huán),必須處于下列五個(gè)狀態(tài)之一 休眠狀態(tài) 任務(wù)駐留在內(nèi)存之中,但并沒有被系統(tǒng)內(nèi)核所調(diào)用。 就緒狀態(tài) 任務(wù)已經(jīng)準(zhǔn)備好,但由于該任務(wù)的優(yōu)先級(jí)比正在運(yùn)行的任務(wù)的優(yōu)先級(jí)低,還暫時(shí)不能運(yùn)行。 運(yùn)行狀態(tài) 任務(wù)擁有CPU的使用權(quán),正在運(yùn)行。 掛起狀態(tài) 任務(wù)正在等待某一個(gè)事件的發(fā)生以結(jié)束目
5、前的等待。 被中斷狀態(tài) 發(fā)生中斷,CPU進(jìn)入中斷服務(wù)程序,而暫時(shí)不能運(yùn)行當(dāng)前的任務(wù)。,2020/8/1,東華理工大學(xué)機(jī)械與電子工程學(xué)院,9,任務(wù)狀態(tài)轉(zhuǎn)換,2020/8/1,東華理工大學(xué)機(jī)械與電子工程學(xué)院,10,兩種類型 二進(jìn)制型看做一個(gè)只有一位的計(jì)數(shù)器型信號(hào)量 計(jì)數(shù)器型 兩個(gè)任務(wù)之間利用信號(hào)量來(lái)取得同步 單向同步 任務(wù)用一個(gè)信號(hào)量觸發(fā)另一個(gè)任務(wù) 雙向同步,信號(hào)量嵌入式操作系統(tǒng)的約定機(jī)制,2020/8/1,東華理工大學(xué)機(jī)械與電子工程學(xué)院,11,4.2 C語(yǔ)言程序開發(fā)及優(yōu)化,C語(yǔ)言中的數(shù)據(jù)類型,2020/8/1,東華理工大學(xué)機(jī)械與電子工程學(xué)院,12,C語(yǔ)言中的數(shù)據(jù)類型,2020/8/1,東華理工大
6、學(xué)機(jī)械與電子工程學(xué)院,13,定義各種數(shù)據(jù)類型時(shí)應(yīng)注意如下規(guī)則: 避免設(shè)int和long為相同大小。 對(duì)定點(diǎn)算法(特別是是乘法)盡量使用int數(shù)據(jù)類型。用long類型作乘法操作數(shù)會(huì)導(dǎo)致調(diào)用運(yùn)行時(shí)間庫(kù)(run-time library)的程序。 使用int或unsigned int類型而非long類型來(lái)循環(huán)計(jì)數(shù) 避免設(shè)char為8位或long為64位。 當(dāng)所寫代碼用于多DSP目標(biāo)系統(tǒng)中時(shí),宜定義genetic類型。比如,一個(gè)人可以對(duì)16位整數(shù)和32位整數(shù)分別使用int16和int32。當(dāng)對(duì)C55x DSP進(jìn)行編譯時(shí),這些類型會(huì)分別被定義成int和long。 最好使用int類型作循環(huán)指數(shù)變量和其它位
7、數(shù)不太重要時(shí)的整型變量,因?yàn)閕nt是對(duì)目標(biāo)系統(tǒng)操作最高效的整數(shù)類型而不管芯片結(jié)構(gòu)如何。,2020/8/1,東華理工大學(xué)機(jī)械與電子工程學(xué)院,14,4.2 關(guān)鍵字,4.2.1 const關(guān)鍵字 C55x C編譯器支持標(biāo)準(zhǔn)C語(yǔ)言的const關(guān)鍵字。 將這個(gè)關(guān)鍵字使用到對(duì)任意變量或數(shù)組的定義上可以確保它們的值不改變。 如果定義一個(gè)對(duì)象為const,那么const段就會(huì)為該對(duì)象分配存儲(chǔ)空間。使用const關(guān)鍵字可以定義大常數(shù)表并將它們分配到系統(tǒng)ROM中。,2020/8/1,東華理工大學(xué)機(jī)械與電子工程學(xué)院,15,4.2.2 ioport關(guān)鍵字對(duì)I/O空間進(jìn)行尋址 關(guān)鍵字ioport ioport類型只能用
8、來(lái)聲明全局 或 靜態(tài)變量 。 在本地變量 中使用ioport類型,則變量必須用指針聲明。,指針聲明ioport類型舉例: void foo (void) ioport int i; /* 無(wú)效的聲明 */ ioport int *j; /* 有效聲明 */ 注意:聲明ioport類型的指針只有16位,2020/8/1,東華理工大學(xué)機(jī)械與電子工程學(xué)院,16,在printf()中引用ioport指針的舉例: ioport int *p; printf(“%pn”, (void*)p); 注意:必須進(jìn)行強(qiáng)制類型轉(zhuǎn)換(void *),在本地變量中使用ioport類型的舉例: int * ioport
9、ioport_pointer; /* ioport 指針 */ int i; int j; void foo (void) ioport_pointer = ,編譯結(jié)果: _foo: MOV #_i,port(#_ioport_pointer) ; 存儲(chǔ)i在I/O空間的地址 MOV port(#_ioport_pointer),AR3; 載入i的地址 MOV *AR3,AR1; 將i的內(nèi)容存放到AR1中 MOV AR1,*as16(#_j) 將的i內(nèi)容保存到j(luò) return,2020/8/1,東華理工大學(xué)機(jī)械與電子工程學(xué)院,17,指向I/O空間數(shù)據(jù)指針舉例 /* 指向ioport數(shù)據(jù): */
10、ioport int * ptr_to_ioport; ioport int i; void foo (void) int j; i = 10; ptr_to_ioport = ,編譯結(jié)果: _foo: MOV #_i,*abs16(#_ptr_to_ioport) ; 存儲(chǔ)_i的地址 MOV *abs16(#_ptr_to_ioport),AR3 AADD #1, SP; 修改堆棧 MOV #10,port(#_i) ; 向_i中存入10 MOV *AR3,AR1; (AR3)AR1 MOV AR1,*SP(#0) AADD #1,SP ; 修改堆棧 return,2020/8/1,東華理工
11、大學(xué)機(jī)械與電子工程學(xué)院,18,利用ioport指針指向I/O 空間的數(shù)據(jù)的舉例: /* 指向ioport數(shù)據(jù)的 ioport指針: */ ioport int * ioport iop_ptr_to_ioport; ioport int i; ioport int j; void foo (void) i = 10; iop_ptr_to_ioport = ,編譯結(jié)果如下: _foo: MOV #10,port(#_i) ; 將10存在_i中 MOV #_i,port(#_iop_ptr_to_ioport); 存儲(chǔ)_i的地址 MOV port(#_iop_ptr_to_ioport),AR3
12、; 載入_i的地址 MOV *AR3, AR1; 載入_i MOV AR1,port(#_j) ; 將10存到_j中 return,2020/8/1,東華理工大學(xué)機(jī)械與電子工程學(xué)院,19,4.2.3 interrupt關(guān)鍵字 定義中斷函數(shù) 中斷函數(shù)必須返回空并且沒有參數(shù)傳遞 中斷函數(shù)可以定義本地變量并且使用堆棧,定義中斷函數(shù)舉例: interrupt void int_handler() unsigned int flags; . ,2020/8/1,東華理工大學(xué)機(jī)械與電子工程學(xué)院,20,4.2.4 onchip關(guān)鍵字 告訴編譯器由該關(guān)鍵字定義的指針?biāo)赶虻臄?shù)據(jù)可以作為一個(gè)雙乘法指令中的操作數(shù)
13、,用onchip定義數(shù)組和指針的舉例: onchip int x100; /* array declaration */ onchip int *p; /* pointer declaration */,2020/8/1,東華理工大學(xué)機(jī)械與電子工程學(xué)院,21,4.2.5 volatile 關(guān)鍵字,在任何情況下,優(yōu)化器會(huì)通過(guò)分析數(shù)據(jù)流來(lái)避免存儲(chǔ)器訪問。 如果程序依靠存儲(chǔ)器訪問,則必須使用volatile關(guān)鍵字來(lái)指明這些訪問。 編譯器將不會(huì)優(yōu)化任何對(duì)volatile變量的引用,2020/8/1,東華理工大學(xué)機(jī)械與電子工程學(xué)院,22,4.2.5 C語(yǔ)言的優(yōu)化,如果將未經(jīng)優(yōu)化的C語(yǔ)言程序直接運(yùn)行會(huì)發(fā)現(xiàn)
14、運(yùn)行效率較低,并且產(chǎn)生的代碼較大,而通過(guò)優(yōu)化可以較好地解決這些問題。 優(yōu)化的作用是對(duì)循環(huán)進(jìn)行化簡(jiǎn),重新組織表達(dá)式和聲明,將變量直接分配到寄存器中。 通過(guò)優(yōu)化可以提高程序運(yùn)行效率,縮小程序編碼數(shù)量。,2020/8/1,東華理工大學(xué)機(jī)械與電子工程學(xué)院,23,第4章 C55x處理器的軟件設(shè)計(jì),4.2.5 C語(yǔ)言的優(yōu)化,C/C+編譯器提供了不同的優(yōu)化選擇,通過(guò)修改cl55命令行中的-on選擇就可以方便地選擇不同的優(yōu)化等級(jí),n代表優(yōu)化等級(jí),包括0、1、2和3。下面給出不同優(yōu)化等級(jí)的功能。,(1) o0 簡(jiǎn)化控制流圖 把變量分配到寄存器 分析循環(huán)的各種情況,只保留一個(gè)退出循環(huán)的分支 刪除未用的代碼 簡(jiǎn)化表
15、達(dá)式和聲明 把用inline聲明的函數(shù)變?yōu)檎{(diào)用關(guān)系,2020/8/1,東華理工大學(xué)機(jī)械與電子工程學(xué)院,24,第4章 C55x處理器的軟件設(shè)計(jì),(2) o1 除了 o0的各種優(yōu)化功能外,還有如下功能: 在分配變量時(shí),將數(shù)值直接賦給變量而不是給出變量的索引值 去掉沒有用的分配變量和表達(dá)式 去掉本地通用表達(dá)式,2020/8/1,東華理工大學(xué)機(jī)械與電子工程學(xué)院,25,第4章 C55x處理器的軟件設(shè)計(jì),(3) o2 除了 o1的各種優(yōu)化功能外,還有如下功能: 完成循環(huán)優(yōu)化 去掉全局通用的子表達(dá)式 去掉全局沒有用的分配變量和表達(dá)式 完成循環(huán)的化解 當(dāng)只用-o選項(xiàng)時(shí)優(yōu)化器自動(dòng)進(jìn)行-o2優(yōu)化,2020/8/1
16、,東華理工大學(xué)機(jī)械與電子工程學(xué)院,26,第4章 C55x處理器的軟件設(shè)計(jì),(4)o3 除了 o2的各種優(yōu)化功能外,還有如下功能: 去掉未調(diào)用的函數(shù) 簡(jiǎn)化返回值未使用的函數(shù) 將小函數(shù)進(jìn)行內(nèi)嵌調(diào)用 對(duì)被調(diào)用的函數(shù)聲明進(jìn)行重新排序,以便被優(yōu)化的調(diào)用方能夠找到該函數(shù) 完成文件級(jí)優(yōu)化,2020/8/1,東華理工大學(xué)機(jī)械與電子工程學(xué)院,27,第4章 C55x處理器的軟件設(shè)計(jì),4.2.5 C語(yǔ)言的優(yōu)化,優(yōu)化器分析數(shù)據(jù)流時(shí)將盡量減少對(duì)內(nèi)存的訪問,如果這個(gè)數(shù)據(jù)必須從內(nèi)存中得到,則該數(shù)據(jù)必須用volatile關(guān)鍵字定義,這樣可以使編譯器不對(duì)該變量進(jìn)行優(yōu)化。 例如聲明一個(gè)指針 unsigned int *ctrl;
17、 當(dāng)在循環(huán)中有如下語(yǔ)句時(shí) while (*ctrl != 0 xFF);,優(yōu)化器將只在進(jìn)入循環(huán)的初始化中進(jìn)行一次內(nèi)存讀,而在循環(huán)當(dāng)中不在更新該變量的內(nèi)容,如果該變量被中斷或其他程序改變,由于循環(huán)中的ctrl的值沒有更新,將會(huì)使程序不能按照正確的方式執(zhí)行,這里應(yīng)當(dāng)用如下方法聲明ctrl: volatile unsigned int *ctrl; 特別當(dāng)該變量在中斷函數(shù)中被賦值,而該變量在主函數(shù)的循環(huán)中被用到時(shí),必須用volatile聲明該變量。,2020/8/1,東華理工大學(xué)機(jī)械與電子工程學(xué)院,28,4.3 C語(yǔ)言與匯編語(yǔ)言的混合編程,采用匯編語(yǔ)言編程能夠針對(duì)所采用DSP芯片的具體特點(diǎn),所編程序
18、執(zhí)行效率高。但是,不同公司的DSP芯片所提供的匯編語(yǔ)言各不相同,即使是同一公司的芯片,由于芯片的類型不同,其匯編語(yǔ)言也不盡相同。用匯編語(yǔ)言開發(fā)DSP產(chǎn)品周期很長(zhǎng),軟件修改、升級(jí)、移植都非常困難。 采用C語(yǔ)言編程具有開發(fā)效率高的優(yōu)點(diǎn),有助于提高產(chǎn)品開發(fā)速度,程序修改、升級(jí)和移植也很方便。但是,與匯編語(yǔ)言編寫的程序相比,C語(yǔ)言的執(zhí)行效率較低,通常不能滿足實(shí)時(shí)性要求,且無(wú)法控制某些硬件。 一般來(lái)說(shuō),只是在DSP運(yùn)算能力不是很緊張時(shí)才采用C語(yǔ)言開發(fā)DSP程序,更加普遍的是采用C和匯編語(yǔ)言混合編程。通常,對(duì)于實(shí)時(shí)性要求不高的部分如主控程序采用C語(yǔ)言編寫,對(duì)于實(shí)時(shí)性要求較高的模塊如FFT、FIR/IIR濾
19、波等則采用匯編語(yǔ)言編寫。,2020/8/1,東華理工大學(xué)機(jī)械與電子工程學(xué)院,29,4.3.1 在C語(yǔ)言中直接嵌套匯編語(yǔ)句 需在嵌入的匯編語(yǔ)句前面加上asm標(biāo)識(shí)符,左右加上一個(gè)雙引號(hào)和一個(gè)小括號(hào)。,用C打開中斷的代碼: IRQ_globalEnable(); /全局開中斷 該代碼編譯后的結(jié)果: 0115A6 IRQ_globalEnable: 0115A6 3C3B MOV #3,AR3 0115A8 DF6105 MOV uns(*AR3),AC0 0115AB 76080040 BFXTR #2048,AC0,T0 0115AF 20 NOP 0115B0 46B2 BCLR ST1_INT
20、M 0115B2 4804 RET,采用嵌套匯編語(yǔ)句的方法 asm (“BCLR ST1_INTM”),2020/8/1,東華理工大學(xué)機(jī)械與電子工程學(xué)院,30,4.3.2 C語(yǔ)言和匯編模塊接口,在C環(huán)境下對(duì)特殊操作使用特殊寄存器有嚴(yán)格的規(guī)定,C程序中嵌入?yún)R編程序需要遵循這些規(guī)則,所以DSP程序員必須懂得寄存器規(guī)則。 寄存器規(guī)則規(guī)定了編譯器如何使用寄存器和如何在函數(shù)調(diào)用時(shí)保存數(shù)值。 寄存器規(guī)則規(guī)定在函數(shù)調(diào)用時(shí)用到的寄存器要預(yù)先保存。這個(gè)工作部分由父函數(shù)完成,沒有被父函數(shù)保存而子函數(shù)又用到的由子函數(shù)保存。,2020/8/1,東華理工大學(xué)機(jī)械與電子工程學(xué)院,31,1. C/C+中的寄存器使用和保存規(guī)
21、則(1),2020/8/1,東華理工大學(xué)機(jī)械與電子工程學(xué)院,32,寄存器使用和保存規(guī)則(2),狀態(tài)寄存器記錄了DSP運(yùn)行狀態(tài)。表4-3 (P104)給出了狀態(tài)寄存器ST0-55 ST3-55各字段作用、默認(rèn)值及能否修改。,2020/8/1,東華理工大學(xué)機(jī)械與電子工程學(xué)院,33,2. 函數(shù)調(diào)用規(guī)則,C編譯器對(duì)函數(shù)調(diào)用有一套嚴(yán)格的規(guī)則。除了特殊的運(yùn)行時(shí)間支持函數(shù),其它任何函數(shù)不管調(diào)用還是被調(diào)用都必須遵循這些規(guī)則。不滿足這些規(guī)則會(huì)破壞C環(huán)境并會(huì)導(dǎo)致程序失敗。,2020/8/1,東華理工大學(xué)機(jī)械與電子工程學(xué)院,34,(1)父函數(shù)如何調(diào)用其它函數(shù),父函數(shù)將所要傳遞到子函數(shù)的參數(shù)放入寄存器或堆棧。,如果子
22、函數(shù)的參量用省略號(hào)聲明(表示參量數(shù)量可變),則首先把最后一個(gè)顯式聲明的參量傳到堆棧,然后再把其它參量傳到堆棧。 堆棧地址將作為訪問其它未聲明參量的索引 最后一個(gè)參量之前所聲明的參量遵循下面的規(guī)則: 編譯器通常先對(duì)要傳遞的參量分類,然后按照類型將參量放進(jìn)寄存器。編譯器使用的參量有3類: 數(shù)據(jù)指針(int *,long * 等) 16位數(shù)據(jù)(char,short,int) 32位數(shù)據(jù)(long,float,double,函數(shù)指針) 如果參量指向數(shù)據(jù)類型,這個(gè)參量就是數(shù)據(jù)指針;如果一個(gè)參量能放進(jìn)16位寄存器,就可以看成16位數(shù)據(jù),否則就是32位數(shù)據(jù)。,2020/8/1,東華理工大學(xué)機(jī)械與電子工程學(xué)院
23、,35,雙字長(zhǎng)(32位)或少于雙字長(zhǎng)的結(jié)構(gòu)體會(huì)被當(dāng)成32位數(shù)據(jù)參量,并通過(guò)寄存器傳遞。 如果結(jié)構(gòu)體長(zhǎng)度大于32位,則通過(guò)索引傳輸,即編譯器將該結(jié)構(gòu)體的地址作為一個(gè)數(shù)據(jù)指針傳遞。 如果子函數(shù)返回的值是一個(gè)結(jié)構(gòu)或一個(gè)聯(lián)合,則父函數(shù)在本地堆棧為結(jié)構(gòu)分配相應(yīng)的大小。父函數(shù)將該空間的地址作為第一個(gè)隱含參數(shù)送給子函數(shù),這個(gè)參數(shù)被看作一個(gè)數(shù)據(jù)指針。 參量按照在函數(shù)聲明中的排列順序被分配給寄存器。參量放置的寄存器類型由參數(shù)的類型決定。如果參量的數(shù)量超過(guò)可用寄存器數(shù)量,多余的參量會(huì)被壓入堆棧。,2020/8/1,東華理工大學(xué)機(jī)械與電子工程學(xué)院,36,表4-4 C語(yǔ)言函數(shù)調(diào)用中參數(shù)與寄存器的排列關(guān)系,2020/8
24、/1,東華理工大學(xué)機(jī)械與電子工程學(xué)院,37,子函數(shù)的返回參數(shù)也將根據(jù)返回參數(shù)的類型使用不同的寄存器,表給出了這一對(duì)應(yīng)關(guān)系。,表4-5 C語(yǔ)言函數(shù)調(diào)用中返回參數(shù)所使用寄存器表,2020/8/1,東華理工大學(xué)機(jī)械與電子工程學(xué)院,38,(2)子函數(shù)保存所有的入口保存寄存器(save-on-entry registers,T2、T3、AR5AR7)。 父函數(shù)必須通過(guò)壓入堆棧來(lái)保存其它在調(diào)用后會(huì)用到寄存器的值。,(3)父函數(shù)對(duì)子函數(shù)進(jìn)行調(diào)用。,(4)父函數(shù)收集返回值。,短數(shù)據(jù)、長(zhǎng)數(shù)據(jù)和數(shù)據(jù)指針分別返回在T0、AC0和(X)AR0中。如果子函數(shù)返回的是一個(gè)結(jié)構(gòu),則父函數(shù)在本地堆棧中為結(jié)構(gòu)體分配相應(yīng)大小的空
25、間。 父函數(shù)將該空間地址作為第一個(gè)隱含參量傳送給子函數(shù),這個(gè)參數(shù)被看成一個(gè)數(shù)據(jù)指針。,2020/8/1,東華理工大學(xué)機(jī)械與電子工程學(xué)院,39,例,寄存器參量規(guī)則。,struct big long x10; ; struct small int x; ; int fn(int i1, long l2, int *p3); T0 T0 AC0 AR0 long fn(int *p1, int i2, int i3, int i4); AC0 AR0 T0 T1 AR1 struct big fn(int *p1); AR0 AR1 int fn(struct big b, int *p1); T0
26、 AR0 AR1,2020/8/1,東華理工大學(xué)機(jī)械與電子工程學(xué)院,40,struct small fn(int *p1); AC0 AR0 int fn(struct small b, int *p1); T0 AC0 AR0 int printf(char *fmt, .); T0 stack stack. void fn(long l1, long l2, long l3, long l4, int i5); AC0 AC1 AC2 stack T0 void fn(long l1, long l2, long l3, int *p4, int *p5, AC0 AC1 AC2 AR0
27、AR1 int *p6, int *p7, int *p8, int i9, int i10); AR2 AR3 AR4 T0 T1,2020/8/1,東華理工大學(xué)機(jī)械與電子工程學(xué)院,41,3被調(diào)用函數(shù)(子函數(shù))的響應(yīng),(1)被調(diào)用函數(shù)為局部變量、臨時(shí)存儲(chǔ)空間及函數(shù)可能調(diào)用的參數(shù)分配足夠的存儲(chǔ)空間。這些工作在函數(shù)調(diào)用開始的時(shí)候就完成了。 (2)如果子函數(shù)修改一些寄存器(T2、T3、AR5AR7),必須將這些值壓入堆棧或存儲(chǔ)到一個(gè)沒用的寄存器中。如果子函數(shù)修改其它的寄存器則不用保存其中的值。 (3)如果子函數(shù)的參數(shù)是一個(gè)結(jié)構(gòu),則它所接收到的是一個(gè)指向該結(jié)構(gòu)的指針。如果在被調(diào)用函數(shù)中需要對(duì)結(jié)構(gòu)進(jìn)行
28、寫操作,則需要把這個(gè)結(jié)構(gòu)體復(fù)制到本地空間中。如果不進(jìn)行寫操作,則可以直接通過(guò)指針訪問這個(gè)結(jié)構(gòu)。,2020/8/1,東華理工大學(xué)機(jī)械與電子工程學(xué)院,42,(4)子函數(shù)執(zhí)行代碼。 (5)如果子函數(shù)返回一個(gè)值,它將該值按照以下規(guī)則放置: 短整型數(shù)據(jù)值返回到T0中 長(zhǎng)整型數(shù)據(jù)值返回到AC0中 數(shù)據(jù)指針值返回到(X)AR0中 如果子函數(shù)返回結(jié)構(gòu)體,父函數(shù)就會(huì)為結(jié)構(gòu)體分配存儲(chǔ)空間并傳送指向這個(gè)空間的指針到(X)AR0中。要返回這個(gè)結(jié)構(gòu)體,被調(diào)用函數(shù)只要將該結(jié)構(gòu)體復(fù)制到被這個(gè)指針?biāo)傅拇鎯?chǔ)模塊中。 (6)子函數(shù)存儲(chǔ)所有在第2步中保存的寄存器。 (7)子函數(shù)將原來(lái)的值存儲(chǔ)到堆棧中。 (8)函數(shù)返回。,2020
29、/8/1,東華理工大學(xué)機(jī)械與電子工程學(xué)院,43,第4章 C55x處理器的軟件設(shè)計(jì),C/C+與匯編語(yǔ)言可以通過(guò)多種方式聯(lián)系在一起,其中包括在C/C+中引用匯編語(yǔ)言中的常量或變量,并可以在C語(yǔ)言模塊中調(diào)用匯編代碼模塊。 C/C+調(diào)用匯編語(yǔ)言模塊時(shí)需要符合前面所述的寄存器規(guī)則和函數(shù)調(diào)用規(guī)則。在調(diào)用匯編模塊時(shí)還應(yīng)注意如下問題:,4. C/C+與匯編語(yǔ)言的接口, 調(diào)用C54x匯編函數(shù)時(shí),應(yīng)使用C54X_CALL或C54X_FAR_CALL關(guān)鍵字。 如果用匯編語(yǔ)言編寫中斷例程,則需要保存在中斷例程中使用的所有寄存器。 如果在匯編程序中調(diào)用C/C+函數(shù),則只有特定的寄存器在C/C+中被保存,而其他寄存器則可
30、能被C/C+函數(shù)改變。 在定義匯編函數(shù)名和變量時(shí),需要在函數(shù)名前加上下劃線“ _ ”來(lái)讓編譯器識(shí)別。,2020/8/1,東華理工大學(xué)機(jī)械與電子工程學(xué)院,44,第4章 C55x處理器的軟件設(shè)計(jì),在C語(yǔ)言中調(diào)用匯編函數(shù)和變量舉例 調(diào)用匯編函數(shù)的例子如下:,C語(yǔ)言程序: /* 聲明外部匯編函數(shù) */ extern int asmfunc(int, int *); int gvar; /* 定義全局變量 */ main() int i; i = asmfunc(i, /* 調(diào)用函數(shù) */ ,匯編程序: _asmfunc: ADD *AR0, T0, T0 ; gvar + T0 = i ,i= T0
31、RETURN ; 返回,2020/8/1,東華理工大學(xué)機(jī)械與電子工程學(xué)院,45,第4章 C55x處理器的軟件設(shè)計(jì),調(diào)用匯編模塊中所定義變量的例子如下:,匯編程序: .bss _var,1 ; 定義變量 .global _var ; 定義其為外部引用,C語(yǔ)言程序: extern int var; /* 外部變量 */ var = 1; /* 使用變量 */,2020/8/1,東華理工大學(xué)機(jī)械與電子工程學(xué)院,46,第4章 C55x處理器的軟件設(shè)計(jì), 如果C/C+中的變量要在匯編語(yǔ)言中訪問,則該變量應(yīng)用.global聲明。, 編譯器所默認(rèn)的CPL值為1,即采用間接絕對(duì)方式尋址,如果在匯編函數(shù)中CPL
32、被設(shè)置為0,在函數(shù)返回時(shí)應(yīng)當(dāng)把這個(gè)值改為1。下面的例子是對(duì)應(yīng)CPL=1或=0時(shí)所使用的不同匯編語(yǔ)句: MOV *(#global_var),AR3 ; CPL = = 1 MOV global_var, AR3 ; CPL = = 0,2020/8/1,東華理工大學(xué)機(jī)械與電子工程學(xué)院,47, 在匯編語(yǔ)言中可以通過(guò).set、.global命令聲明全局常量,這些常量在C/C+中可以通過(guò)特殊的方式訪問。例如試圖訪問常量X,則在該常量名前需要加上“ 定義常量 .global _table_size ; 定義的變量可以被全局訪問,C語(yǔ)言程序: extern int table_size; /*外部參數(shù)
33、*/ #define TABLE_SIZE (int) ( +i) /* 使用該常數(shù) */,2020/8/1,東華理工大學(xué)機(jī)械與電子工程學(xué)院,48,4.4 通用目標(biāo)文件格式 匯編器和鏈接器產(chǎn)生的可執(zhí)行文件所采用的格式 段編譯器產(chǎn)生的可以重新定位的代碼和數(shù)據(jù)塊 初始化段 代碼段(.text段)、數(shù)據(jù)段( .data段) 常數(shù)段(.const段) 、存儲(chǔ)變量段( .sect段) 未初始化段 存儲(chǔ)全局和靜態(tài)變量的.bss段 存儲(chǔ)變量段( .usect段) 堆棧和系統(tǒng)堆棧段(.stack和.sysstack) 為分配動(dòng)態(tài)存儲(chǔ)器保留的.sysmem段,2020/8/1,東華理工大學(xué)機(jī)械與電子工程學(xué)院,4
34、9,4.4.1 C/C+和匯編語(yǔ)言中段的分配 分配數(shù)據(jù)的例子: #pragma DATA_SECTION( bufferB, “my_sect”) char bufferA512; char bufferB512; 編譯后的結(jié)果如下: .global _bufferA .bss _bufferA,512,0,0(symbol,size in words,blocking,alignment) .global_bufferB _bufferB: .usect “my_sect”,512,0,0 匯編語(yǔ)言中為代碼分配段的例子: .text MOV #10,AC0 MOV AC0,AC1,2020/
35、8/1,東華理工大學(xué)機(jī)械與電子工程學(xué)院,50,匯編語(yǔ)言中為數(shù)據(jù)分配段的例子: .data .word 9, 10 .word 11, 12 在匯編文件中可以定義變量和為數(shù)組預(yù)留空間: .def _I_east_data .def _Q_east_data .def _I_west_data .def _Q_west_data .def _x .sect input _I_east_data: .space 20*16;保留20個(gè)字的空間 _Q_east_data: .space 20*16;保留20個(gè)字的空間 _I_west_data: .space 20*16;保留20個(gè)字的空間 _Q_we
36、st_data: .space 20*16;保留20個(gè)字的空間 _x: .word 0,2020/8/1,東華理工大學(xué)機(jī)械與電子工程學(xué)院,51,4.4.2 寄存器模式設(shè)置 小存儲(chǔ)器模式 .text(代碼段)、.switch(狀態(tài)轉(zhuǎn)化段)以及.cinit/.pinit(變量初始化段)的長(zhǎng)度和位置都不受限制 數(shù)據(jù)指針為16位(64K限制, .bss, .data, .stack, .sysstack, .system, .const應(yīng)在同一段內(nèi)) 大存儲(chǔ)器模式在編譯器中設(shè)置-ml選項(xiàng) 數(shù)據(jù)指針為23位 代碼段可以跨越頁(yè)邊界 ,其它不能 C/C+系統(tǒng)堆棧 用來(lái)保存處理器信息,向函數(shù)傳遞參數(shù)以及分配局
37、部變量 系統(tǒng)默認(rèn)主堆棧和輔助堆棧在同一內(nèi)存頁(yè)且長(zhǎng)度都是1000個(gè)字節(jié) 動(dòng)態(tài)內(nèi)存分配 動(dòng)態(tài)內(nèi)存分配函數(shù):malloc、calloc和realloc 結(jié)構(gòu)的對(duì)齊 為結(jié)構(gòu)的所有成員分配空間,并保證結(jié)構(gòu)的長(zhǎng)度為偶數(shù),2020/8/1,東華理工大學(xué)機(jī)械與電子工程學(xué)院,52,4.4.3 鏈接命令文件.cmd文件 .cmd文件的具體實(shí)例,/* * lnk55x -o -m lnk.cmd * cl55x -z -o -m lnk.cmd /*/ -c /*不區(qū)分大小寫*/ -ma1.map/*生成.map文件*/ -stack 0 x1800 /*主堆棧尺寸*/ -sysstack 0 x1800 /*系統(tǒng)
38、堆棧尺寸*/ -heap 0 x100 /*動(dòng)態(tài)內(nèi)存大小*/ /* Set entry point to Reset vector */ 設(shè)置復(fù)位向量入口 /* - Allows Reset ISR to force IVPD/IVPH to point to vector table. */ -e RESET_ISR,2020/8/1,東華理工大學(xué)機(jī)械與電子工程學(xué)院,53,/*設(shè)置系統(tǒng)內(nèi)存映射*/ 屬性 RWIX(Read, Write, Initial, eXcuted) /* 載入及鏈接使用字節(jié)地址*/ MEMORY PAGE 0: ;origin length MMR (RWIX) :
39、 o=0000000h, l=00000C0h DARAM0 (RWIX) : o=00000C0h, l=000af40h DARAM1 (RWIX) : o=000b000h, l=0000800h DARAM2 (RWIX) : o=000b800h, l=0000800h DARAM3 (RWIX) : o=000c000h, l=0000800h DARAM4 (RWIX) : o=000c800h, l=0000800h DARAM5 (RWIX) : o=000d000h, l=0000800h DARAM6 (RWIX) : o=000d800h, l=0002000h DAR
40、AM7 (RWIX) : o=000f800h, l=0000800h SARAM0 (RWIX) : o=0010000h, l=0010000h SARAM1 (RWIX) : o=0020000h, l=0010000h SARAM2 (RWIX) : o=0030000h, l=0020000h CE0 (RWIX) : o=0050000h, l=0100000h CE1 (RWIX) : o=0400000h, l=0400000h PDROM (RX) : o=0FF8000h, l=0008000h PAGE 1: CE2 (RWIX) : o=0400000h, l=0200000h CE3 (RWIX) : o=0600000h, l=0100000h PAGE 2: IOPORT (RWI) : o=0000000h, l=0020000h ,2020/8/1,東華理工大學(xué)機(jī)械與電子工程學(xué)院,54,/*為段分配內(nèi)存地址*/fill為任選項(xiàng),2字節(jié)整型常數(shù) SECTIONS rts55x.lib(.text) */ rts55.lib(.text) .text SARAM0 /* CODE */ .switch
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 妊娠合并多學(xué)科門診核心競(jìng)爭(zhēng)力提升策略
- 八上語(yǔ)文綜合試題及答案
- 女職工健康數(shù)據(jù)管理與分析應(yīng)用
- 大數(shù)據(jù)支持下社區(qū)慢病健康管理模式構(gòu)建
- 大數(shù)據(jù)分析在職業(yè)病突發(fā)疫情預(yù)警中的應(yīng)用
- 多聯(lián)疫苗的接種依從性提升方法-1
- 2025年大學(xué)智能家居管理(管理技術(shù))試題及答案
- 多組學(xué)標(biāo)志物推動(dòng)焦慮癥精準(zhǔn)分型策略
- 多組學(xué)技術(shù)在腫瘤早篩中的臨床價(jià)值
- 2025年中職(印刷媒體技術(shù))印刷排版工藝階段測(cè)試題及答案
- 文旅項(xiàng)目立項(xiàng)報(bào)告
- 生理學(xué)期中考試試題及答案
- 京張高鐵現(xiàn)場(chǎng)觀摩會(huì)整體策劃方案
- 安捷倫1200標(biāo)準(zhǔn)操作規(guī)程
- 合伙人合同協(xié)議書電子版
- 離婚協(xié)議書下載電子版完整離婚協(xié)議書下載三篇
- 磨床設(shè)備點(diǎn)檢表
- LS/T 8008-2010糧油倉(cāng)庫(kù)工程驗(yàn)收規(guī)程
- GB/T 27724-2011普通長(zhǎng)網(wǎng)造紙機(jī)系統(tǒng)能量平衡及能量效率計(jì)算方法
- GB/T 18341-2021地質(zhì)礦產(chǎn)勘查測(cè)量規(guī)范
- 綠色療法修正直腸給藥教程
評(píng)論
0/150
提交評(píng)論