RT-Thread_1.2.0+lwip+rtgui0.8.0 移植心得

1.總的感覺就是rtt的移植比較簡單,因爲是國人做的系統,所以你經常用到的芯片在bsp裏面都能找到,不過貌似支持最好的還是stm32和lpc系列,此外就是S3C2440。
2.對於其三個組件finish,lwip和rtgui的感覺,rtt的重視程度就是頭2個是親的,第三個是後的。
3.finish自帶就是開啓的,找對bsp,直接就能運行;
4.lwip只要使能宏代碼,然後修改基地址和中斷函數就可以了。
5.rtgui則問題非常的多,首先1.2.0對rtgui的接口本身就對應不上,其次rtgui的每個版本變化也非常的厲害。幾個版本直接兼容性很差。
-------------------------------------------------------------------------------
先說一下rtt的基本流程。
1.rtt首先從startup.c裏面進入,在rtthread_startup()裏面完成所有函數的初始化,這個函數裏面基本沒有什麼可修改的,如果你的程序是在外部運行,則需要修改ram的宏定義。
2.其中rtthread_startup裏面的第一個函數rt_hw_board_init最能蒙人了,表明看起來是初始化硬件用的,實際上,這個函數是初始化rtt所需要的最基本的硬件用的,換句話說,這個地方也就是移植的時候需要看看,平時的時候不用看,也千萬不要把外設硬件的初始化放進去,否則容易出問題。我們添加外設則需要放在rt_application_init()裏面。
3..rt_application_init()首先會建立兩個線程,一個是點燈泡的,一個是rt_init_thread_entry()。rt_init_thread_entry()主要是進行外設和所有應用的初始化,一般來說,除了中斷函數外,我們刪減所有的內容都是從這裏開始的。
4.rt_init_thread_entry()主要是四個功能,
一個是rt_components_init(),就是進行向量外設初始化。;這個是新增的內容,早期的版本都是一堆的if宏定義來判斷哪個設備的安裝,結果就是內容又臭又長,新辦法則採用類linux的機制,也就是向量掛接,這個官網有專門的描述,不再細說。
一個是內嵌外設的定義,包括finis,dfs,還有lwip,這個比較簡單,做好宏定義就ok。
一個是其他外設定義,主要是rtgui。
最後則是如果你的外設成功初始化,則可以添加需要的線程。
我們在實際的設計過程中,90%的時候都是在跟這個函數,或者他的子函數打交道。
5.基本流程結束。
-------------------------------------------------------------------------------------
接着說rtgui的流程
1.rtgui是從rt_init_thread_entry()裏面開始的,首先是rt_hw_lcd_init()lcd的硬件初始化,這個初始化不僅僅是對lcd進行初始化,同時也定義了rtgui需要的接口函數。需要強調的是,這個部分變化很大(其實也不是說只是這裏變化大,而是每次版本升級的時候,這裏是面對程序員改動最大的地方)。
2.rt_hw_lcd_init()
首先是進行lcd的初始化,這個基本可以完全搬用其他lcd的初始化;
其次是構造設備結構給rtt進行設備註冊,這裏跟linux的驅動註冊有很相似的地方,只不是還沒有完全的進行使用,因爲在linux中,是把設備當文件進行出來的,可以打開關閉讀取,這個裏面什麼都沒有,對應的函數是空的,從裏面也可以看出來,rtgui還是一個半成品,還有很大的空間,而且思路應該是做成實時系統和linux兩用型的圖形界面。
接着說,重點是裏面的user接口體,這個是需要程序員進行設計,也就是需要手動移植的地方。

struct rt_device_graphic_ops otm4001_ops =
{
    otm4001_lcd_set_pixel,
    otm4001_lcd_get_pixel,
    otm4001_lcd_draw_hline,
    otm4001_lcd_draw_vline,
    otm4001_lcd_blit_line
};
目前就是這幾個函數,設置好就可以了。
我之前繞了很大的彎在這裏,因爲rtgui一直在變,我找了好幾個例程,這裏都不一樣,也不知道哪個好用,最後用到那個1.0.0rtt那個哥們的才完全兼容。
最後是設備在rtt上面的註冊。
3回頭接着看rt_hw_lcd_init()。
下一步就是 rt_device_init_all();
這個是幹什麼的呢,就是重新註冊所有rtt的設備,類似於window的掃描硬件。
再就是
lcd = rt_device_find("lcd");
rtgui_graphic_set_device(lcd);
意思就是將rtgui這個設備與lcd掛接。
這裏有一點注意就是,lcd是lcd,rtgui是rtgui,倆個東西不掛接是運行不了的。
最後就是        guiapplication_init();這個就是rtgui開始運行了
總結一下就是,先進行lcd的初始化,這裏面一個是對硬件初始化,讓他能跑起來,其次是函數初始化,讓rtgui能識別;
然後是設備的註冊,rtt的設備掃描,最後將lcd掛接到rtgui上面後,就進行rtgui圖形界面的初始化。
4.demoapplicate下面的guiapplication_init()就做了一個事情,就是建立了application_entry線程,也就是rtgui的線程。
這個線程都做了些什麼呢,這裏說一下,資料太少,我水平也一般,以下內容估計不一定對,大家講究着看吧。
首先是建立一個主窗體main_win;
然後建立了一個子窗體the_notebook;
接着將子窗體掛鉤到主窗體rtgui_container_add_child(RTGUI_CONTAINER(main_win), RTGUI_WIDGET(the_notebook));
最後對例程初始化並顯示

demo_view_button();
rtgui_win_show(main_win, RT_FALSE);
接着就進入了循環
rtgui_app_run(app);
rtgui_app_destroy(app);
至於這玩意怎麼走的,怎麼弄的,sorry,我還沒開始研究,而且暫時不弄了,因爲是打算上實際工程的,在移植的這段時間感覺這個rtgui還是不夠成熟,所以只有再等等了。
------------------------------------------------------------------------
謝謝大家收看。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章