基于uC/OS-II的變頻器結(jié)構(gòu)控制系統(tǒng)設(shè)計(jì)
這里state1是全局變量,鍵盤中斷的工作僅僅是將PORTA口中斷狀態(tài)寄存器(IESR,地址$0FB8)讀入state1中。為防止其他任務(wù)在此期間對(duì)state1的修改,使用了臨界區(qū)代碼保護(hù)。
顯示任務(wù)的部分代碼:
switch(state1)
{case 1: //PTA_0對(duì)應(yīng)的鍵被按下
…… //相應(yīng)的服務(wù)程序,略
case 128: //PTA_7對(duì)應(yīng)的鍵被按下
break; }
asm{move $00,X:$0FB8}; //清鍵盤中斷狀態(tài), 以備下次中斷
顯示任務(wù)中采用多分支結(jié)構(gòu),根據(jù)statel=2n,(n=0,1,2,3,,4,5,6,7),不同的值代表不同的鍵被按下,程序進(jìn)行相應(yīng)的處理;最后將IESR寄存器清零。用同樣的方法,兩位之間互相組合可擴(kuò)展形成16個(gè)按鍵。這樣只用一個(gè)全局變量就完成了中斷與任務(wù)間的通信,程序用內(nèi)嵌匯編的C來(lái)寫,簡(jiǎn)捷高效。
2 系統(tǒng)設(shè)計(jì)中需注意的問(wèn)題
首先是存儲(chǔ)器分配問(wèn)題。多任務(wù)、郵箱等功能的使用會(huì)增加RAM的額外開(kāi)銷,在不擴(kuò)展外部RAM的情況下,可用的只有片內(nèi)2KB數(shù)據(jù)RAM和512字的程序RAM,資源相對(duì)有限,存儲(chǔ)空間的合理分配就顯得很重要。任務(wù)堆棧所占用的RAM空間要根據(jù)實(shí)際應(yīng)用來(lái)確定,必須考慮任務(wù)調(diào)用的嵌套情況、任務(wù)中函數(shù)為局部變量所分配的內(nèi)存數(shù)目。另外,它必須能保存DSP的所有22個(gè)寄存器和16個(gè)存儲(chǔ)器字。如果為任務(wù)分配的存儲(chǔ)空間富余過(guò)多則造成資源緊張,甚至?xí)騼?nèi)存溢出導(dǎo)致系統(tǒng)崩潰。解決方法是調(diào)用系統(tǒng)函數(shù)OSTaskStkChk(),它可以檢測(cè)每個(gè)任務(wù)運(yùn)行時(shí)使用的內(nèi)存大小,為合理分配內(nèi)存空間提供了依據(jù)。另外,可采用一些簡(jiǎn)化方法節(jié)省RAM空間。例如SDK為AD采集的每個(gè)通道都定義一個(gè)結(jié)構(gòu)體,它包括三個(gè)元素:句柄、數(shù)值長(zhǎng)度和采樣值;如果使用五路AD采集,就得定義五個(gè)結(jié)構(gòu)體。通常不進(jìn)行初始化,DSP內(nèi)核在運(yùn)行時(shí)將它們放入RAM空間,占用RAM較多。通常關(guān)心的只是采樣值一個(gè)元素,其他兩個(gè)只完成輔助功能。如果使用一個(gè)存放采樣值的變量代替這個(gè)結(jié)構(gòu)體,或直接采用匯編語(yǔ)言寫這段代碼,就可大幅度地節(jié)省RAM空間。本文的AD采集程序就是用匯編完成。
SDK沒(méi)有提供在DSP56F803下使用SPI函數(shù)的例程。
仿照在807中的成功應(yīng)用,筆者調(diào)用spiWrite()函數(shù),通過(guò)SPI驅(qū)動(dòng)D/A轉(zhuǎn)換芯片。但在編譯連接時(shí)出現(xiàn)系統(tǒng)錯(cuò)誤,數(shù)據(jù)類型unsigned short與const void不匹配,在const.c中將spiWrite做強(qiáng)制類型轉(zhuǎn)換(void*)(spiWrite),解決了這一問(wèn)題。
利用SDK與uC/OS-II相配合,充分發(fā)揮了DSP型控制器DSP56F803的功能,采用內(nèi)嵌匯編的C語(yǔ)言編程,大大提高了代碼的可讀性和可移植性,縮短了系統(tǒng)開(kāi)發(fā)周期,成功實(shí)現(xiàn)了系統(tǒng)的變結(jié)構(gòu)控制功能,也體現(xiàn)了操作系統(tǒng)的多任務(wù)功能在實(shí)現(xiàn)多算法結(jié)構(gòu)上的優(yōu)越性。
評(píng)論