
正点原子 IMX6ULL
学习网站
http://www.openedv.com/docs/boards/arm-linux/zdyz-i.mx6ull.html

安装虚拟机可以参考文档【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.81。
2025.1.11 虚拟姬如何分配核心数?
我这里就直接参考的一位博主的方法,他通过不同分配方法对比,得出结论如下:


所以,我这里是8核16线程,应该分成1处理器 8核,看懂的话,这里的8核实际上是指的8线程,1*8刚好是8线程。综合我其他看的视频里,这种方法应该是可行的。这里我只分配了一半 ,保证正常运行。
2025.1.19 记录ubuntu网络配置问题
这是我在进行尝试虚拟机桥接模式遇到的问题
虚拟机桥接不上网卡,提示没有未桥接的主机网络适配器,windows下面没有相关网卡(vmnet0)
尝试这位大佬给的方法 记录一下~
https://blog.csdn.net/qq_57704873/article/details/134765089
按住键盘win+r打开window运行对话框输入services.msc

打开计算机—属性—设备管理器,找到网络适配器一项,看到里面所有VM开头的虚拟机网卡,全部右击卸载

win+r打开window运行对话框输入regedit,打开注册表编辑器,按照下图所示路径,右击VMware Tray删除


卸载VMware 卸载后下载ccleaner工具


现在没出现什么问题,最后也是重新安装成功解决

这里我是参考这篇文章来进行桥接模式的连接的
https://blog.csdn.net/wmjdiidjjisjb/article/details/144587016
这里遇见了一个问题,当我把我家路由器DHCP服务关闭后,出现了一直连接不上网络的情况?不过在我开启后连接上了。
这里介绍一下怎么安全上网,这里不过多解释。
https://blog.csdn.net/qq_39692305/article/details/142094441
2025.2.26 校园网链接问题
关于校园网链接,无线连接暂时失败,由于无法登录认证界面,目前还未找到原因。采用有线连接方式,使用桥接模式发现不能够本机与虚拟机共同使用校园网,大概率是由于桥接模式是共用一张网卡,虚拟机会占用本机的使用,于是换了net模式,发现成功连接上校园网。感谢这两位大佬的教程。我分享一下我的步骤,避免再次出现这种问题。
首先找到VMnet8虚拟网卡和本机网卡,然后选择本机网卡,在共享中打开家庭网络连接

然后在虚拟网卡中查看ip地址,然后回到VMWARE中,手动更改地址


重启一下,即可。
https://blog.csdn.net/weixin_50570038/article/details/143238268
https://zhuanlan.zhihu.com/p/580910152
2025.2.26 总结一下如何使用ubuntu代理
首先需要在clash代理软件中打开局域网

查看ipconfig中的虚拟网卡地址,然后在虚拟机中打开代理设置填入即可。
2025.1.11 关于vmware tool 的作用
这里我在网上浅浅的搜了一下,这是一个用于方便主机与虚拟机之间进行复制粘贴的软件,建议安装
安装教程:https://blog.csdn.net/qq_28938301/article/details/135454210
2025.1.11 怎么用vi编辑器和gcc 运行一个c文件?
首先打开命令行输入 vi hello.h,进入到文件中后,按照c语言的方式写一段打印hello world 的程序如下,具体的如何切换输入模式和退出vim编辑器,记住 :x 是保存退出,按a进入编辑模式。


正常运行是这样的。和其他软件差不多。
2025.1.11 makefile文件
为了方便编译多个文件,我们可以创建一个makefile文件,根据视频代码如下分析:

颜色开头为蓝色的,所指的就是编译这个文件所需要的文件,可以看到其先后顺序是总-分的方式,一步一步告诉计算机执行顺序的,这里是否可以按照分-总的方式呢?还待验证。注意gcc行代码用TAB键空出首行,不这样做可能会报错。最后一行代码清除所有.o文件和main可执行文件,只能在你输入make clean后才会执行,输入make 只会执行前面几行。
这里介绍一下makefile的基本语法,它主要由一系列的规则所组成。

