自制嵌入式GUI 【前1-3篇】-基于freeRTOS

2023-05-16

自制GUI第4篇:https://blog.csdn.net/shungry/article/details/78659613

自制GUI第5篇:https://blog.csdn.net/shungry/article/details/85246023

———————————————————————分割线—————————————————————————

本篇文章我在野火论坛中发布过,现在修改下发到这里(里面可能会有很多逻辑不通的地方请见谅)

第一篇

因为接近毕业,在老师的推荐下做了个GUI,花了将近一个月的时间,从一点都不了解C++,到用C++做出一个简单的消息机制,以及简单的控件库,发帖纪念一下。虽然还是简单的不行,包括各个控件的重绘机制都有些BUG 重绘的控件会重新改过所有的控件-----尴尬。想消息处理机制依然有些混乱,借鉴了miniGui的窗口过程方式,但是人家毕竟是pc上的大型GUI,理解不大来,期间也看了QT,最后才加了自己理解用孩子兄弟二叉树表示了整个GUI的结构,现在发现了许多因这种方式的不足,但是一条路走到黑了。
二叉树:
 
目前的GUI测试界面:
 
list控件:(实在是简陋)
键盘:(只支持英文)
 
对话框:
 

图中还有 单选框,复选框,滑块和进度条。---第一次发帖,确实不会排版,大牛们见谅哈。。
现在自己的脑子一片混乱,没发做下去了。我老师还想我增强可移植性。。。😢



补充一句:我现在还在完善代码,如果不出意外,本周末或下周会发最新的情况。
中间还有很多BUG,我也不知道自己能做成什么样。
有兴趣的各位可以加入一起完善代码。---------------------但是C++代码真的写的难看

第二篇


