μC/OS-II在DSP Flash存儲(chǔ)器中運(yùn)行的關(guān)鍵問(wèn)題
b)對(duì)μC/OS-Ⅱ.H函數(shù)進(jìn)行修改:將外部變量弓用的定義
c)在主程序的main()函數(shù)中的多任務(wù)調(diào)度函數(shù)執(zhí)行前調(diào)用前面的兩個(gè)初始化函數(shù),如下:
此方法用一句話總結(jié),就是將常量定義成變量,以賦值語(yǔ)句的方式初始化到RAM中。
2.2方法3:修改數(shù)據(jù)段的定位方式和庫(kù)函數(shù)
這種方式除了要修改.const段的裝載地址和運(yùn)行地址外,還要對(duì)CCS自帶的初始化函數(shù)進(jìn)行修改。但是這種方法是一勞永逸的。
對(duì).const段的修改如下:
即采用了裝載地址與運(yùn)行地址分離的方式,將.const載入ROM段,而運(yùn)行時(shí)在RAM區(qū)。為了使程序正常運(yùn)行,在初始化時(shí),需要將.const段的內(nèi)容從裝載地址拷貝到運(yùn)行地址內(nèi)。這段程序可以在編譯時(shí)由編譯器自動(dòng)生成。這還需要對(duì)軟件所使用的庫(kù)文件作簡(jiǎn)單的修改。該庫(kù)名稱即是rts.lib(表示不同類(lèi)型的DSP,有2xx、25、50等)。修改該庫(kù)的方法是將源文件從庫(kù)中提取出來(lái)進(jìn)行修改,編譯后再替代原有的文件。具體操作如下:
a)將庫(kù)函數(shù)rts2xx.lib、源文件rts.src、兩個(gè)工具函數(shù)dspar.exe和dspa.exe找到,放在同意個(gè)目錄下,打開(kāi)ms_dos命令窗。
b)執(zhí)行DOS命令:
這句的功能是從rts.src文件中提取出boot.asm文件。這個(gè)rts.src即是rts.lib的源文件。在boot.asm文件中能找到CONST_COPY這個(gè)標(biāo)志量,為了實(shí)現(xiàn)所需要的功能,它應(yīng)被賦值為1。對(duì)boot.asm文件的編輯完成之后,就可以將其編譯生成目標(biāo)文件,執(zhí)行語(yǔ)句:
其中對(duì)于不同的DSP需要使用不同的參數(shù),對(duì)于240xA來(lái)說(shuō),應(yīng)該使用2xx來(lái)代替“”。語(yǔ)句執(zhí)行完后會(huì)生成boot.obj文件。再執(zhí)行語(yǔ)句:
這時(shí)它就替換了庫(kù)里的同名文件。在編譯時(shí)編譯器就會(huì)自動(dòng)增加拷貝.const段到數(shù)據(jù)空間的語(yǔ)句。這種方法不必修改程序,代價(jià)是犧牲了一定的數(shù)據(jù)存儲(chǔ)空間,時(shí)間開(kāi)銷(xiāo)主要出現(xiàn)在初始化中。這應(yīng)該是最經(jīng)濟(jì)實(shí)用的方法。
3結(jié)束語(yǔ)
對(duì)常量處理的3種方法中,第方法1和方法3相對(duì)較容易實(shí)現(xiàn)。其中方法1對(duì)于自己編寫(xiě)的少量代碼修改起來(lái)比較方便,但是如果碰到庫(kù)函數(shù)中用到.const的情況,就需要像第方法3一樣提取庫(kù)函數(shù)中的代碼,來(lái)修改這個(gè)庫(kù)函數(shù),在挖掘機(jī)軌跡控制程序中用到atan函數(shù)就是這種情況。這種做法對(duì)每個(gè)這樣的函數(shù)都要執(zhí)行同樣的操作,顯然不是最佳解決辦法。
方法3雖然必須修改cmd文件和庫(kù)文件,但是它是一勞永逸的。生成相應(yīng)的庫(kù)函數(shù)和cmd文件以后,對(duì)任何帶有const的代碼都不再需要做任何修改。所以這種方法也是TI推薦的方法,在TI的數(shù)據(jù)手冊(cè)TMS320C2x/C2xx/C5x Optimizing C Compiler User’sGuide(SPRU024E)中有對(duì)它的說(shuō)明。
本課題已經(jīng)通過(guò)國(guó)家863計(jì)劃專(zhuān)家組的驗(yàn)收,該智能化挖掘機(jī)軌跡控制系統(tǒng)已經(jīng)交付柳工使用。
評(píng)論