---恢复内容开始---

RT-Thread 版本:2.1.0

RTGUI相关代码解读,仅为自己学习记录,若有错误之处,请告知maoxudong0813@163.com,不胜感激!

GUI流程:

main() -> rtthread_startup(); -> rt_hw_board_init(); -> rt_components_board_init();

在rt_components_board_init()中:

 1 void rt_components_board_init(void)
 2 {
 3 #if RT_DEBUG_INIT
 4     int result;
 5     const struct rt_init_desc *desc;
 6     for (desc = &__rt_init_desc_rti_board_start; desc < &__rt_init_desc_rti_board_end; desc ++)
 7     {
 8         rt_kprintf("initialize %s", desc->fn_name);
 9         result = desc->fn();
10         rt_kprintf(":%d done\n", result);
11     }
12 #else
13     const init_fn_t *fn_ptr;
14
15     for (fn_ptr = &__rt_init_rti_board_start; fn_ptr < &__rt_init_rti_board_end; fn_ptr++)
16     {
17         (*fn_ptr)();              //此处回调所有组件的初始化函数
18     }
19 #endif
20 }

查找init_fn_t的定义:(参考阅读:http://blog.csdn.net/sunheshan/article/details/48596103)

 1 /* initialization export */
 2 #ifdef RT_USING_COMPONENTS_INIT
 3 typedef int (*init_fn_t)(void);
 4 #ifdef _MSC_VER /* we do not support MS VC++ compiler */
 5     #define INIT_EXPORT(fn, level)
 6 #else
 7     #if RT_DEBUG_INIT
 8         struct rt_init_desc
 9         {
10             const char* fn_name;
11             const init_fn_t fn;
12         };
13         #define INIT_EXPORT(fn, level)          \
14             const char __rti_##fn##_name[] = #fn; \
15             const struct rt_init_desc __rt_init_desc_##fn SECTION(".rti_fn."level) = \
16             { __rti_##fn##_name, fn};
17     #else
18         #define INIT_EXPORT(fn, level)  \                        //重点就是在这两行
19             const init_fn_t __rt_init_##fn SECTION(".rti_fn."level) = fn      //INIT_APP_EXPORT(rtgui_system_server_init) 相当于__rt_init_rtgui_system_server_init @ .rti_fn.620 #endif 21 #endif 22 #else 
23 #define INIT_EXPORT(fn, level) 24 #endif 2526 /* board init routines will be called in board_init() function */ 27 #define INIT_BOARD_EXPORT(fn) INIT_EXPORT(fn, "1") 28 /* device/component/fs/app init routines will be called in init_thread */ 29 /* device initialization */ 30 #define INIT_DEVICE_EXPORT(fn) INIT_EXPORT(fn, "2") 31 /* components initialization (dfs, lwip, ...) */ 32 #define INIT_COMPONENT_EXPORT(fn) INIT_EXPORT(fn, "3") 33 /* file system initialization (dfs-elm, dfs-rom, ...) */ 34 #define INIT_FS_EXPORT(fn) INIT_EXPORT(fn, "4") 35 /* environment initialization (mount disk, ...) */ 36 #define INIT_ENV_EXPORT(fn) INIT_EXPORT(fn, "5") 37 /* appliation initialization (rtgui application etc ...) */ 38 #define INIT_APP_EXPORT(fn) INIT_EXPORT(fn, "6")

根据INIT_APP_EXPORT,找到GUI初始化函数:

 1 int rtgui_system_server_init(void)
 2 {
 3     rt_mutex_init(&_screen_lock, "screen", RT_IPC_FLAG_FIFO);
 4
 5     /* init image */
 6     rtgui_system_image_init();
 7     /* init font */
 8     rtgui_font_system_init();
 9
10     /* init rtgui server */
11     rtgui_topwin_init();
12     rtgui_server_init();
13
14     /* use driver rect for main window */
15     rtgui_graphic_driver_get_rect(rtgui_graphic_driver_get_default(), &_mainwin_rect);
16
17     /* set the default font */
18 #if RTGUI_DEFAULT_FONT_SIZE == 16
19     rtgui_font_set_defaut(&rtgui_font_asc16);
20 #elif RTGUI_DEFAULT_FONT_SIZE == 12
21     rtgui_font_set_defaut(&rtgui_font_asc12);
22 #else
23     rtgui_font_set_defaut(&rtgui_font_asc12);
24 #endif
25
26     return 0;
27 }
28 INIT_APP_EXPORT(rtgui_system_server_init);

在.map文件中:

可以看到__rt_init_rtgui_system_server_init的地址和.rti_fn.6的地址是相同的。

至此可大致了解RT Thread组件初始化的方式,在固定的地址段存放相关的初始化函数,然后用一个回调函数去逐个调取执行,以完成响应组件的初始化。

转载于:https://www.cnblogs.com/skawu/articles/7682199.html

RT-Thread 学习笔记(五)—— RTGUI代码解读相关推荐

  1. python函数是一段具有特定功能的语句组_Python学习笔记(五)函数和代码复用

    本文将为您描述Python学习笔记(五)函数和代码复用,具体完成步骤: 函数能提高应用的模块性,和代码的重复利用率.在很多高级语言中,都可以使用函数实现多种功能.在之前的学习中,相信你已经知道Pyth ...

  2. StackExchange.Redis学习笔记(五) 发布和订阅

    StackExchange.Redis学习笔记(五) 发布和订阅 原文:StackExchange.Redis学习笔记(五) 发布和订阅 Redis命令中的Pub/Sub Redis在 2.0之后的版 ...

  3. 好程序员教程分析Vue学习笔记五

    好程序员教程分析Vue学习笔记五,上次我们学习了Vue的组件,这次我们来学习一下路由的使用.在Vue中,所谓的路由其实跟其他的框架中的路由的概念差不多,即指跳转的路径. 注意:在Vue中,要使用路由, ...

  4. 【AngularJs学习笔记五】AngularJS从构建项目开始

    为什么80%的码农都做不了架构师?>>>    #0 系列目录# AngularJs学习笔记 [AngularJs学习笔记一]Bower解决js的依赖管理 [AngularJs学习笔 ...

  5. Spring Boot 框架学习笔记(五)( SpringSecurity安全框架 )

    Spring Boot 框架学习笔记(五) SpringSecurity安全框架 概述 作用 开发示例: 1. 新建项目 2. 引入依赖 3. 编写`SecurityConfig`类,实现认证,授权, ...

  6. Python学习笔记五:控制语句

    Python学习笔记五:控制语句 Pycharm 开发环境的下载安装配置_项目管理 控制语句 Pycharm 开发环境的使用 Pycharm 下载和安装 激活和选择不同UI 风格 创建项目和初始化配置 ...

  7. 哈工大操作系统学习笔记五——内核级线程实现

    哈工大os学习笔记五(内核级线程实现) 文章目录 哈工大os学习笔记五(内核级线程实现) 一. 中断入口.中断出口(前后两段) 1. 从int中断进入内核(中断入口第一段) 2.中断出口(最后一段) ...

  8. opencv学习笔记五--文件扫描+OCR文字识别

    opencv学习笔记五--文件扫描+OCR文字识别 文件扫描 定义函数 边缘检测 获取轮廓 变换 OCR文字识别 环境配置 代码 文件扫描 # 导入工具包 import numpy as np imp ...

  9. 华清远见fs4412开发板学习笔记(五)

    fs4412开发板学习笔记(五) 作业1: 输入10个整数,按从小到大的顺序输出(选择排序) 每轮排序在未排序的集合中找到(最小/最大),将找到的数与未排序的 第一个数交换位置. 5 4 3 2 1 ...

  10. 【K210】K210学习笔记五——串口通信

    [K210]K210学习笔记五--串口通信 前言 K210如何进行串口通信 K210串口配置 K210串口发送相关定义 K210串口接收相关定义 K210串口发送接收测试 完整源码 前言 本人大四学生 ...

最新文章

  1. 解决AttributeError: module ‘tensorflow_core._api.v2.config‘ has no attribute ‘experimental_list_device
  2. matlab 入门 mobi,振动力学基础与MATLAB应用
  3. Spring Setter依赖注入示例
  4. C语言字符串分离数字和字母,请问这个用c怎么做:输入一串字符,分别统计其中数字和字母的个数...
  5. RAC 安装完成后 节点间通信不依赖于SSH
  6. 从0到1告诉你搭建完整Python+requests接口自动化测试框架!
  7. 4.28考试总结(下午)
  8. 2019matlab安装
  9. mac原版镜像下载 macos官方镜像下载
  10. 【渝粤教育】电大中专计算机使用基础_1作业 题库
  11. linux下测硬盘读写速率,linux下测试硬盘读写速度 互联网技术圈 互联网技术圈
  12. 那些年,我们一起做过的KNX智能化控制经典案例!
  13. javascript,H5,jQuery,css“实现音乐歌词解析,歌词同步滚动,进度条拖拽、进度条同步,音量控制,歌词同步高亮的功能齐全的简易音乐播放器
  14. 服务器和应用服务器迁移方案,服务器和应用统迁移方案.doc
  15. 无线通信sip服务器常用品牌,一种无线Mesh网中多SIP服务器布局方法
  16. 计算机在电力的应用,浅析计算机技术在电力系统中的应用
  17. DB2 SQLSTATE 讯息(二)
  18. Vue项目大屏可视化适配 transform+解决高德地图经纬度偏移
  19. 电磁炉原理图和单片机C程序源码
  20. mysql frm 没有myd_为什么MySQL表只对应一个.frm文件,没有.MYD和.MYI文件_MySQL

热门文章

  1. python好找工作吗2017-你为什么不来了解一下Python?
  2. 学python找工作有用吗-为什么我不建议你通过 Python 去找工作?
  3. python买什么书-希望更加深入了解python 有什么书可以推荐?
  4. python详细安装教程3.7.0-Linux 安装Python3.7.0
  5. python turtle画椭圆-python turtle 绘制太极图的实例
  6. 零基础学编程学java还是python-小白学编程选java、php、前端还是python
  7. python的源代码文件的扩展名是-python源文件后缀是什么
  8. python3中文手册-Python3.4中文手册 chm版
  9. python网络爬虫教程-如何入门 Python 爬虫?
  10. python3.5安装教程-linux下安装python3.5.3的方式