4.2 為多處理器系統(tǒng)創(chuàng)建軟件
在NiosII IDE[3]環(huán)境下,為3個(gè)處理器系統(tǒng)分別創(chuàng)建6個(gè)軟件工程,為每個(gè)處理器創(chuàng)建一個(gè)應(yīng)用工程和一個(gè)系統(tǒng)庫(kù)工程。之后對(duì)軟件工程進(jìn)行編譯、運(yùn)行和調(diào)試。
軟件使用硬件Mutex共享一個(gè)消息緩存區(qū)。3個(gè)處理器分別寫(xiě)消息到消息緩存區(qū)(count)且循環(huán)加1。cpul讀消息且通過(guò)jtag_uart顯示消息。每個(gè)處理器運(yùn)行同樣的C文件,但處理器的操作稍有不同。這是通過(guò)使用Ni-osII的cpuid實(shí)現(xiàn)的。在NioslI處理器系統(tǒng)中,某個(gè)處理器通過(guò)寫(xiě)其cpuid控制寄存器的值到Mutex寄存器的OWNER域來(lái)對(duì)Mutex加鎖。cpuid寄存器保持一個(gè)靜態(tài)值,在多處理器系統(tǒng)中,該值唯一地識(shí)別一個(gè)處理器,且在系統(tǒng)創(chuàng)建時(shí)確定。軟件執(zhí)行某個(gè)處理器的函數(shù)時(shí),首先檢查處理器的cpuid,如果cpuid正確,則執(zhí)行相應(yīng)函數(shù)。工程中的文件為hello_world_multi.c,其中將信息寫(xiě)入緩沖區(qū)的功能由以下程序段實(shí)現(xiàn):


如果將信息從jtag_uart輸出,那么程序首先判斷id是否等于3。因?yàn)橛布O(shè)計(jì)時(shí),只有cpul與jtag_uart相連,而cpul的id的值為3(在系統(tǒng)創(chuàng)建時(shí)確定),cpu2、cpu3的id分別為1和2,且id的值等于cpuid控制寄存器的值加1,可在NiosII IDE環(huán)境下讀取cpuid控制寄存器的內(nèi)容。其信息輸出的程序如下:


在System Library屬性中,第1個(gè)工程選擇jtag_uart為stdin、stderr和stdout,選擇cpul_timer為the Systemclock timer;第2個(gè)工程選擇cpu2_timer為System clocktimer,驗(yàn)證stdin、stderr和stdout為null,因?yàn)檫@個(gè)處理器不與jtag_uart連接;第3個(gè)工程選擇cpu3_timer為Systemclock timer,其余同工程2。驗(yàn)證這3個(gè)工程的SDRAM被選擇為Program memory、Read-only data memory、Read/write data memory、Heap memory和Stack memory。
分別經(jīng)編譯、下載、運(yùn)行后,在終端上顯示這3個(gè)處理器產(chǎn)生的消息,如圖2所示。

結(jié) 語(yǔ)
結(jié)果表明,3處理器系統(tǒng)通過(guò)硬件互斥核,實(shí)現(xiàn)了存儲(chǔ)器的共享。在此實(shí)例的基礎(chǔ)上,按同樣的方法添加處理器及相應(yīng)的硬件組件,并開(kāi)發(fā)相關(guān)應(yīng)用軟件,即可實(shí)現(xiàn)滿足不同需求的多處理器系統(tǒng)。
(來(lái)源:?jiǎn)纹瑱C(jī)與嵌入式系統(tǒng)應(yīng)用)





