LED大屏幕異步控制器多窗口顯示的設計
1 引言
以往的LED 異步控制器只能把一個(gè)屏幕作為一個(gè)完整的區域來(lái)進(jìn)行顯示, 或者簡(jiǎn)單的加上時(shí)間區域或游走字幕區域,這樣對于用戶(hù)來(lái)講往往缺乏足夠的靈活性, 尤其在屏幕較大的時(shí)候。針對以上情況, 本文提出了一款基于32 位高性能ARM處理器和uc/OS- II 的設計方案。它充分利用了uc/OS-II 高效的多任務(wù)管理功能和ARM處理器強大的運算能力, 實(shí)現了單屏幕多窗口的任意位置顯示, 使得顯示內容變得更加豐富, 顯示方式變得更加靈活。
2 LED 控制系統的工作原理
典型的LED 異步控制系統主要由PC 應用軟件、通信模塊、數據處理模塊、掃描控制模塊、驅動(dòng)模塊和LED 屏幾部分組成,如圖1 所示。
首先, PC 應用軟件將文本或圖片轉化為具有特定格式的點(diǎn)陣信息。然后, 通過(guò)通信模塊將此點(diǎn)陣信息發(fā)送給數據處理模塊。數據處理模塊對這些點(diǎn)陣信息進(jìn)行各種特技處理, 最后通過(guò)掃描控制模塊和驅動(dòng)模塊將畫(huà)面在LED 屏上進(jìn)行正確顯示。
本文所指的LED 異步控制器包括通信模塊、數據處理模塊和掃描控制模塊三部分。
3 控制器軟件部分的設計
本控制器的硬件結構如圖2 所示。數據處理模塊由MCU,一片SRAM和一片FLASH 存儲器組成。MCU 選用PHILIPS 的基于32 位ARM內核的LPC2214 處理器, 它有著(zhù)豐富的外圍接口資源和強大的運算能力, 是整個(gè)控制器的核心。SRAM作為MCU 進(jìn)行特技處理時(shí)的緩存使用。FLASH 存儲器用于存儲點(diǎn)陣信息和一些必要的參數。
掃描控制模塊由CPLD 和顯存組成。顯存為一片SRAM, 它用于保存當前顯示的一幀點(diǎn)陣信息。CPLD 通過(guò)地址總線(xiàn)和16位數據總線(xiàn)與MCU 相連, 它把從MCU 接收到的16 位數據按指定地址寫(xiě)入顯存, 然后再按一定的尋址方式從顯存中讀出點(diǎn)陣信息進(jìn)行掃描。MCU 只能通過(guò)CPLD 對顯存進(jìn)行以字(2byte)為單位的寫(xiě)操作。通信模塊包括以太網(wǎng)模塊和串口通信模塊, 用于實(shí)現PC 與控制器之間的RS232、RS485 以及工業(yè)以太網(wǎng)通信。
4 控制器軟件部分的設計
為了實(shí)現單屏幕、多窗口任意位置的顯示, 軟件部分我們基于uc/OS- II 進(jìn)行設計, 這樣可以充分利用操作系統高效的任務(wù)調度算法, 將每個(gè)窗口的顯示都交由單個(gè)任務(wù)來(lái)完成, 從而極大地提高系統的運行速度和可靠性, 并且使得程序的開(kāi)發(fā)和擴展變得更加方便。
在進(jìn)行具體的程序設計之前, 首先要確定數據的組織方案。
因為好的數據組織方案, 對于程序編寫(xiě)來(lái)說(shuō)往往可以達到事半功倍的效果。
4.1 顯存的數據組織方案:
對于雙色屏, 一個(gè)像素點(diǎn)需要紅、綠兩位數據來(lái)描述。為了便于處理, 我們將橫向連續的8 個(gè)像素點(diǎn)組成一個(gè)字(2byte)來(lái)進(jìn)行存儲, 其中一個(gè)字節為紅數據, 一個(gè)字節為綠數據。數據存儲順序為從左到右, 從上到下。如圖3 所示, 假如屏幕寬度為160 個(gè)像素點(diǎn), 顯存起始地址為0x83000000, 則屏幕第一行的前8 個(gè)像素點(diǎn)映射到顯存中地址為0x83000000 和0x83000001 的兩個(gè)字節, 第二行的前8 個(gè)像素點(diǎn)映射到顯存中地址為0x83000028 和0x83000029 的兩個(gè)字節, 依此類(lèi)推。
4.2 點(diǎn)陣信息轉化規則:
由于窗口大小可以任意設置, 窗口的位置可以任意擺放。
所以對于單個(gè)窗口而言, 它在顯存中的映射可能并非是字(2byte)對齊的。以圖4 為例, 在一個(gè)大小為160(寬)×96(高)的屏幕上開(kāi)設一個(gè)左上角坐標為(20,16), 大小為86×47 的窗口, 則此窗口第一行的前4 個(gè)像素點(diǎn)在顯存中的映射為地址是0x83000282 和0x83000283 的兩個(gè)字節的低4 位, 所以這個(gè)窗口在顯存中的映射并不是字對齊的。由于MCU 只能以字(2byte)為單位對顯存進(jìn)行操作, 所以PC 軟件在對該窗口進(jìn)行點(diǎn)陣信息轉換時(shí), 如果直接對區域1 (窗口的實(shí)際大小)進(jìn)行轉換存儲,則在對該窗口進(jìn)行特技處理時(shí)會(huì )存在大量的位運算, 這樣會(huì )大大降低運算效率, 從而影響特技效果的顯示, 這樣就很難滿(mǎn)足用戶(hù)對特技顯示效果的要求。
為了解決上述問(wèn)題, 可以將區域1 橫向擴展成起點(diǎn)坐標為(16,16), 大小為96×47 的區域2。易知, 區域2 在顯存中的映射是字對齊的。為了避免運算時(shí)的位操作, PC 軟件在對區域1 進(jìn)行點(diǎn)陣信息轉換時(shí), 可按區域2 來(lái)進(jìn)行, 只是需將區域1 的擴展部分的數據全填為1。這樣處理會(huì )犧牲掉一小部分FLASH 存儲器空間, 但卻可避免特技處理時(shí)大量的位運算, 從而大大提高運算效率, 因此這樣做是值得的。
4.3 緩存數據的組織方案:
由于MCU 只能對顯存進(jìn)行寫(xiě)操作, 而在進(jìn)行特技運算時(shí),往往需要前一幀信息才能得到下一幀的信息。所以, 首先, 需要在緩存中劃分出一塊和顯存大小相等, 地址一一對應的區域screen 用于保存整屏幕的前一幀信息。
又由于MCU 對顯存只能進(jìn)行字操作, 并且多個(gè)窗口之間可能會(huì )出現區域重疊, 所以如果各窗口的特技運算都直接在screen 區域上進(jìn)行, 則窗口重疊部分信息可能會(huì )發(fā)生混亂。因此如圖5 所示, 也需要在緩存中為每個(gè)窗口劃分出一塊存儲器空間(area 1, area 2, ..., area n), 用于保存本窗口顯示的前一幀信息。這樣在特技運算時(shí), 首先要在area 區域中對各窗口數據進(jìn)行運算得到各窗口的下一幀信息, 然后將area 區域中數據寫(xiě)入該窗口在screen 區域中的相應地址以保存整屏幕最新一幀信息, 最后把screen 中相應數據寫(xiě)入顯存從而完成顯示。
4.4 軟件設計:
基于上述方案, MCU 程序的設計變得非常簡(jiǎn)潔。程序結構如圖6 所示, 控制器上電后, 首先進(jìn)行系統初始化, 然后從FLASH 中讀取屏參數, 進(jìn)行參數初始化。接著(zhù)建立任務(wù)TaskControl, TaskControl 擁有比各窗口顯示任務(wù)都要高的優(yōu)先級, 它主要用于對各窗口顯示任務(wù)進(jìn)行實(shí)時(shí)管理。每隔一段時(shí)間TaskControl 就要對reset 標志進(jìn)行一次查詢(xún), 如果reset=1, 它會(huì )刪除原先建立的各窗口顯示任務(wù), 然后從FLASH 中讀取新的窗口個(gè)數, 依此建立新任務(wù), 將每個(gè)窗口的顯示交由單個(gè)窗口顯示任務(wù)來(lái)控制。
下面是任務(wù)TaskControl 的程序演示:
void TaskControl(void *pdata){
uint8 taskNum;
pdata=pdata;
RESET:
reset=0; //reset 標志清零
for(taskNum=3;taskNum18;taskNum++){ // 刪除原先建立的窗口任務(wù)
OSTaskDel(taskNum); // 窗口顯示任務(wù)優(yōu)先級從3 開(kāi)始}// 最多允許設置16 個(gè)窗口
taskNum=flashReadWord(AREA_NUM_ADDR);// 從FLASH中讀取屏
評論