这里再更形象生动的做个比喻,他们关系如下

关于makefile还有许多需要掌握的,如下分点介绍:
1.如何使用变量

使用注释,用的是#,使用变量的方法如2、3行所示。$(变量名)
2.如何使用赋值符

前三行不做解释,5、6行代码的作用是打印curname这一字符。这里注意,打印出的结果是zuozhongkai,可知,我们改变了name的值,curname的值也跟着改变了,这是不是$更像c语言中的指针地址的引用?
但更严谨的讲,这里是赋值号的问题,我们再看如下,假如是这种写法的输出是什么?

此时的输出就是zzk了,这里的:=改变了它不再跟着name一起变化了,是真正意义上的赋值。
还有?=和+=等的赋值操作,可能用的不多,这里就自行上网查阅了。
3.如何处理大量的需要编译的文件
首先我们了解一下这串代码

%.o : %.c 这就是处理大批量文件的关键,关于$<这是一个自动化变量,具体参考如下,复杂不做过多解释。

4.使用make clean注意事项
假如说文件中存在clean文件,要注意添加一行声明如下

为了让计算机知道clean这个是清除指令,而不是生成指令。
5.makefile函数的使用
这里就直接去参考文档吧,太多不好讲(文档名:跟我一起写makefile)
2025.1.12 shell脚本
shell脚本也似乎是学习linux中比较重要的东西,它类似于批处理文件,将想要执行的命令装在一个.sh文件中。
接下来介绍几种交互式类型的脚本


以上两种情况大同小异,可根据具体情况采取不同方式。






条件判断,函数,循环




这里的命令的命名方式还是很有意思,竟然用倒着的单词表示结束,像前面的if fi一样。






裸机开发
2025.1.15 如何进行文件互传
首先要学会怎么使用vim ,i插入 ,:x保存退出
ftp模式
安装ftp服务(具体看IMX6U驱动开发指南)。








NFS模式






SSH服务模式

2025.1.15 安装ch340驱动

2025.1.15 安装secureCRT 类似于串口调试助手
似乎要收费,后面再看看是否要安装,没关系,大家懂的都懂()
里面也有很多种链接方式,包括串口模式

接着重启一下,就能在软件上看到连接成功的结果
2025.1.16 安装Putty 类似于串口调试助手
和secureCRT差不多,具体看IMX6U开发指南。
2025.1.16 交叉编译器安装
关于linux下自带的gcc编译器是针对x86架构,而我们需要编译的是arm架构的代码,所以我们需要一个能够在x86架构的虚拟机上运行,能够编译arm架构的gcc编译器,接下来介绍的就是linaro家的gcc编译器。



输入sudo vi/etc/profile


2025.1.16 vscode
具体看手册,不多讲。
2025.1.16 开发板介绍

其中中间最小系统板上,最左边的那块芯片是emc ,存储大,速度快,这块应该是8g大小,flash?。中间下面那块是ddr,512m字节的ddr。接下来用一张图给大家详细介绍底板上的各种接口和功能。

I.MX6U芯片
此为nxp公司出品芯片,cortex-a7架构 ,soc。开发板的芯片为I.MX6ULL型号
2025.1.17 关于I.MX6U的管脚复用
比stm32系列来说,要更复杂一些,需要去IMX6ULL参考手册中查找(第32章)。
2025.1.17 关于I.MX6U的管脚初始化


