RT-Thread 学习笔记(五)—— RTGUI代码解读
---恢复内容开始---
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代码解读相关推荐
- python函数是一段具有特定功能的语句组_Python学习笔记(五)函数和代码复用
本文将为您描述Python学习笔记(五)函数和代码复用,具体完成步骤: 函数能提高应用的模块性,和代码的重复利用率.在很多高级语言中,都可以使用函数实现多种功能.在之前的学习中,相信你已经知道Pyth ...
- StackExchange.Redis学习笔记(五) 发布和订阅
StackExchange.Redis学习笔记(五) 发布和订阅 原文:StackExchange.Redis学习笔记(五) 发布和订阅 Redis命令中的Pub/Sub Redis在 2.0之后的版 ...
- 好程序员教程分析Vue学习笔记五
好程序员教程分析Vue学习笔记五,上次我们学习了Vue的组件,这次我们来学习一下路由的使用.在Vue中,所谓的路由其实跟其他的框架中的路由的概念差不多,即指跳转的路径. 注意:在Vue中,要使用路由, ...
- 【AngularJs学习笔记五】AngularJS从构建项目开始
为什么80%的码农都做不了架构师?>>> #0 系列目录# AngularJs学习笔记 [AngularJs学习笔记一]Bower解决js的依赖管理 [AngularJs学习笔 ...
- Spring Boot 框架学习笔记(五)( SpringSecurity安全框架 )
Spring Boot 框架学习笔记(五) SpringSecurity安全框架 概述 作用 开发示例: 1. 新建项目 2. 引入依赖 3. 编写`SecurityConfig`类,实现认证,授权, ...
- Python学习笔记五:控制语句
Python学习笔记五:控制语句 Pycharm 开发环境的下载安装配置_项目管理 控制语句 Pycharm 开发环境的使用 Pycharm 下载和安装 激活和选择不同UI 风格 创建项目和初始化配置 ...
- 哈工大操作系统学习笔记五——内核级线程实现
哈工大os学习笔记五(内核级线程实现) 文章目录 哈工大os学习笔记五(内核级线程实现) 一. 中断入口.中断出口(前后两段) 1. 从int中断进入内核(中断入口第一段) 2.中断出口(最后一段) ...
- opencv学习笔记五--文件扫描+OCR文字识别
opencv学习笔记五--文件扫描+OCR文字识别 文件扫描 定义函数 边缘检测 获取轮廓 变换 OCR文字识别 环境配置 代码 文件扫描 # 导入工具包 import numpy as np imp ...
- 华清远见fs4412开发板学习笔记(五)
fs4412开发板学习笔记(五) 作业1: 输入10个整数,按从小到大的顺序输出(选择排序) 每轮排序在未排序的集合中找到(最小/最大),将找到的数与未排序的 第一个数交换位置. 5 4 3 2 1 ...
- 【K210】K210学习笔记五——串口通信
[K210]K210学习笔记五--串口通信 前言 K210如何进行串口通信 K210串口配置 K210串口发送相关定义 K210串口接收相关定义 K210串口发送接收测试 完整源码 前言 本人大四学生 ...
最新文章
- 解决AttributeError: module ‘tensorflow_core._api.v2.config‘ has no attribute ‘experimental_list_device
- matlab 入门 mobi,振动力学基础与MATLAB应用
- Spring Setter依赖注入示例
- C语言字符串分离数字和字母,请问这个用c怎么做:输入一串字符,分别统计其中数字和字母的个数...
- RAC 安装完成后 节点间通信不依赖于SSH
- 从0到1告诉你搭建完整Python+requests接口自动化测试框架!
- 4.28考试总结(下午)
- 2019matlab安装
- mac原版镜像下载 macos官方镜像下载
- 【渝粤教育】电大中专计算机使用基础_1作业 题库
- linux下测硬盘读写速率,linux下测试硬盘读写速度 互联网技术圈 互联网技术圈
- 那些年,我们一起做过的KNX智能化控制经典案例!
- javascript,H5,jQuery,css“实现音乐歌词解析,歌词同步滚动,进度条拖拽、进度条同步,音量控制,歌词同步高亮的功能齐全的简易音乐播放器
- 服务器和应用服务器迁移方案,服务器和应用统迁移方案.doc
- 无线通信sip服务器常用品牌,一种无线Mesh网中多SIP服务器布局方法
- 计算机在电力的应用,浅析计算机技术在电力系统中的应用
- DB2 SQLSTATE 讯息(二)
- Vue项目大屏可视化适配 transform+解决高德地图经纬度偏移
- 电磁炉原理图和单片机C程序源码
- mysql frm 没有myd_为什么MySQL表只对应一个.frm文件,没有.MYD和.MYI文件_MySQL
热门文章
- python好找工作吗2017-你为什么不来了解一下Python?
- 学python找工作有用吗-为什么我不建议你通过 Python 去找工作?
- python买什么书-希望更加深入了解python 有什么书可以推荐?
- python详细安装教程3.7.0-Linux 安装Python3.7.0
- python turtle画椭圆-python turtle 绘制太极图的实例
- 零基础学编程学java还是python-小白学编程选java、php、前端还是python
- python的源代码文件的扩展名是-python源文件后缀是什么
- python3中文手册-Python3.4中文手册 chm版
- python网络爬虫教程-如何入门 Python 爬虫?
- python3.5安装教程-linux下安装python3.5.3的方式