LCD应用层编程
接下来学一些linux的应用层编程的内容,重点学习一下LCD,Socket,音频等反面的内容。
之前学习应用编程没有进入提高阶段最近捡一下,已经把TCP/IP的一部分知识补充了。
FrameBuffer在LCD驱动章节说过Framebuffer就是帧缓冲,意味着Framebuffer就是一块内存,里面保存着一帧图像。帧缓冲(framebuffer)是 Linux 系统中的一种显示驱动接口,它将显示设备(譬如 LCD) 进行抽象、 屏蔽了不同显示设备硬件的实现,对应用层抽象为一块显示内存(显存),它允许上层应用程序直接对显示缓冲区进行读写操作 。
LCD是没有显存的,存储在DDR上的一段空间内,显存大小=分辨率x色彩精度/8。
使用ioctl函数进行获取信息当打开 LCD 设备文件之后,需要先获取到 LCD 屏幕的参数信息,譬如 LCD 的 X 轴分辨率、 Y 轴分辨率以及像素格式等信息,通过这些参数计算出 LCD 显示缓冲区的大小。
一般获取FBIOGET_VSCREENINFO(表示获取 FrameBuffer 设备的可变参数信息 )、FBIOPUT_ ...
嵌入式软件安装合集
吐槽一下自己,悲催了呀,安装个pycharm引发了一系列惨案,在最新的pycharm的版本上对于16版本的python3.5不支持,卸载之后终端挂了,apt-get install挂了,重新弄一个系统吧,顺便记录一下,嵌入式的软件安装。
Ubuntu和Windows之间的复制粘贴1234sudo apt-get autoremove open-vm-toolssudo apt-get install open-vm-toolssudo apt-get install open-vm-tools-desktopreboot
安装编程工具make工具安装1sudo apt-get install make
vscode工具安装官网下载安装包https://code.visualstudio.com/
https://vscode.cdn.azure.cn/stable/e7e037083ff4455cf320e344325dacb480062c3c/code_1.83.0-1696350811_amd64.deb
1sudo dpkg -i code_1.83.0-1696350811 ...
嵌入式上的C语言
这篇文章其实更适合在裸机开发操作寄存器之前来学习。
内存为什么需要内存?程序= 代码 + 数据
程序运行的目的要么重在数据结果(有返回值),要么重在过程(无返回值),要么即重于结果又重过程。
计算机程序的运行过程,其实就是程序中很多个函数相继运行的过程。程序是由很多个函数组成的,程序的本质就是函数,函数的本质就是加工数据的动作。
哈佛结构:将程序的代码和数据分开存放的一种结构,但是存放的位置可以是相同的也可以是不同的(ROM&RAM或RAM),总之只要是分成两个部分单独访问的结构都是哈佛结构。
哈佛结构的特点就是代码和数据单独存放,使之不会互相干扰,进而当程序出 BUG 时,最多只会修改数据的值(因为代码部分是只读的,不可改写),而不会修改程序的执行顺序。因此,这种结构大量应用在嵌入式编程 。
冯诺依曼结构:将代码和数据统一放在RAM(随机存取存储器)中,数据和代码之间一般是按照程序的执行顺序依次存储。
这样就会导致一个问题,如果程序出 BUG,由于程序没有对代码段的读写限定,因此,它将拥有和数据一样的读写操作权限。于是就会很容易的死机,一旦代码执行出现一点改变就会 ...
上位机控制激光器
这个工程是假期前完成的,延期更新了。
激光器的IO
所以说需要使用的是PWM,GPIO控制IO口,adc这三个知识点。
首先是要给设备加上pwm的驱动和adc的驱动。
pwm驱动首先是imx6ull有8路PWM输出,对应这8个PWM的控制器,在设备树下有相对应的8个控制器节点。
查看手册可以看到:
• 16-bit up-counter with clock source selection• 4 x 16 FIFO to minimize interrupt overhead• 12-bit prescaler for division of clock• Sound and melody generation• Active high or active low configured output• Can be programmed to be active in low-power mode• Can be programmed to be active in debug mode• Interrupts at compare and rollover
使用GPIO1_ ...
Qt控制gpio(sysfs控制gpio)
使用sysfs方式控制gpiosysfs文件系统sysfs 是一个基于内存的文件系统, 同 devfs、 proc 文件系统一样,称为虚拟文件系统; 它的作用是将内核信息以文件的方式提供给应用层使用。 sysfs 文件系统的主要功能便是对系统设备进行管理,它可以产生一个包含所有系统硬件层次的视图。sysfs 文件系统把连接在系统上的设备和总线组织成为一个分级的文件、 展示设备驱动模型中各组件的层次关系。 sysfs 提供了一种机制,可以显式的描述内核对象、对象属性及对象间关系, 用来导出内核对象(kernel object,譬如一个硬件设备)的数据、属性到用户空间,以文件目录结构的形式为用户空间提供对这些数据、属性的访问支持。
sysfs 文件系统中的目录,包括 block、 bus、 class、 dev、 devices、firmware、 fs、kernel、modules、 power 等,每个目录下又有许多文件或子目录 。
/sys 下的子目录
说明
/sys/devices
这是系统中所有设备存放的目录,也就是系统中所有设备在sy ...
Qt控制LED
Qt控制LED自己搭建的根文件系统,要确保加载了LED的驱动,以及系统的设备树也是支持LED的。
主要关注便是 brightness、 max_brightness 以及 trigger 三个文件,这三个文件都是 LED 设备的属性文件:⚫ brightness: 翻译过来就是亮度的意思, 该属性文件可读可写; 所以这个属性文件是用于设置 LED的亮度等级或者获取当前 LED 的亮度等级,譬如 brightness 等于 0 表示 LED 灭, brightness 为正整数表示 LED 亮,其值越大、 LED 越亮; 对于 PWM 控制的 LED 来说, 这通常是适用的,因为它存在亮度等级的问题,不同的亮度等级对应不同的占空比,自然 LED 的亮度也是不同的; 但对于 GPIO控制(控制 GPIO 输出高低电平)的 LED 来说,通常不存在亮度等级这样的说法,只有 LED 亮(brightness 等于 0)和 LED 灭(brightness 为非 0 值的正整数)两种状态。⚫ max_brightness: 该属性文件只能被读取,不能写,用于获取 LED 设备的最大亮度等级。⚫ ...
Git分支
Git分支在 Git 中提交时,会保存一个提交(commit)对象,该对象包含一个指向暂存内容快照的指针,包含本次提交的作者等相关附属信息,包含零个或多个指向该提交对象的父对象指针:首次提交是没有直接祖先的,普通提交有一个祖先,由两个或多个分支合并产生的提交则有多个祖先。
当使用 git commit 新建一个提交对象前,Git 会先计算每一个子目录(本例中就是项目根目录)的校验和,然后在 Git 仓库中将这些目录保存为树(tree)对象。之后 Git 创建的提交对象,除了包含相关提交信息以外,还包含着指向这个树对象(项目根目录)的指针,如此它就可以在将来需要的时候,重现此次快照的内容了。
现在,Git 仓库中有五个对象:三个表示文件快照内容的 blob 对象;一个记录着目录树内容及其中各个文件对应 blob 对象索引的 tree 对象;以及一个包含指向 tree 对象(根目录)的索引和其他提交信息元数据的 commit 对象。
单个提交对象在仓库中的数据结构
Git 中的分支,其实本质上仅仅是个指向 commit 对象的可 ...
SQL数据库
数据库数据库,是数据的集合,由一张张数据表组成,用来存放数据。
每一张表都有一个唯一标识,即主键,标识数据的唯一性。表与表之间可以 通过主键来互相联系,就是数据能够对应匹配,称之为联结。
什么是SQLiteSQLite是一个软件库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。SQLite是一个增长最快的数据库引擎。
SQLite 引擎不是一个独立的进程,可以按应用程序需求进行静态或动态连接。SQLite 直接访问其存储文件。
为什么要用SQLite
不需要一个单独的服务器进程或操作的系统(无服务器的)。
SQLite 不需要配置,这意味着不需要安装或管理。
一个完整的 SQLite 数据库是存储在一个单一的跨平台的磁盘文件。
SQLite 是非常小的,是轻量级的,完全配置时小于 400KiB,省略可选功能配置时小于250KiB。
SQLite 是自给自足的,这意味着不需要任何外部的依赖。
SQLite 事务是完全兼容 ACID 的,允许从多个进程或线程安全访问。
SQLite 支持 SQL92(SQL2)标准的大多数查询语言的功能。
SQLite 使用 ANS ...
多线程
多线程QThread 线程类是实现多线程的核心类。 Qt 有两种多线程的方法,其中一种是继承 QThread的 run()函数,另外一种是把一个继承于 QObject 的类转移到一个 Thread 里。 Qt4.8 之前都是使用继承 QThread 的 run()这种方法,但是 Qt4.8 之后, Qt 官方建议使用第二种方法。两种方法区别不大,用起来都比较方便,但继承 QObject 的方法更加灵活。 所以 Qt 的帮助文档里给的参考是先给继承 QObject 的类,然后再给继承 QThread 的类。另外 Qt 提供了 QMutex、 QMutexLocker、 QReadLocker 和 QWriteLocker 等类用于线程之间的同步,详细可以看 Qt 的帮助文档
继承 QThread 的线程
run()方法是继承于 QThread 类的方法,用户需要重写这个方法,一般是把耗时的操作写在这个 run()方法里面
1234567891011121314151617181920212223242526272829303132333435363738394041424344454 ...
Qchart放大缩小曲线图
曲线图绘制qt的曲线绘制有三种类,分别是Qcustomplot、QChart、Qwt。
比较
美观方面:
Qcustomplot≈Qchart > Qwt
Qcustomplot界面简洁大方;
Qchart界面华丽优美,在数据量大的时候会引响鼠标的缩放、移动图表操作;
Qwt界面老旧,在美观上不如Qcustomplot和Qchart ,并且在使用鼠标移动图表时会产生空白区域。
性能方面:
绘制数据性能:Qchart>Qcustomplot > Qwt
绘制数据数量:Qcustomplot >Qchart> Qwt
绘制1000个数据点时,qcustomplot平均耗时 13.6毫秒,Qwt平均耗时40毫秒,QChart平均耗时12.5毫秒;
绘制10000个数据点时,qcustomplot平均耗时 21.6毫秒,Qwt平均耗时78毫秒,QChart平均耗时13.5毫秒;
绘制100000个数据点时,qcustomplot平均耗时22.5毫秒,Qwt平均耗时524毫秒,QChart平均耗时20.7毫秒;
绘制500000个数据点时,qcustom ...