qt开发
2025.1.19 什么是qt?
一种c++开发库,主要是用于gui开发
qt官网:https://www.qt.io/
qt5中的新功能,可以看到各种版本的情况:https://doc.qt.io/qt-5/qt-intro.html
qt下载网址:https://download.qt.io/archive/qt/
2025.1.20 安装qt时候遇见的问题
这里使用指令下载qt似乎不行,遇见无权限下载的问题。我就直接下载包互传了。
在qt中文输入法使用时候,似乎没有办法使用IBUS ,经过思索后发现是没有升级ibus,升级之后成功。
2025.1.20 c++基础科普
关于构造函数,我们要理解它一般是类名(),析构函数是~类名(),在实例化类之前会执行一次构造函数,然后在对象生命周期 全部执行完成后才会执行析构函数。构造函数能够简化我们的初始化步骤,让我们编写的代码更简洁。每当我们实例化之前,他都会执行一次。 析构函数就是销毁掉构造函数,字面意思。
在成员函数中,我们可以使用this指针来调用类里面的其他成员
函数重载,在同一个作用域内,可以声明几个功能类似的同名函数,但是这些同名函数的形式参数(指参数的个数、类型或者顺序)必须不同。相当于我们可以有多个同样类名版本的函数,但是函数的参数不同,导致我们的初始化也不同,但是我们能够区分它们。
关于运算符重载,有点难懂,不过也不是重点,了解就行
虚函数,就是我们继承之后,能够调用新的继承类里面的对象,我们通常在复写的函数的后面添加override来区别,提高可读性。
2025.1.23 QT程序编写
关于新建项目需要注意的点是,我们一开始初学就选择Application(Qt)作为我们初学的一个项目样本(模板),注意qt中文兼容性很差(这里的Qt版本为5.12.9),我们尽量命名和路径都使用英文,这也是我们学习外国软件的时候应该注意的点。
接下来选择qmake作为编译器。再接着就是选择基类,这里选择QMainWindow来进行学习。以下是文档给出的三种基类的介绍,方便大家进行学习参考:
- QMainWindow:主窗口类,主窗口具有主菜单栏、工具栏和状态栏。类似于一般的应用程序的主窗口。如果您想做个嵌套的窗口程序开发的软件,不妨选择这个 QMainWindow。
- QWidget:是可视界面类的基类,也就是说QMainWindow类也是由QWidget 继承封装而来。所以 QWidget 要比 QMainWindow 功能少一些。
- QDialog:对话框类,建立一个对话框界面。比较少使用此项作为基类。一般以 QMainWindow和 QWidget 作为基类的居多。注因为 QWidget 不带窗口标题栏等,嵌入式里最好 QWidget。
关于其他设置,默认或自行搜索判断。

主要是学习怎么初始化变量,使用构造函数和析构函数。
qt的文件类型
有.pro文件,.h文件,.cpp文件,.ui文件,header文件夹下是头文件,sources文件夹下是源文件,forms文件夹下是ui见面文件。这里的.pro有点像系统文件,告诉计算机要用哪些文件,以及在什么样的条件和环境下。(这里说的可能不准确,只是笼统的举例,更形象的表达方法告诉这个文件是什么)
以下是pro文件里面的部分分析




2025.1.26 qt程序启动流程
这里先科普一下关于c++的成员列表初始化,在第36期介绍




qt creater的使用方式

qt编程规范

qt信号槽



这里的槽其实就是函数啦~信号也是。






其他就省略了,不重要不讲,可以去看视频,太详细了反而啰嗦。
2025.1.28 隐示转换
编译的时候会把你的参数自动转换的意思。类似我图下这个例子。

2025.1.28 如何自定义一个信号槽
首先要创建信号和槽的.c和.h文件,知道他们所继承的类,他们继承的是qobject类

这里的explicit就是我前面提到的防止隐示转换的方法。


这里多嘴一句,mainwindow是构造函数。



更多详细的可见 qt开发指南文档88页左右。
2025.1.29 为什么要设置父对象和其设置的两种方法


对象树机制,qt中我们可以利用这一机制来自动删除掉我们用new新建的对象,这个机制的具体内容就是我们在父类delete之前(不知道怎么讲),会先把子类先delete掉。代码如下:

2025.1.29 如何添加图片文件和样式表
就是选择qt resource项目,具体看手册。样式表是在ui界面,我也不多讲了。
这里多嘴一句px是像素的意思,pt是字体大小的意思
2025.1.31 qss文件
简单来说,我们可以在qss文件中写我们想要的样式,然后直接读取文件就行

2025.1.31 qwidget类
它是所有用户界面对象的基类
2025.1.31 简单的qt工程推荐
音乐播放器 28讲源码

2025.1.31 关于如何查找样式表的参数
可以在帮助文档中找stysheet
2025.1.31 关于控件边缘位置的改变方式

关于颜色可以查rgb表来参考。
2025.1.31 关于各种样式调整
margin&padding(外边距和内边距)调整单个控件
QHBoxLayout(水平、垂直布局)具体就是调整多个空间的布局,大小
QVBoxLayout(垂直布局)类似上面垂直布局
QGridLayout(网格布局)类似上面垂直布局
QSpitter(分裂器)可以改变两个链接窗口之间的大小,类似于wps的文档
QSpacer(隔离弹簧)我理解是调整控件位置用的,弹簧本身是隐藏的
2025.2.1 仿qq登录界面
使用LineEdit,按钮,布局之后,我们再改变lineedit控件的样式。


然后,我们添加Qwidget改变其背景颜色,拟成我们的下划线


改变placeholdertext和echomode,可以显示提示字和隐藏我们输入的密码,如图

可以通过隔离弹簧来控制其位置

2025.2.2 仿照支付界面
用了Qdialog 作对话框
说实话,很多感觉用不上,我就没写多详细。。。。



2025.2.2 制作滑动窗口
用的是QScrollArea控件

2025.2.6 Qtabwidget效果

还可以配合listwidget进行使用



接下来介绍一下QlistWidget的详细使用


20252.6 Qlistwidget的qq好友列表界面设计

2025.2.6 文本读写(Qfile)
略,可以去看代码,比较简单。
2025.2.6 关于如何提取我们喜欢的颜色rgb值
我们可以使用ps的提色器,就不用再去查表了,很方便。
2025.2.6 关于 qpainter qgraphics qproperty
qpainter 用于绘图形、轮播文字
qgraphics 用于图表
qpropertyanimation 用于属性动画
Q_Property 一个宏定义属性系统
qthread 多线程
2025.2.13 关于qt设计服务端与客户端
参考52~54讲
2025.2.13 关于使用udp协议

关于单播和广播的区别
| 特性 | 单播 | 广播 |
|---|---|---|
| 通信方式 | 一对一 | 一对多 |
| 目标地址 | 特定IP地址 | 广播地址(如255.255.255.255) |
| 网络资源使用 | 仅发送方和接收方之间 | 所有设备都会接收 |
| 应用场景 | 客户端-服务器通信 | 网络发现、服务公告 |
2025.2.15 使用交叉编译器
使用代码先给权限
chmod u+x fsl-imx-x11-glibc-x86_64-meta-toolchain-qt5-cortexa7hf-neon-toolchain-4.1.15-2.1.0_20241230.sh


qmake生成编译文件makefile
qmake x.pro
qmake删除编译文件
make distclean
开始在项目文件夹编译项目
make -j
//删除用make clean

使用MobaXterm链接开发板,开发板选择emmc启动方式,如图,首先给我们编译文件权限,执行文件,杀死我们的开发板的初始界面

我们也可以使用如图打开rc.local文件。

将图中的QDesktop注释
关于拷贝文件可以参考06【正点原子】I.MX6U开发板文件拷贝及固件更新参考手册V1.2
可以使用如图指令快速拷贝
scp -r 文件夹 用户名@ip 地址:路径