之前的GUI实现方法都没讲,以后慢慢讲把。但是代码都公开,虽然很难看。但是很欢迎大家提意见。
这里还是感谢火哥支持,让我有了做下去的动力!!!
之前留下了一些自己很难解决的问题,这次大概全部都解决了(但是有些都是走擦边球
上次发的问题 :
     问题 1:当某个控件注册重绘后再消失时,桌面还留下了之前的控件的图案,之前解决方法在控件销售时重绘桌面(这样当所有小按键消失时都会导致背景重绘,所以会出现屏幕经常闪动)
     解决 :在呼出要覆盖当前界面的控件时,先把要覆盖的数据保存到新建的buffer里面,再覆盖,当当前控件回收时再从buffer中把数据读回。如图:(字丑不要嫌弃)
     
     问题 2:当有呼出一些控件时(如键盘),在去按其他被键盘覆盖的控件时,又会把键盘覆盖。(这个不符合逻辑,按理说按键应该时最高层的,谁都无法覆盖它。)
                 问题的本身是所有的控件不知道谁把谁覆盖了,各个的显示层次是怎么样的。
     解决 :当创建,或呼出一个新的控件时,把自己进行采样成一个个点,会遍历控件树(上一篇稍微提过,我是用树来实现相应关系的)去一个个比对是否采样点在控件范围中,若是则把控件标记为被覆盖,设置覆盖其的对象是新的控件。这样当被覆盖的控件被点按时,上面的控件也会被刷新,保证一直被覆盖。如图:(这个会一点出现闪屏,但是是我目前不大改代码下最好的方法了。)
       
     问题 3:一些按钮会出现bug,导致GUI奔溃,卡带。(这个想想就害羞 0 0 ----不完整的就发出来了。)

     这个纯属自己没考虑好,现在已经解决。

注意: 左上角的‘ X ’是我测试用的 不要按得太频繁,会出现脏图像。
       

之后将要实现 1.布局类(可以方便的布局控件,不需要计算绝对坐标)
                    2.重写绘画函数(现在都是使用火哥的函数,为了方便GUI其他板子方便移植)
                    3.完成可移植性
我用Cpp写的所以堆的要求较大,因为是树结构我中间用了递归,所以栈的要求也不小。

第三篇

最近去投简历了,就没有太多的进展(添加了布局类),这次我就大概记录自己做这个GUI的思路吧。
1.
在第一篇的时候我简单的讲过我这个是基于 孩子兄弟二叉树 的映像表达。
如图:(二叉树中,左边的为孩子,右边的为兄弟)
 
有什么好处呢?当时觉得比较容易管理,而且思路清晰。
如图:这样一个根节点会有两个孩子窗口(WinA,WinB),然后窗口中又有孩子控件(a,b1,b2),WinA和WinB是兄弟关系,b1和b2也是兄弟关系,查找起来就很方便。
 
因为我选择的是二叉树,所以当要重绘全部的时候,只要用树的先序遍历就能把所有的窗口控件全部都画出来。如果我想要注销某一个窗口或控件,通过把他们从树中分离,其他连带的孩子也会背分离,同样的添加也很方便。
如图:(便于遍历,删除,添加,这是我的主要目的)
 
上面讲的是GUI的结构存储情况。
下面的GUI控件中的消息机制,我有点参考MiniGUI(其实也没怎么研究MiniGUI >_< 大神们莫见怪)

2.
TGUI的所有控件的交互都是基于消息机制的。
怎么说呢,就是每一个线程会维护一个消息队列。(我这里用的是freeRTOS 线程自带的队列--原理一样)
然后每个控件/窗口都会有 窗口过程函数 (这需要我们自己实现),用来实现触发该控件/窗口时应该做的处理过程。
如图:描述了一个 创建控件/窗口 注册 重绘 循环接收信息处理 的全过程。(当然也可以自己动态创建,这个是后话了 其实原理差不多)
 

3.
这一次我多添加了布局类(以后添加控件,布局控件比较方便吧)参考于Java的布局类。我主要实现了 
流式布局(flowLayout):一个一个控件按顺序排列,一行排列不下就换行接着排列,到时只需用addWin函数添加控件就好
 
边框布局(borderLayout):把指定的区域分成东、西、南、北、中五个区域存放控件
 
网格布局(gridLayout):这个顾名思义就把窗口划分为大小一样的网格,用控件进行排列(都继承一个layout基类,用的方法都差不多。)
 

还有可移植性还是没想好,画图的函数还没做。主要就是画图函数和后面的LCD驱动各有不同,还在想中。
最后还是贴上我的资源:
GitHub:https://github.com/909452726/TGUI
百度网盘:http://pan.baidu.com/s/1pLyZH0n
 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

自制嵌入式GUI 【前1-3篇】-基于freeRTOS 的相关文章

  • FreeRTOS_中断

    传送门 博客汇总帖 传送门 Cortex M3 中断 异常 传送门 Cortex M3笔记 基础 笔记内容参考 正点原子的FreeRTOS开发手册 cortex m3权威指南 Cortex M3和Cortex M4权威指南等 文中stm32
  • LittlevGL在PC端运行

    上面是我的微信和QQ群 欢迎新朋友的加入 参考官网指导 https github com littlevgl pc simulator sdl visual studio 获取到vs的工程 打开解决方案 编译运行 在源码目录下 打开main
  • Qt Creator 5.9.9下载与安装图解详细教程

    Qt Creator 5 9 9下载与安装图解详细教程 一 Qt Creator 下载 推荐最新版5 9 9 网上可能推荐4 x x 但实际上不是做专业UI项目的话Qt Creator版本越新越好 其一 安装包给你集合到一个 exe里面 不
  • FreeRTOS临界段和开关中断

    http blog sina com cn s blog 98ee3a930102wg5u html 本章教程为大家讲解两个重要的概念 FreeRTOS的临界段和开关中断 本章教程配套的例子含Cortex M3内核的STM32F103和Co
  • FreeRTOS基础五:软件定时器

    软件定时器简介 软件定时器的作用 在指定的时间到来时执行指定的函数 或者以某个频率周期性地执行某个函数 被执行的函数叫做软件定时器回调函数 软件定时器由FreeRTOS内核实现 不需要硬件支持 软件定时器只有在软件定时器回调函数被调用时才需
  • 啊哈C的简单使用

    打开啊哈C 新建一个程序输出hello world include
  • FreeRTOS学习笔记(8)---- 软件定时器

    使用FreeRTOS软件定时器需要在文件FreeRTOSConfig h先做如下配置 1 configUSE TIMERS 使能软件定时器 2 configTIMER TASK PRIORITY 定时器任务优先级 3 configTIMER
  • FreeRTOS学习---“定时器”篇

    总目录 FreeRTOS学习 任务 篇 FreeRTOS学习 消息队列 篇 FreeRTOS学习 信号量 篇 FreeRTOS学习 事件组 篇 FreeRTOS学习 定时器 篇 FreeRTOS提供了一种软件定时器 用来快速实现一些周期性的
  • 【FreeRTOS 事件】任务通知事件

    普通任务通知事件创建创建及运行 参阅安富莱电子demo define BIT 0 1 lt lt 0 define BIT 1 1 lt lt 1 static TaskHandle t xHandleTaskUserIF NULL sta
  • flutter之BottomNavigationBar

    1 BottomNavigationBar BottomNavigationBar即是底部导航栏控件 显示在页面底部的设计控件 用于在试图切换 底部导航栏包含多个标签 图标或者两者搭配的形式 简而言之提供了顶级视图之间的快速导航 2 构造函
  • freeRTOS出现任务卡死的情况。

    最近在做一个产品二代升级的项目 代码是上一任工程师留下的 很多BUG 而且融合了HAL库和LL库 以及github上下载的GSM源码 很不好用 我这边是将2G模块换成了4G 且添加了单独的BLE模块 因此只在源码的基础上 去除2G和BLE代
  • 单片机通信数据延迟问题排查

    1 问题说明 笔者在最近的项目中 发现系统的响应延迟较高 经过排查 排除了单片机运行卡死的问题 2 原因分析 具体排查过程这里就不细致说明了 直接给出排查后原因 任务执行周期规划不合理 导致freertos队列发送接收到的命令有延迟 为了便
  • YOLOv8目标检测PySide6 GUI可视化界面

    课程链接 https edu csdn net course detail 38552 YOLOv8目标检测PySide6 GUI可视化界面效果图如下 YOLOv8目标检测PySide6 GUI可视化界面支持本地图片和视频推理 摄像头实时视
  • FreeRTOS实时操作系统(三)任务挂起与恢复

    系列文章 FreeRTOS实时操作系统 一 RTOS的基本概念 FreeRTOS实时操作系统 二 任务创建与任务删除 HAL库 FreeRTOS实时操作系统 三 任务挂起与恢复 FreeRTOS实时操作系统 四 中断任务管理 FreeRTO
  • FreeRTOS之系统配置

    1 FreeRTOS的系统配置文件为FreeRTOSConfig h 在此配置文件中可以完成FreeRTOS的裁剪和配置 在官方的demo中 每个工程都有一个该文件 2 先说一下 INCLUDE 开始的宏 使用 INCLUDE 开头的宏用来
  • VSCode『SSH』连接服务器『GUI界面』传输

    前言 最近需要使用实验室的服务器训练带有 GUI 画面的 AI 算法模型 pygame 但是我是使用 SSH 连接的 不能很好的显示模型训练的效果画面 所以下面将会讲解如何实现 SSH 连接传输 Linux GUI 画面的 注 我们没有采用
  • FreeRTOS 配置TICK_RATE_HZ

    我使用的是带有 5 4 版 FreeRTOS 的 MSP430f5438 我有一个有趣的问题 我无法弄清楚 基本上 当我将 configTICK RATE HZ 设置为不同的值时 LED 闪烁得更快或更慢 它应该保持相同的速率 我将 con
  • 使用 Tkinter 进行 Python GUI 编程

    目录 Building Your First Python GUI Application With Tkinter 添加小部件 检查你的理解情况 Working With Widgets 使用标签小部件显示文本和图像 使用按钮小部件显示可
  • 当一个任务写入变量而其他任务读取该变量时,我们是否需要信号量?

    我正在研究 freeRtos 并且我有一个名为 x 的变量 现在 每秒只有一个任务正在写入该变量 而其他任务正在读取该变量值 我需要用互斥锁来保护变量吗 如果变量为 32 位或更小 并且其值是独立的并且不与任何其他变量一起解释 则不需要互斥
  • C++ freeRTOS任务,非静态成员函数的无效使用

    哪里有问题 void MyClass task void pvParameter while 1 this gt update void MyClass startTask xTaskCreate this gt task Task 204

随机推荐

  • 自动类型转换

    xff08 一 xff09 自动类型转换 在java 程序中 xff0c 不同的基本类型的值经常需要进行相互类型转换 xff0c 类型转换分为自动类型转换和强制类型转换 布尔类型boolean占有一个字节 xff0c 由于其本身所代码的特殊
  • Eclipse中设置Tomcat服务器

    01首先打开eclipse软件 xff0c 点击顶部的windows菜单 xff0c 选择下拉菜单中的preferences选项 xff0c 如下图所示 02在弹出的Preference界面中选择Server 找到左侧的Runtime En
  • games系列学习 -- Möller Trumbore 算法

    M ller Trumbore 算法 是三角形与射线 光线 之间判定是否相交的快速算法 利用了重心坐标来表示三角形 首先假设射线的方程 xff1a O为发射点 D为方向向量 再假设三角形平面方程 xff1a b1 b2 1 b1 b2 分别
  • 使用手机摄像头实现视频监控实时播放

    使用手机摄像头实现视频监控实时播放 一 概述 视频监控实时播放的原理与目前较为流行的直播是一致的 xff0c 所以采用直播的架构实现视频监控实时播放 xff0c 流程图如下 xff1a
  • 滑模观测器

    什么是滑模观测器 1 滑模观测器是一类动态系统 2 滑模观测器是指根据系统的外部变量 输入变量和输出变量 的实测值得出状态变量估计值的一类动态系统 xff0c 也称为状态重构器 3 作用 xff1a xff08 1 xff09 滑模观测器不
  • ROS入门_1.18 接下来做什么?

    此时你应该已经对ROS中的一些核心概念有了一定的理解 给你一台运行ROS的机器人 xff0c 你应该能够运用所学知识来列出机器人上发布和订阅的各种话题 xff08 topic xff09 xff0c 查看话题中发布的消息 xff0c 然后编
  • 【git】看懂git diff

    git diff 可以用来比较 xff1a 1 staging area和working area的文件 xff08 无其他参数时 xff09 plain view plain copy print git diff 2 master分支和
  • makefile 自动编译同一个目录下的所有文件

    SOURCE 61 wildcard c OBJS 61 patsubst c o SOURCE CROSS COMPILE 61 arm linux CXX 61 gcc CFLAGS 43 61 static CLFAGS 43 61
  • PX4_Bootloader单步调试配置(STM32F7 配置)

    Bootloader Makefile 编译选项 Os g 43 O0 43 ggdb3 Bootloader libopencm3 lib stm32 f7 Makefile TGT CFLAGS 61 Os g 43 TGT CFLAG
  • 2021北邮自考c++实践题及答案

    北邮c 43 43 实践考期 xff0c 只能在每年的下半年进行报名 xff0c 11月进行考试 由于疫情原因 xff0c 现在均为线上考试 xff0c 每人的考题不同 xff0c 但是大同小异 xff0c 此为2021年的c 43 43
  • 从idea推送代码到github,到jenkins部署,再到从github下载代码完成构建的全部详细操作流程

    目录 1 idea推送代码到github 1 1 github创建 1 2 git下载与安装 xff08 windows xff09 1 3 idea关联github 1 3 1 windows生成公私钥 1 3 2 idea关联githu
  • Jmeter常用场景梳理

    一 在一段时间内持续发送请求 此场景可以用于稳定性测试 xff0c 在稳定性测试中 xff0c 通常需要持续压测几个小时甚至几天时间 xff0c 查看接口是否有报错 xff0c 或者cpu 内存会上涨 xff0c 此时就需要通过控制持续时间
  • vnc viewer连不上,vnc viewer连不上是什么原因?解决方法

    vnc viewer连不上是什么原因 接下来尝试在CentOS上安装一个VNC Server CentOS5 已经自带了VNC xff0c 默认也已经安装了 xff0c 只要配置一下就可以了 如果没有安装 xff0c 可以 yum inst
  • 基于netty框架的JTT808/JTT905/JTT1078协议客户端

    基于netty框架的JTT808 JTT905 JTT1078协议客户端 JTT808客户端网络处理 span class token keyword private span span class token keyword void s
  • The BMJ研究:现有的新冠病毒诊断AI模型,几乎毫无用处

    图片出处 xff1a unsplash 本文作者 xff1a 朱演瑞 新型冠状病毒对全球健康造成了严重的威胁 xff0c 为了减轻医疗保健系统的负担 xff0c 也给患者提供最佳的护理 xff0c 高效的诊断和疾病预后信息问题亟待解决 理论
  • 自动驾驶多传感器融合

    12月28日 xff0c 百度Apollo平台携手国内激光雷达公司禾赛科技扔下一颗名为Pandora的重磅炸弹 xff0c 此举将极大地加快无人驾驶落地的进程 xff0c 却也会让不少自动驾驶初创公司陷入无比尴尬的境地 简单地说 xff0c
  • YMFC-32 小四轴 (一)

    https github com jamesshao8 ymfc mini drone 本博客前几天送出了几个v1 0版本的ymfc小四轴 在这里我要说一下组装教程和使用方法 原材料采购 除了我的板子以外还需要一些零件 1 间距0 254的
  • HackRF 代码讲解 (一)

    本文包括驱动 固件 CPLD代码讲解 xff08 也包括gr osmosdr中的相关部分 xff09 HackRF是比较早期的一款SDR设备 xff0c 凭借其相对低廉的价格加上半双工收发能力 xff0c 在国内的SDR市场中占比很高 这款
  • STM32 GPS悬停飞控 (十)气压计

    上次的飞机有干扰问题 没法解决 可能因为我的元器件有问题 或者走线问题 本来打算按老外的一模一样做一个的 但现在想直接做带GPS的了 因为除GPS 罗盘 气压 数传外基本和上次那个一样的 这些部分即使装上也可以禁用 只剩摇控不一样了 暂时忽
  • 自制嵌入式GUI 【前1-3篇】-基于freeRTOS

    自制GUI第4篇 xff1a https blog csdn net shungry article details 78659613 自制GUI第5篇 xff1a https blog csdn net shungry article d