龍芯+RT-Thread+LVGL實戰(zhàn)筆記(2)——寫第一個線程和GUI

????????過去的大半年時間,一直帶著學(xué)生備戰(zhàn)全國職業(yè)院校技能大賽“嵌入式系統(tǒng)應(yīng)用開發(fā)”賽項。由于是首次參加該賽項,很多東西都是從0到1的摸索和積累,最后的成績自然也不甚理想。作為指導(dǎo)教師,備賽期間除了給予學(xué)生必要的指導(dǎo),自己也花了不少精力研究了大賽指定的龍芯1B200嵌入式開發(fā)板,并嘗試使用RT-Thread操作系統(tǒng)和LVGL圖形組件,實現(xiàn)了樣題的幾十項任務(wù),大大小小的版本也寫了30多個,也算磕出點(diǎn)名堂了,見圖1~圖3。



????????本著分享和開源精神,也為了給以后的參賽學(xué)生循序漸進(jìn)的指導(dǎo),于是就有了這個實戰(zhàn)筆記系列。希望自己摸索的過程能給更多的嵌入式學(xué)習(xí)者一些指引,也為國產(chǎn)嵌入式處理器和國產(chǎn)嵌入式操作系統(tǒng)的推廣助一點(diǎn)力。
????????由于個人能力和精力的限制,再加上龍芯嵌入式的開發(fā)資料十分有限,很多問題沒法像STM32那樣深入到庫文件和寄存器的程度,還希望有見解的網(wǎng)友在這些問題上能給與點(diǎn)評和分享。最后,我想說的是,這個實戰(zhàn)筆記不是面向0基礎(chǔ)的朋友,起碼得有龍芯嵌入式裸機(jī)的開發(fā)經(jīng)驗,了解RT-Thread操作系統(tǒng)的線程、定時器、信號量、郵箱等相關(guān)知識,知道LVGL圖形用戶界面開發(fā)的基本套路。

????????上一篇我們完成了最基本的移植工作,這一篇我們在此基礎(chǔ)上添加一個主按鈕的GUI效果,如圖4所示,并將其加入到創(chuàng)建的主線程當(dāng)中。

一、工程文件和線程的框架
????????正式編寫代碼之前,這里先根據(jù)樣題的編排(圖5所示),把工程文件和線程的整體脈絡(luò)梳理在圖6中。當(dāng)然,這只是本人的規(guī)劃思路,并不一定是最合理的,供各位借鑒和參考。后續(xù)的版本和代碼都將依據(jù)圖6的規(guī)劃來推進(jìn)。


二、準(zhǔn)備工程和文件
????????如圖7所示,我們把上一次的整個工程復(fù)制另存一份,作為1.0的版本,并在 src 目錄下新建4個文件:gui_layout.h、my_def.h、rtt_lvgl_top.h、rtt_lvgl_top.c。當(dāng)然,別忘了把 .c 文件加入到工程中(.h文件可加可不加),如圖8所示。


三、編寫源碼
????????關(guān)于源碼,本人先聲明一下,由于不是程序員出身,所以代碼算不上特別嚴(yán)謹(jǐn)和規(guī)范,只能說在自己能力范圍內(nèi)力求最佳,畢竟閱讀源碼主要在于借鑒思路,有不妥或更優(yōu)的地方請文明留言點(diǎn)評。此外,自己對于RT-Thread和LVGL的使用還是摸索階段,談不上精通深入,也希望行家能在必要之處給予指點(diǎn)。最后,就是在頭條網(wǎng)頁端編輯文章好像沒有類似“添加源碼”的功能,所以就只能用截圖的方式來呈現(xiàn)了。
3.1 gui_layout.h文件源碼
????????由于界面上用的最多的就是LVGL7的按鈕矩陣(lv_btnmatrix),因此我們把按鈕的布局代碼統(tǒng)一放在這個文件中,這里我們先布局一級(主)按鈕矩陣,如代碼清單1所示。順便提一下,關(guān)于LVGL各類組件的用法,推薦參考《百問網(wǎng)LVGL中文教程手冊文檔》
http://lvgl.100ask.net/7.11/,如圖9所示。

????????另外,關(guān)于中文字符顯示的問題,在《LoongIDE組件編程簡介》文檔的最后一個小節(jié)有如下交待:
????????LoongIDE使用ANSI進(jìn)行字符編碼,在代碼編輯時通過快捷鍵 Ctrl+Alt 將漢字字符轉(zhuǎn)換為UTF8的二進(jìn)制編碼。例如:選中編輯器的字符串:"龍芯" → 按 Ctrl+Alt → 轉(zhuǎn)換為:"\xE9\xBE\x99"/*龍*/"\xE8\x8A\xAF"/*芯*/,生成的UTF8編碼可以讓LVGL正確識別并顯示漢字。
3.2 my_def.h文件源碼
????????該文件聲明了一些適用于整個工程的宏和枚舉,源碼如代碼清單2所示:
3.3 rtt_lvgl_top.h文件源碼
????????這個頭文件里是必要的全局變量和函數(shù)聲明,源碼如代碼清單3所示:
3.4 rtt_lvgl_top.c文件源碼
????????該文件是本工程的主要文件,主界面和主線程都在該文件中實現(xiàn),源碼較多,這里為了便于展示,做了如下處理:圖10是本文件的整體示例,代碼清單4為完整源碼。

四、編譯和測試
????????我在編譯的時候選擇了 -O1 級別的優(yōu)化選項,如圖11所示,首次編譯時間較長(視電腦配置和性能),這樣運(yùn)行的觸摸效果比不優(yōu)化的更流暢,大家可以分別嘗試一下。至于運(yùn)行效果,也很簡單,被單擊的按鈕會以綠色背景白色字體的效果呈現(xiàn),以示選中,在圖4中已展示。每次點(diǎn)擊觸摸都會把坐標(biāo)打印出來,如圖12所示。


(本文完)