我们也可以修改路径开机就能运行程序
2025.2.16 学习qt的类和函数
AppMainView::AppMainView(QWidget *parent)
{
this->setParent(parent);
this->setGeometry(0, 0, 800, 480);
this->setMinimumSize(800, 480);
bgWidget = new QWidget(this);
bgWidget->setStyleSheet("border-image: url(:/images/bg.png)");
mySlidePage = new SlidePage(this);
mySlidePage->resize(this->size());
for (int i = 0; i < 3; i++) {
appDemo[i] = new AppDemo();
mySlidePage->addPage(appDemo[i]);
}
}
this->setParent(parent)
this是当前AppMainView对象。- 调用
setParent()函数,将当前对象的父对象设置为传入的parent参数(一个QWidget*类型的指针)。
this->setGeometry(0, 0, 800, 480)
this是当前AppMainView对象。- 调用
setGeometry()函数,设置当前对象的位置和大小(左上角坐标为(0, 0),宽度为800,高度为480)。
this->setMinimumSize(800, 480)
this是当前AppMainView对象。- 调用
setMinimumSize()函数,设置当前对象的最小大小为800x480。
bgWidget = new QWidget(this)
this是当前AppMainView对象。- 创建一个新的
QWidget对象bgWidget,并将其父对象设置为当前AppMainView对象(即this)。
mySlidePage = new SlidePage(this)
this是当前AppMainView对象。- 创建一个新的
SlidePage对象mySlidePage,并将其父对象设置为当前AppMainView对象(即this)。
mySlidePage->resize(this->size())
this是当前AppMainView对象。- 调用
this->size()获取当前对象的大小,并将mySlidePage的大小设置为与当前对象相同。
上面的部分代码是设置界面的大小,并且根据appdemo和slidepage两个qt文件嵌套实现的。详细见qt03_appmainview.
void AppMainView::resizeEvent(QResizeEvent *event)
{
Q_UNUSED(event)
mySlidePage->resize(this->size());
bgWidget->resize(this->size());
}
resizeEvent的触发时机- 当用户手动调整窗口大小,或者通过代码调用
resize()函数改变窗口大小时,resizeEvent会被触发。
- 当用户手动调整窗口大小,或者通过代码调用
this->size()this指向当前AppMainView对象。size()是QWidget的成员函数,返回当前窗口的大小(QSize类型,包含宽度和高度)。
mySlidePage->resize(this->size())mySlidePage是一个SlidePage对象,可能是AppMainView中的一个子部件。- 通过
resize()函数,将mySlidePage的大小调整为与当前窗口相同。
bgWidget->resize(this->size())bgWidget是一个QWidget对象,可能是AppMainView中的背景部件。- 通过
resize()函数,将bgWidget的大小调整为与当前窗口相同。
QT setAlignment()和setContentsMargins()函数
https://blog.csdn.net/m0_63893772/article/details/135122753
void setSpacing(int spacing)
https://blog.csdn.net/xie__jin__cheng/article/details/143862085
rgb颜色对照
http://color.liminba.com/c/aaaaaa/
安装虚拟机(按照虚 拟机参考手册V1.3)

虚拟机和主机之间桥接模式配置成功

fliezilla软件

建立Ubuntu系统和Windows11之间的连接,可加载 Ubuntu 和 Windows 的目录,可以实现文件互传。(可行)

win+R中输入虚拟机地址(好像不行,输入用户名后错误)

如果连接成功会出现一个虚拟机的 IP 地址的网络

看到p31页
成功编译uboot 内核 qt

p35
VMWare 网络模式介绍
桥接模式

