全志ARM926 Melis2.0系统的开发指引⑥
全志ARM926 Melis2.0系统的开发指引⑥
- 编写目的
- 9. 系统启动流程
- 9.1. Shell 部分
- 9.2.Orange 和 desktop 部分
- 9.3. app_root 加载部分
- 9.4. home 加载部分
- 10. 显示相关知识概述
- 10.1. 总体结构
- 10.2. 显示过程
- 10.3. 显示宽高参数关系
- -. 全志相关工具和资源
- -.1 全志固件镜像修改工具 ImageModify.exe 下载
- -.2 全志固件USB刷机工具 PhoenixSuit 下载
- -.3 全志Melis2.0 用户手册.pdf下载
- -.4 全志melis2.0 sdk源码库下载
编写目的
本文档是全志 Melis2.0 系统的开发指引文档,旨在协助开发者了解和掌握 Melis 系统,快速搭建 Melis系统的开发环境,将 Melis2.0 系统应用到产品开发中。
9. 系统启动流程
系统加载流程:boot0- boot1-kernel(epos.img)-shell
当硬件目标平台上电后,BROM 就会将 BOOT0 装载到 SRAM 中,并从 SRAM 开始执行,将控制权交给 eBoot。
eBoot 的启动流程分为两个阶段:
第一个阶段是 BOOT0 加载 BOOT1,BOOT0 将 BOOT1 装载到 DRAM,在 DRAM 上执行;
第二个阶段是 BOOT1 加载系统内核,BOOT1 将内核装载到 DRAM。
每个阶段分别初始化各自所须的硬件资源,同时也为下一个阶段做好准备工作。本文主要说明从 shell
部分到 home 应用的建立。具体流程如下图:
图57:
下面结合代码进行系统加载流程说明:
9.1. Shell 部分
系统初始化完成之后首先进入 Shell 进行初始化操作(路径:suniv\beetles\ramfs
shell.zgj)。 Shell 部分主要函数是 shellmain()它主要调用三个函数,分别是 Esh_init() 、
Esh_StartUp()、Esh_ReaderLoop()。
Esh_init():主要完成一些必要文件的获取路径,申请资源等操作。
Esh_StartUp():检查并执行 Esh_init()函数获取的 script。(路径:suniv\beetles\ramfs\ startup.esh)
Startup.esh:脚本执行 startx。查看 Esh_builtin.c 文件中定义:shell 命令 startx 调用的是 dostart.c
dostartx.c:__exec_startx()。该函数完成 desktop.mod 和 orange.mod 两个模块的加载和检查。
Esh_ReaderLoop():主要完成 shell 命令读取和执行。等待模块、驱动、窗口等部分安装初始化完成后,
在循环中不断读取串口的调试命令进行处理。可执行的命令均在 Esh_builtin.c 文件中。
9.2.Orange 和 desktop 部分
模块加载:以 desktop.mod 为例,查看 mod_desktop 文件夹下面的 make.cfg 有
TARGET = $(WORKSPACEPATH)/beetles/rootfs/mod/desktop.mod
查看入口代码文件 magic.c 找到初始化接口:在 desktop 模块的 MOpen 函数中加载了 init 模块:
模块加载:查看 init 文件夹下面的 make.cfg 有
TARGET = $(WORKSPACEPATH)/beetles/rootfs/apps/init.axf。
首先查看 magic.c 文件,在 MOpen 函数中创建了一个线程 application_init_process。
Desktop 模块加载完成之后加载 init 模块。Init 模块创建一个应用初始化线程 application_init_process。
线程首先装载必要的驱动,例如音频驱动、按键驱动等。接下来是卡量产的必要准备工作,这里不做过多研究。该线程最重要的三项工作是:
1、创建主管理窗口,用于消息的接受和预处理。该窗口名称为 init_mainwin。关于窗口的分类以及功
能见其他章节。窗口创建时向自身发送 GUI_MSG_CREATE 消息,进行初始化操作。
init_mainwin 消息主管理窗口负责消息预处理,新消息先经过本窗口,收到之后在回调函数
init_mainwin_cb()中进行预处理。在调试阶段可以在这里将经过的消息打印出来,查看消息是否被传递到主消息窗口,之后再一级级向下寻找消息传播路径。
2、在消息循环前在_process_init()函数中加载 app_root 应用和注册钩子函数。钩子函数的作用是从
input 输入子系统中拿消息。
3、启动消息接收和分发服务
9.3. app_root 加载部分
在 applets 文件夹下的 make.cfg 有
TARGET = $(WORKSPACEPATH)/beetles/rootfs/apps/app_root.axf
这正是 inti 部分加载的 app_rootfs.axf 文件。首先创建根管理窗口 APP_ROOT。
首 先 调 用 app_root_wincreat() 函 数 创 建 一 个 管 理 窗 口 , 其 父 窗 口 是 init 创 建 的 根 窗 口
init_mainwin ,名字是 APP_ROOT,并且有一个重要参数 ManWindowProc(管理窗口消息处理过程),注册的回调函数为app_root_win_proc()。父窗口 init_mainwin 发送的消息首先在这里被处理,或者将子窗口的消息发送给父窗口。窗口创建时向自身发送 GUI_MSG_CREATE 消息,进行初始化操作。
app_root_win_proc()函数完成消息处理任务。其中较为重要的是 GUI_MSG_CREATE 和 GUI_MSG_COMMAND以及 GUI_MSG_KEY 三种消息。不需要处理的消息交给默认流程往下分发。
接收到 GUI_MSG_CREATE 进行应用创建。
接收到 GUI_MSG_COMMAND,处理子窗口向父窗口发送来的消息。根据 app 的 ID 进行各个 app 之间的切换。包括资源的关闭打开等。
接收到 GUI_MSG_KEY 进行按键消息处理,完成按键响应,或者直接拦截按键消息。
9.4. home 加载部分
APP_ROOT 的回调函数接收到 GUI_MSG_CREATE 消息,继续进行桌面创建。首先进行内存资源申请,创建子管理窗口 APP_HOME。创建函数为 app_home_create()。Home 管理窗口的名字是 APP_HOME,父管理窗口为APP_ROOT,消息处理回调函数为 app_home_proc()。窗口创建时向自身发送 GUI_MSG_CREATE 消息继续进行初始化操作。
app_home_proc()函数主要完成消息处理任务,其中较为重要的是 GUI_MSG_CREATE 和 GUI_MSG_COMMAND以及 GUI_MSG_KEY 三种消息。不需要处理的消息交给默认流程往下分发。
接收到 GUI_MSG_COMMAND,处理子窗口向本窗口发送的消息。
接收到 GUI_MSG_KEY 进行按键消息处理,完成按键响应,或者直接拦截按键消息。
接收到 GUI_MSG_CREATE 接着完成一系列初始化操作:
其中 app_main_menu_create()创建主菜单图层窗口,申请图层,图层大小与屏幕大小一致。另外创建framewin 窗口依赖在图层窗口之上。framewin 管理窗口为 APP_HOME,回调函数为_main_menu_Proc()创建 framewin 窗口时向自身发送 GUI_MSG_CREATE 和 GUI_MSG_PAINT 消息,进行资源初始化和桌面绘制。
_main_menu_Proc()函数主要完成消息处理任务,其中较为重要的是 GUI_MSG_CREATE 和 GUI_MSG_PAINT以及 GUI_MSG_KEY 三种消息。不需要处理的消息交给默认流程往下分发。
接收到 GUI_MSG_PAINT,绘制桌面内容,有些应用该消息未使用,直接在 GUI_MSG_CREATE 完成绘制。
接收到 GUI_MSG_KEY,进行按键消息处理,完成按键响应。
接收到 GUI_MSG_CREATE,初始化 ui 资源,绘制桌面,激活桌面显示:
至此,应用桌面创建完成。
10. 显示相关知识概述
10.1. 总体结构
应用层:melis 的默认应用名为“beetles”,它是独立于内核的一个应用软件。它通过调用“Orange GUI”和“Display Driver”的各项接口,实现了消息转发,窗口绘制和图像显示。
BSP-Orange :Orange 是基于 Melis 操作系统之上的一套 GUI 系统,支持多任务多图层等操作,给上层提供了丰富的 UI 工具。
BSP-Display_driver: Display 驱动是 Melis 内核对底层硬件接口的封装,屏蔽硬件差异,提供一致的接口给上层。所有的显示相关操作,最终都将依赖于该驱动。
硬件层:真正实现显示的硬件模块。最主要的模块是 DE(display engine)和 TCON。DE 主要的工作是将上层传入的图层数据进行裁剪、格式转换、放大缩小等相关操作,然后将数据输送到 TCON。
10.2. 显示过程
当应用层想要显示一个图层,则需要向驱动层请求一个可用的图层,然后将自己的显示参数(图层模式,数据格式,数据宽高,数据 buf 地址等)设置到图层中,就可以将数据显示到屏幕上。伪代码如下:
在这些参数中要注意 buf 的设置,因为不同格式的数据,其存储方式存在差异。
当显示的数据是 ARGB8888 数据时,其 buf 长度应该是“width * height * 4”,A、R、G、B 各有一份自己的数据,但因为这些数据都是连续交替的存放的,只要数据格式一定,对应数据的位置也是固定的,所以这里只需要给“layer_para.fb.addr[0]”设置地
当显示数据是 YUV 数据时,常常 Y、U、V 数据是分开存储或者 Y 数据和 UV 数据是分开存储的,所以可能会 存 在 多 个 buf 地 址 的 情 况 , 这 时 就 要 用 到 “ layer_para.fb.addr[0] ” 、 “ layer_para.fb.addr[1] ” 、“layer_para.fb.addr[2]”参数配合使用。设置好地址后,DE 会自动将 BUF 合并,然后将图层传送到 Tcon 中。
10.3. 显示宽高参数关系
各个宽高参数间有对应的关系。宽高和位置的设置,主要是为了灵活地显示一张图片中的内容。当只需要显示一张图片的某个部分、或者仅将图片在屏幕的某个位置上显示时,就需要对各个宽高进行特定配置。传入参数中的图层 buf,我们可以认定为这是一整张图片,称这个 buf 为“frame buffer”,其宽高为“layer_para.fb.size.width ”和“layer_para.fb.size.height”,而我们可以设置一个窗口,让我 们 在 显 示 过 程 中 , 仅 显 示 窗 口 中 的 内 容 , 这 个 窗 口 从 ( layer_para.src_win.x ,
layer_para.src_win.y ) 坐 标 开 始 , 显 示 宽 为 “layer_para.src_win.width ” 、 高 为
“layer_para.src_win.height”的内容。这里可以看出,“src_win”的宽高必须要比“fb.size”的宽高小
或者相等,且坐标也不能越界,否则显示是不正常的。
当截取到一个窗口后,这个窗口的数据将铺满“SCN”(显示窗口),“src_win”和“scn_win”
的比值,将是这个窗口被拉伸缩小的倍数,当然,最好不要设置比较奇怪的比值(一般的比值
都是 1、2、1/2)否则将会让显示不成功,或者显示不正常。
最后,显示窗口“scn_win”将从(scn_win.x ,scn_win.y)点开始在屏幕上显示,显示宽为
“scn_win.width”,高为“scn_win.height”的图层。
-. 全志相关工具和资源
-.1 全志固件镜像修改工具 ImageModify.exe 下载
下载地址:
固件镜像修改工具 ImageModify.exe下载 ImageModify_20230906.rar
-.2 全志固件USB刷机工具 PhoenixSuit 下载
下载地址:
USB刷机工具 PhoenixSuit下载 PhoenixSuit_CN_V1.1.1_20230906.rar
-.3 全志Melis2.0 用户手册.pdf下载
下载地址:
全志Melis2.0 用户手册.pdf下载 documents_20230906_melis_v2.0.rar
-.4 全志melis2.0 sdk源码库下载
下载地址:
全志melis2.0 sdk源码库下载 melis2.0-sdk-release_20230906V2.0.rar
相关文章:
全志ARM926 Melis2.0系统的开发指引⑥
全志ARM926 Melis2.0系统的开发指引⑥ 编写目的9. 系统启动流程9.1. Shell 部分9.2.Orange 和 desktop 部分9.3. app_root 加载部分9.4. home 加载部分 10. 显示相关知识概述10.1. 总体结构10.2. 显示过程10.3. 显示宽高参数关系 -. 全志相关工具和资源-.1 全志固件镜像修改工具…...
Junit单元测试为什么不能有返回值?
这个问题的产生来源于我们老师上节课说的我们班一个男生问他的想法,刚开始听到这个还觉得挺有意思,我之前使用单元测试好像下意识的就将它的返回值写为void,一般都是进行简单的测试,也从没思考过在某个单元测试中调用另一个单元测试ÿ…...
【成像光敏描记图提取和处理】成像-光电容积描记-提取-脉搏率-估计(Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...
Ubuntu无法引导启动的修复
TLDR:使用Boot-Repair工具。 Boot-Repair Boot-Repair是一个简单的工具,用于修复您在Ubuntu中可能遇到的常见启动问题,例如在安装Windows或其他Linux发行版后无法启动Ubuntu时,或者在安装Ubuntu后无法启动Windows时,…...
Windows电脑上的多开软件是否安全?
在Windows电脑上使用多开软件可以让使用者同时运行多个相同或不同的程序,这对于某些需要同时操作多个账号或实例的用户来说非常有用。但是很多人担心使用多开软件是否安全。 多开软件的安全问题主要在于它们可能会破坏操作系统的稳定性和安全性,导致系统…...
U盘支持启动区+文件存储区的分区方法
准备新U盘 启动diskgenius ,先建立一个主分区(7G),剩余空间建立为第二分区,然后设定第二分区激活。 diskgenius格式化 用diskgenius格式化,在格式化的过程中有一个 写入dos系统的选项,在格式…...
JavaEE-线程进阶
模拟实现一个定时器 运行结果如下: 上述模拟定时器的全部代码: import java.util.PriorityQueue;//创建一个类,用来描述定时器中的一个任务 class MyTimerTask implements Comparable<MyTimerTask> {//任务执行时间private long …...
【开发篇】十五、Spring Task实现定时任务
文章目录 1、使用示例2、相关配置3、Scheduled注解4、Spring Task单线程下的阻塞坑5、Spring Task阻塞问题的处理思路6、Spring Task在分布式环境中 上一篇用Quartz来实现了定时任务,但相对来说,这个框架还是比较繁琐。Spring Boot默认在无任何第三方依赖…...
Python常用功能的标准代码
后台运行并保存log 1 2 3 4 5 6 7 8 9 nohup python -u test.py > test.log 2>&1 & #最后的&表示后台运行 #2 输出错误信息到提示符窗口 #1 表示输出信息到提示符窗口, 1前面的&注意添加, 否则还会创建一个名为1的文件 #最后会把日志文件输出到test.log文…...
Electron.js入门-构建第一个聊天应用程序
什么是electron 电子是一个开源框架,用于使用web技术构建跨平台桌面应用程序;即: HTML、CSS和JavaScript;被集成为节点模块,我们可以为我们的应用程序使用节点的所有功能;组件,如数据库、Api休…...
ubuntu 22.04 更新NVIDIA显卡驱动,重启后无网络图标等系统奇奇怪怪问题
环境 win10, ubuntu 22.04双系统 笔记本电脑,4060显卡 解决思路 具体的过程当时没有记录下来,然后因为在解决系统的问题,也没有截图啥的,只有一些大概记忆,供未来的自己参考吧。 首先是更新显卡驱动 我是直接在soft…...
Python综合案例:学生管理系统
目录 需求说明: 功能: 创建入口函数: 实现菜单函数: 实现增删查操作: 1. 新增学生 2. 展示学生 3. 查找学生 4. 删除学生 加入存档读档: 1. 约定存档格式 2. 实现存档函数 3. 实现读档函数 打…...
IDT 一款自动化挖掘未授权访问漏洞的信息收集工具
IDT v1.0 IDT 意为 Interface detection(接口探测) 项目地址: https://github.com/cikeroot/IDT/该工具主要的功能是对批量url或者接口进行存活探测,支持浏览器自动打开指定的url,避免手动重复打开网址。只需输入存在批量的url文件即可。 …...
复习 --- 消息队列
进程间通信机制(IPC) 简述 IPC:Inter Process Communication 进程和进程之间的用户空间相互独立,但是4G内核空间共享,进程间的通信就是通过这4G的内核空间 分类 传统的进程间通信机制 无名管道(pipe) 有名管道&…...
AcWing 288. 休息时间,《算法竞赛进阶指南》
288. 休息时间 - AcWing题库 在某个星球上,一天由 N 个小时构成,我们称 0 点到 1 点为第 1 个小时、1 点到 2 点为第 2 个小时,以此类推。 在第 i 个小时睡觉能够恢复 Ui 点体力。 在这个星球上住着一头牛,它每天要休息 B 个小…...
ES6中字符串的扩展
字符串的遍历器接口 使用for…of for(let x of foo) {console.log(x); } // f; o; oat() ES5中的charAt()方法,返回字符串给定位置的字符。但是不能识别码点大于0xFFFF的字符,at方法可以 includes()、startsWith()、endsWith() 用来确定一个字符串是…...
GEO生信数据挖掘(四)数据清洗(离群值处理、低表达基因、归一化、log2处理)
检索到目标数据集后,开始数据挖掘,本文以阿尔兹海默症数据集GSE1297为例 目录 离群值处理 删除 低表达基因 函数归一化,矫正差异 数据标准化—log2处理 完整代码 上节围绕着探针ID和基因名称做了一些清洗工作,还做了重复值检查…...
CI/CD工具中的CI和CD的含义
CI/CD工具中的CI和CD的含义? CI/CD 是现代软件开发方法中广泛使用的一种方法。其中,CI 代表持续集成(Continuous Integration),CD 则有两层含义,一是持续交付(Continuous Delivery)…...
用go获取IPv4地址,WLAN的IPv4地址,本机公网IP地址详解
文章目录 获取IPv4地址获取WLAN的IPv4地址获取本机公网IP地址 获取IPv4地址 下面的代码会打印出本机所有的IPv4地址。这个方法可能会返回多个IP地址,因为一台机器可能有多个网络接口,每个接口可能有一个或多个IP地址。 package mainimport ("fmt&…...
Android自定义Drawable---灵活多变的矩形背景
Android自定义Drawable—灵活多变的矩形背景 在安卓开发中,我们通常需要为不同的按钮设置不同的背景以实现不同的效果,有时还需要这些按钮根据实际情况进行变化。如果采用编写resource中xml文件的形式,就需要重复定义许多只有微小变动的资源…...
ParagonNTFSforMac_15.5.102中文版最受欢迎的NTFS硬盘格式读取工具
Paragon NTFS for Mac是一款可以为您轻松解决Mac平台上不能识别Windows通用的NTFS文件难题,这是一款强大的Mac读写工具,相信在很多时候,Mac用户需要对NTFS文件的移动硬盘进行写入,但是macOS系统默认是不让写入的,使用小…...
Kafka 搭建过程
目录 1.关于Kafka2.Kafka 搭建过程3.参考 本文主要介绍Kafka基本原理,以及搭建过程。 1.关于Kafka Apache Kafka是一个开源的分布式事件流平台,被设计用来实现实时数据流的发布、订阅、存储和处理。 Kafka的主要特性包括: 高吞吐量&#x…...
七、2023.10.1.Linux(一).7
文章目录 1、 Linux中查看进程运行状态的指令、查看内存使用情况的指令、tar解压文件的参数。2、文件权限怎么修改?3、说说常用的Linux命令?4、说说如何以root权限运行某个程序?5、 说说软链接和硬链接的区别?6、说说静态库和动态…...
一文教你搞懂Redis集群
一、Redis主从 1.1、搭建主从架构 单节点的Redis的并发能力是有上限的,要进一步的提高Redis的并发能力,据需要大家主从集群,实现读写分离。 共包含三个实例,由于资源有限,所以在一台虚拟机上,开启多个red…...
树上启发式合并 待补
对于每个子树,直接遍历所有轻儿子,继承重儿子 会了板子后,修改维护的东西和莫队是一样的 洛谷 U41492 #include <bits/stdc.h> #define ll long long #define ull unsigned long long constexpr int N1e55; std::vector<int> e…...
minio分布式文件存储
基本介绍 什么是 MinIO MinIO 是一款基于 Go 语言的高性能、可扩展、云原生支持、操作简单、开源的分布式对象存储产品。基于 Apache License v2.0 开源协议,虽然轻量,却拥有着不错的性能。它兼容亚马逊S3云存储服务接口。可以很简单的和其他应…...
Linux新的IO模型io_uring
一、Linux下的网络通信模型 在网络开发的过程中,需要处理好几个问题。首先是通信的内核支持问题;其次是通信的模型问题;最后是框架问题。这些问题在闭源的OS如Windows上,基本上不算什么大问题(因为只能用人家的API&am…...
FFmpeg 命令:从入门到精通 | FFmpeg 基本介绍
FFmpeg 命令:从入门到精通 | FFmpeg 基本介绍 FFmpeg 命令:从入门到精通 | FFmpeg 基本介绍FFmpeg 简介FFmpeg 基础知识复用与解复用编解码器码率和帧率 资料 FFmpeg 命令:从入门到精通 | FFmpeg 基本介绍 本系列文章要解决的问题࿱…...
数组篇 第一题:删除排序数组中的重复项
更多精彩内容请关注微信公众号:听潮庭。 第一题:删除排序数组中的重复项 给你一个 非严格递增排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应…...
堆的初步认识
在学习本节文章前要先了解:大顶堆与小顶堆: (优先级队列_加瓦不加班的博客-CSDN博客) 堆实现 计算机科学中,堆是一种基于树的数据结构,通常用完全二叉树实现。 什么叫完全二叉树? 答&#x…...
wordpress单号管理系统/seo全网推广营销软件
Why java内存管理分为内存分配和内存回收,都不需要程序员负责,垃圾回收的机制主要是看对象是否有引用指向该对象。 java对象的引用包括强引用,软引用,弱引用,虚引用 Java中提供这四种引用类型主要有两个目的࿱…...
做婚恋网站投入多少钱/seo网站推广方式
我主要负责苦。智能仓储物流技术研习社长按识别别关注围绕厂内物流Intralogisitics,分享仓储物流自动化技术、设备、系统等知识,畅谈智能仓储物流的未来和去向。专栏包括智能仓储物流自动化规划设计,自动化立体库、智能机器人,自动…...
网站建设的软件平台/如何注册网站
1.安装DBI和DBD::Oracle 模块。下载地址:http://search.cpan.org/搜索DBI,DBD::Oracle如果你的linux可以连接网络,执行命令:#wget http://search.cpan.org/CPAN/authors/id/T/TI/TIMB/DBI-1.622.tar.gz#wget http://search.cpan.o…...
开网站 怎么做网上支付/seo基本概念
1,project->Add->Other->加入一个Global页面2,在Global页面中放sqlConnection sqlCommand并设好他们的连接3,在接口处注销strict private接口的代码如下---------------------------typeTGlobal class(System.Web.HttpApplication){$REGION Designer Managed Code}//…...
个人网站设计报告书/杭州排名推广
trait实现调用链模式 我们如果要开发一个支付功能,往往需要执行一系列的验证才能完成支付。 例如: 进行支付签名校验 数据合法性校验 如果将来因为第三方接口支付的调整,需要增加更多的校验规则,此时如何不修改之前的校验代码&…...
镇级政府可以做网站吗/关键词网站推广
P11.1-Webpack介绍 1.概述 Webpack是vue开发过程中不可缺少的一部分,他主要是用来对开发完成的代码进行模块化打包。将打包后的文件部署到服务上,供用户使用。 2.Webpack介绍 2.1.什么是Webpack 什么是webpack? 我们先看看官方的解释&…...