硬汉嵌入式论坛

 找回密码
 立即注册
查看: 20274|回复: 4
收起左侧

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

[复制链接]

15

主题

40

回帖

85

积分

版主

Rank: 7Rank: 7Rank: 7

积分
85
发表于 2014-8-8 10:31:53 | 显示全部楼层 |阅读模式
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还是不够成熟,所以只有再等等了。
------------------------------------------------------------------------
谢谢大家收看。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
发表于 2014-8-8 10:49:48 | 显示全部楼层
GUI不好做,需要一个大的团队才可以完成,看看早期的UCGUI3.98就知道工作量有多大,重要的是推出到现在的5.24,兼容性依然杠杠的。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
发表于 2014-8-8 10:50:03 | 显示全部楼层
感谢楼主分享心得。[s:151] [s:151] [s:151] [s:151]
回复

使用道具 举报

15

主题

40

回帖

85

积分

版主

Rank: 7Rank: 7Rank: 7

积分
85
 楼主| 发表于 2014-8-8 11:25:49 | 显示全部楼层

回 eric2013 的帖子

eric2013:GUI不好做,需要一个大的团队才可以完成,看看早期的UCGUI3.98就知道工作量有多大,重要的是推出到现在的5.24,兼容性依然杠杠的。 (2014-08-08 10:49) 
其实rtgui的兼容性很差也能理解,毕竟还没有到正式版,底层函数变化很大也正常。
我只是理解不了为啥rtt不自带rtgui了
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
发表于 2014-8-8 11:43:15 | 显示全部楼层

回 xinn2000 的帖子

xinn2000:其实rtgui的兼容性很差也能理解,毕竟还没有到正式版,底层函数变化很大也正常。
我只是理解不了为啥rtt不自带rtgui了 (2014-08-08 11:25) 
1. 这个也好理解,也许做RTGUI的作者想独立出来(独立出RTT,不是RTT团队),大干一把。早期的RTGUI就是耦合在RTT上面的,使用RTGUI就必须得用RTT,很不方便。
2. 毕竟RTT的商业模式还没有形成,现在他们也需要收入,要不很难坚持下来。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-4-29 07:39 , Processed in 0.205179 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表