网络拓扑结构:
- 定义:指用传输介质互连各种设备的物理布局。
- 示例设备:电脑网卡、网线、虚拟机网卡、WIFI、USB网卡、无线网卡、嵌入式设备网卡等。
网段与IP地址:
- IP地址作用:TCP/IP协议通信时,用于标识主机或路由器。
- IP地址形式:IPv4中,IP地址是一个32位的整数,分为4×8位(如192.168.1.1)。
- IP地址结构:IP地址 = 网络号 + 主机号。
- 获取方式:自动获取(DHCP,路由器分配)或手动设置(静态IP)。
网段:同一网段指的是 IP 地址和子网掩码相与得到相同的网络地址。
网络标识 = IP 地址 AND 子网掩码
防火墙:
- 定义:通过有机结合各类用于安全管理与筛选的软件和硬件设备,帮助计算机网络于其内、外网之间构建一道相对隔绝的保护屏障,以保护用户资料与信息安全性的一种技术。
- 示例:Windows防火墙、局域网络内部防火墙、杀毒软件(如火绒)的拦截功能。
- ubuntu 执行 sudo ufw disable 关闭防火墙
网络测试
ping 是一种网络诊断工具,格式为 ping IP 地址
搭建方式

2025.1.8 问题 如何给磁盘分区
以u盘分区为例子
用fdisk命令完成,在命令行中输入fdisk -l 列出分区。

这里的/dev/sdb就是u盘,我们对其进行格式化等操作
输入sudo fdisk /dev/sdb,此时会弹出输入m进行帮助,接着输入m。
我们这里需要使用的是


首先用d命令,删除掉分区,接着w命令进行保存。这里如果提醒设备忙,就先输入umount /u盘挂载位置进行删除挂载,然后重复操作。
输入sudo fdisk /dev/sdb(具体根据自行判断),输入n命令,输入p命令

接着输入2048默认即可,我们如何分配1g内存呢,首先1g=1024mb=1024*1024kb=1024*1024*1024b,那么经过换算后就是1073741824字节。这里我们要理解一个扇区的大小为512字节,所以除以之后就是2097152个扇区。这里我们默认是2048开始,所以还要加上2048,也就是2099200。

default可以直接拿来做下一个分区的开始,依次重复上面的操作即可。
2025.3.28 windows qt编译
注意,需要使用qt自带的命令行工具输入以下指令进行编译,在win自带的命令行中编译会报错。
使用指令
qmake -project //生成pro文件
qmake//生成makefile文件
mingw32-make//生成可执行文件
注意在qmake生成之前 需要在pro文件中添加以下依赖





程序图示代码
#include <QApplication>
#include <QLabel>
#include <QLineEdit>
#include <QpushButton>
#include <QHBoxLayout> //水平布局
#include <QVBoxLayout> //垂直布局
#include <QWidget>
int main(int argc,char *argv[])
{
QApplication app(argc,argv);
QLabel *infoLabel = new QLabel;
QLabel *openLabel = new QLabel;
QLineEdit *cmdLineEdit = new QLineEdit;
QPushButton *commitButton = new QPushButton;
QPushButton *cancelButton = new QPushButton;
QPushButton *browseButton = new QPushButton;
infoLabel->setText("input cmd:");
openLabel->setText("open");
commitButton->setText("commit");
cancelButton->setText("cancel");
browseButton->setText("browse");
QHBoxLayout *cmdLayout = new QHBoxLayout; //水平布局对象
cmdLayout->addWidget(openLabel);
cmdLayout->addWidget(cmdLineEdit);
QHBoxLayout *buttonLayout = new QHBoxLayout;
buttonLayout->addWidget(commitButton);
buttonLayout->addWidget(cancelButton);
buttonLayout->addWidget(browseButton);
QVBoxLayout *mainLayout = new QVBoxLayout;
mainLayout->addWidget(infoLabel);
mainLayout->addLayout(cmdLayout);
mainLayout->addLayout(buttonLayout);
QWidget w;
w.setLayout(mainLayout);
w.show();
w.setWindowTitle("running");
return app.exec();
}
2025.4.1 使用qt的process打开windows文件


使用QmassageBox的效果
会弹出一个对话框

2025.4.3 理解Qwidget的初始化类继承问题
【QT】如何理解Widget::Widget(QWidget *parent) :QWidget(parent)