当前位置: 首页 > news >正文

全志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,一般都是进行简单的测试,也从没思考过在某个单元测试中调用另一个单元测试&#xff…...

【成像光敏描记图提取和处理】成像-光电容积描记-提取-脉搏率-估计(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-线程进阶

模拟实现一个定时器 运行结果如下&#xff1a; 上述模拟定时器的全部代码&#xff1a; import java.util.PriorityQueue;//创建一个类&#xff0c;用来描述定时器中的一个任务 class MyTimerTask implements Comparable<MyTimerTask> {//任务执行时间private long …...

【开发篇】十五、Spring Task实现定时任务

文章目录 1、使用示例2、相关配置3、Scheduled注解4、Spring Task单线程下的阻塞坑5、Spring Task阻塞问题的处理思路6、Spring Task在分布式环境中 上一篇用Quartz来实现了定时任务&#xff0c;但相对来说&#xff0c;这个框架还是比较繁琐。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 电子是一个开源框架&#xff0c;用于使用web技术构建跨平台桌面应用程序&#xff1b;即&#xff1a; HTML、CSS和JavaScript&#xff1b;被集成为节点模块&#xff0c;我们可以为我们的应用程序使用节点的所有功能&#xff1b;组件&#xff0c;如数据库、Api休…...

ubuntu 22.04 更新NVIDIA显卡驱动,重启后无网络图标等系统奇奇怪怪问题

环境 win10, ubuntu 22.04双系统 笔记本电脑&#xff0c;4060显卡 解决思路 具体的过程当时没有记录下来&#xff0c;然后因为在解决系统的问题&#xff0c;也没有截图啥的&#xff0c;只有一些大概记忆&#xff0c;供未来的自己参考吧。 首先是更新显卡驱动 我是直接在soft…...

Python综合案例:学生管理系统

目录 需求说明&#xff1a; 功能&#xff1a; 创建入口函数&#xff1a; 实现菜单函数&#xff1a; 实现增删查操作&#xff1a; 1. 新增学生 2. 展示学生 3. 查找学生 4. 删除学生 加入存档读档&#xff1a; 1. 约定存档格式 2. 实现存档函数 3. 实现读档函数 打…...

IDT 一款自动化挖掘未授权访问漏洞的信息收集工具

IDT v1.0 IDT 意为 Interface detection&#xff08;接口探测) 项目地址: https://github.com/cikeroot/IDT/该工具主要的功能是对批量url或者接口进行存活探测&#xff0c;支持浏览器自动打开指定的url&#xff0c;避免手动重复打开网址。只需输入存在批量的url文件即可。 …...

复习 --- 消息队列

进程间通信机制(IPC) 简述 IPC&#xff1a;Inter Process Communication 进程和进程之间的用户空间相互独立&#xff0c;但是4G内核空间共享&#xff0c;进程间的通信就是通过这4G的内核空间 分类 传统的进程间通信机制 无名管道&#xff08;pipe&#xff09; 有名管道&…...

AcWing 288. 休息时间,《算法竞赛进阶指南》

288. 休息时间 - AcWing题库 在某个星球上&#xff0c;一天由 N 个小时构成&#xff0c;我们称 0 点到 1 点为第 1 个小时、1 点到 2 点为第 2 个小时&#xff0c;以此类推。 在第 i 个小时睡觉能够恢复 Ui 点体力。 在这个星球上住着一头牛&#xff0c;它每天要休息 B 个小…...

ES6中字符串的扩展

字符串的遍历器接口 使用for…of for(let x of foo) {console.log(x); } // f; o; oat() ES5中的charAt()方法&#xff0c;返回字符串给定位置的字符。但是不能识别码点大于0xFFFF的字符&#xff0c;at方法可以 includes()、startsWith()、endsWith() 用来确定一个字符串是…...

GEO生信数据挖掘(四)数据清洗(离群值处理、低表达基因、归一化、log2处理)

检索到目标数据集后&#xff0c;开始数据挖掘&#xff0c;本文以阿尔兹海默症数据集GSE1297为例 目录 离群值处理 删除 低表达基因 函数归一化&#xff0c;矫正差异 数据标准化—log2处理 完整代码 上节围绕着探针ID和基因名称做了一些清洗工作&#xff0c;还做了重复值检查…...

CI/CD工具中的CI和CD的含义

CI/CD工具中的CI和CD的含义&#xff1f; CI/CD 是现代软件开发方法中广泛使用的一种方法。其中&#xff0c;CI 代表持续集成&#xff08;Continuous Integration&#xff09;&#xff0c;CD 则有两层含义&#xff0c;一是持续交付&#xff08;Continuous Delivery&#xff09;…...

用go获取IPv4地址,WLAN的IPv4地址,本机公网IP地址详解

文章目录 获取IPv4地址获取WLAN的IPv4地址获取本机公网IP地址 获取IPv4地址 下面的代码会打印出本机所有的IPv4地址。这个方法可能会返回多个IP地址&#xff0c;因为一台机器可能有多个网络接口&#xff0c;每个接口可能有一个或多个IP地址。 package mainimport ("fmt&…...

Android自定义Drawable---灵活多变的矩形背景

Android自定义Drawable—灵活多变的矩形背景 在安卓开发中&#xff0c;我们通常需要为不同的按钮设置不同的背景以实现不同的效果&#xff0c;有时还需要这些按钮根据实际情况进行变化。如果采用编写resource中xml文件的形式&#xff0c;就需要重复定义许多只有微小变动的资源…...

为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?

在建筑行业&#xff0c;项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升&#xff0c;传统的管理模式已经难以满足现代工程的需求。过去&#xff0c;许多企业依赖手工记录、口头沟通和分散的信息管理&#xff0c;导致效率低下、成本失控、风险频发。例如&#…...

高频面试之3Zookeeper

高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个&#xff1f;3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制&#xff08;过半机制&#xff0…...

Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务

通过akshare库&#xff0c;获取股票数据&#xff0c;并生成TabPFN这个模型 可以识别、处理的格式&#xff0c;写一个完整的预处理示例&#xff0c;并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务&#xff0c;进行预测并输…...

MMaDA: Multimodal Large Diffusion Language Models

CODE &#xff1a; https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA&#xff0c;它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构&#xf…...

1.3 VSCode安装与环境配置

进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件&#xff0c;然后打开终端&#xff0c;进入下载文件夹&#xff0c;键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...

leetcodeSQL解题:3564. 季节性销售分析

leetcodeSQL解题&#xff1a;3564. 季节性销售分析 题目&#xff1a; 表&#xff1a;sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...

【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具

第2章 虚拟机性能监控&#xff0c;故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令&#xff1a;jps [options] [hostid] 功能&#xff1a;本地虚拟机进程显示进程ID&#xff08;与ps相同&#xff09;&#xff0c;可同时显示主类&#x…...

在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?

uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件&#xff0c;用于在原生应用中加载 HTML 页面&#xff1a; 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...

Git 3天2K星标:Datawhale 的 Happy-LLM 项目介绍(附教程)

引言 在人工智能飞速发展的今天&#xff0c;大语言模型&#xff08;Large Language Models, LLMs&#xff09;已成为技术领域的焦点。从智能写作到代码生成&#xff0c;LLM 的应用场景不断扩展&#xff0c;深刻改变了我们的工作和生活方式。然而&#xff0c;理解这些模型的内部…...

逻辑回归暴力训练预测金融欺诈

简述 「使用逻辑回归暴力预测金融欺诈&#xff0c;并不断增加特征维度持续测试」的做法&#xff0c;体现了一种逐步建模与迭代验证的实验思路&#xff0c;在金融欺诈检测中非常有价值&#xff0c;本文作为一篇回顾性记录了早年间公司给某行做反欺诈预测用到的技术和思路。百度…...