- 博客(105)
- 收藏
- 关注
原创 Linux驱动——应用程序和驱动程序的交互机制[查询,休眠唤醒(中断、线程),poll、异步通知]
在Linux系统中应用层和驱动层之间的交互方式有多种:查询、休眠、poll、和中断。本博文主要叙述中断相关的信息。中断处理流程:1.设置中断控制器2.注册中断处理函数3.保存现场4.调用中断处理函数5.恢复现场异常虽然与中断处理流程一致,但是中断可以被屏蔽,而异常不能被屏蔽;中断发生后的过程:发生中断后CPU会指向中断向量表,保存现场,执行中断处理函数,恢复现场。其中保存和恢复现场都是内核实现的,但是执行中断处理函数是由开发人员提供的对应函数。在驱动中编写中断函数时需要使用到request
2021-12-07 17:17:57
2766
原创 Linux驱动——pinctrl子系统、GPIO子系统
以IIC为例,通常有两种状态:default和sleep状态,在对应的状态下需要把引脚配置成对应的功能,例如在default状态需要把引脚配置成IIC模式,在sleep状态下需要把引脚配置成GPIO模式。在SOC中各个引脚与各个模块之间是通过IOMUX进行控制,如何将引脚配置成我们需要的作用就需要用到pinctrl来驱动IOMUX。 在设备树文件中可以看到不同设备对应的pinctrl信息如下:在该文件所包含的pinctrl设备树文件中找到对应的不同状态的pinctrl引脚和复用功能信息如下:在.
2021-12-02 15:38:40
1312
原创 Linux驱动——设备树
在对总线设备驱动进行详细说明时可以看出,虽然总线设备驱动可以实现驱动和设备分离,但是总线设备驱动引发另外的一个问题就是在相同的芯片不同的开发板上,当外设资源不同时需要在不同的设备文件中去定义引脚,这样就导致开发板中保留大量设备文件。为了解决这一问题引入了设备树。设备树是为内核中的驱动程序定义硬件信息。上层应用层调用相关设备文件时,会去调用底层的相关设备驱动文件,而驱动所需要操作的相关引脚是由设备树对其进行制定。 在单板上电启动时,首先运行的是bootloader,bootloader的主要作用是启动时为.
2021-11-28 20:07:55
6743
原创 Linux驱动——字符设备驱动基本框架和相关内容详细说明
在Linux系统中通常把驱动分成三类:字符设备驱动、块设备驱动、网络设备驱动,关于三种设备设备驱动的相关定义如下:字符设备:只能一个字节一个字节的读写的设备,不能随机读取设备内存中的某一数据,读取数据需要按照先后顺序进行。字符设备是面向流的设备,常见的字符设备如鼠标、键盘、串口、控制台、LED等。块设备:是指可以从设备的任意位置读取一定长度的数据设备。块设备如硬盘、磁盘、U盘和SD卡等存储设备。网络设备:网络设备比较特殊,不在是对文件进行操作,而是由专门的网络接口来实现。应用程序不能直接访问网络设备
2021-11-24 10:16:18
1519
原创 Linux驱动——驱动分离思想和总线设备驱动模型
驱动分离思想:在传统的字符设备驱动思想中一个驱动程序对应一个硬件资源,在驱动入口函数中对资源进行配置,在file_operation中对各个硬件资源进行操作。这种思想使得内核中驱动代码变得庞大,为了节约内核空间驱动分离思想被提出,同时提高程序可移植性。总线设备驱动模型包含的就是总线、设备、驱动三个部分。驱动分离是将驱动和设备代码进行分离。将模块拆分为device和driver。在Linux内核中总线由bus_type结构体表示,在platform.c中有bus_type型platform_bus_ty
2021-11-21 20:46:32
1828
1
原创 Linux驱动——编译驱动的两种形式(内核目录外、内核目录中)
在内核目录外对驱动程序进行编译1.在内核目录中需要对相关信息进行配置以适应不同架构的开发板,需要设置以下相关环境变量:2.1板子架构 ARCH2.2交叉编译工具 CROSS_COMPILE2.3编译文件存储路径 PATH2.当上述环境变量配置完成之后就可以在内核目录以外对驱动进行编译,需要对Makefile进行修改;配置环境变量或者使用export单独设置如:修改makefileKVERSION = $(shell uname -r) //内核版本KERN_DIR
2021-11-21 16:08:16
8439
原创 Linux驱动——Linux输入子系统
输入子系统分为上下两层:上层为核心层input.c,其中包含registe_chrdev,里面的file operation结构体只有open函数,早open函数中会有一个中转的过程,利用input_table数组根据打开设备结点的次设备号找到一个handler,调用其中的open函数,并且将file operation指向handler中的file operation,之后读写都是调用这个新的file operation中的read和write;下层有input_handler和input_dev层,通过
2021-08-24 21:46:22
313
2
原创 数据结构——二叉树创建与遍历(递归与非递归)
二叉树使用递归的方式创建:首先输入数据,如果输入的数据是结束的数据就会返回上一层递归,进入到上一个节点并创建右孩子;如果输入数据符合创建数据的要求,就将改数据赋值给当前节点,并为当前节点的左孩子和右孩子开辟空间,创建左孩子节点;int createTree(struct binaryTree *root){ if(root == NULL){ return 0; } int data; scanf("%d",&data); if(data == 0){ return 0;
2021-08-18 22:06:49
576
原创 Linux——进程调度
一.进程的分类:实时进程:与用户交互,需要快速响应普通进程:不需要及时响应二.上下文切换:上下文切换简单来说就是cpu在运行当前的进程的时候切换到另一个进程执行;这中间需要对前一个进程的有关信息进行保存,比如程序计数器、变量、寄存器的值等等保存到内核的栈中;例如CPU在执行P1进程的时候需要切换到P2进程,这时候保存P1的相关环境和参数,然后加载P2相关进程信息,让P2运行起来。三.调度算法调度算法是为了实现一个CPU执行多个进程1.先到限制性算法,短作业/进程调度算法1.1 FFCFS(
2021-08-16 20:30:50
144
原创 数据结构——哈希表
哈希表:通过键值对的方式存储数据,通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表或哈希表;具体解释可以查看其它博文本文使用C语言利用开放寻址线性探测法创建哈希表:#include <stdio.h>#include <stdlib.h>#define hashSize 10 //宏定义哈希表的大小struct hashTable{ int *elem; //利用指针存
2021-08-16 15:07:44
108
原创 基于Linux的客户端与服务端的传输和信息交互
基于Linux的客户端与服务端的传输和信息交互,利用socket网络来构建服务端和客户端的网络请求,在服务端接收到客户端的连接请求的时候创建进程用于,服务端与多个客户端之间的连接,在头文件中穿件用于网络传输数据的结构体,其中包括具体的命令(cmd),传输文件时文件中的内容(context),以及用于判断在传输后是否需要创建文件的标志位;利用字符串处理函数来分解指令,获得具体指令,再根据指令的类型来选择需要执行的代码,实现服务端与客户端之间的文件传输和信息交互;头文件中包含宏定义各个指定,和数据传输过程中的
2021-08-06 20:06:52
1209
原创 基于翔云OCR实现的人脸识别
翔云ocr平台需要的信息使用post请求实现人脸识别:#include <stdio.h>#include <curl/curl.h>#include <string.h>#include <stdlib.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <unistd.h>#define tr
2021-08-02 21:58:12
359
原创 C++——STL(map/ multimap容器)
map基本概念:map中所有元素都是pair对组pair中第一个元素为key(键值),起到索引作用,第二个元素为value(实值)所有元素都会根据元素的键值自动排序本质:map/multimap属于关联式容器,底层结构是用二叉树实现。优点:可以根据key值快速找到value值map和multimap区别:map不允许容器中有重复key值元素multimap允许容器中有重复key值元素构造:map<T1, T2> mp; //map默认构造函数:map(const map
2021-08-01 17:53:58
224
2
原创 Qt——模态和非模态对话框
模态对话框创建之后,不能对其他窗口进行操作;飞沫太对话框在对话窗口创建之后,可以对其他窗口进行操作;#include "mainwindow.h"#include "ui_mainwindow.h"#include <QDialog>#include <QDebug>MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow){ ui
2021-08-01 17:53:10
176
原创 网络——libcurl
libcurl是一个跨平台的开源网络协议库,支持http, https, rtsp等多种协议 。libcurl同样支持HTTPS证书授权,HTTP POST, HTTP PUT, FTP 上传, HTTP基本表单上传,代理,cookies,和用户认证。所以,使用libcurl,可以很简单的完成HTTP的下载工作,为HLS模块的拉流部分提供简单有效的HTTP请求方法。安装库将下载好的curl包放入到Ubuntu中,并对齐进行解压;阅读README 和docs中的INSTALLdocs中的INSTA
2021-07-30 21:37:24
503
原创 Linux——IO多路复用
对于监听和通信而言两者都有两个缓冲区,监听调用accept函数的时候会有读写缓冲区,通信调用read和write的时候也有读写缓冲区;在单线程的条件下是不能同时处理这三个函数的阻塞的,使用多路IO复用就可以同时检测若干个文件描述符;IO多路转接并发使用io多路复用时是委托内核检测服务端所有文件描述符(通信和监听两类),这个检测过程会导致进程/线程的阻塞,如果检测到已经就绪的文件描述符阻塞解除,并将这些已就绪的文件描述符传出;根据类型对传出的所有已经就绪的文件描述符进行判断,并做出不同的处理:监听的
2021-07-30 17:37:58
189
原创 linux驱动——块设备驱动
在字符设备发出读写请求的时候,实际上硬件IO就发生了,但是块设备不同,块设备利用一块系统内存作为缓冲区,当用户进程对设备请求能够满足用户的要求时,就返回请求的数据,如果不能就调用请求函数来进行实验IO操作,块设备是对慢速设备设计,防止消耗过多的CPU事件来等待。与字符设备根本的区别在于是否能够被随机访问(在访问设备的时候随意地从一个位置跳转到另一个位置); 简单来讲,块设备通过系统缓存进行读取,不直接和物理磁盘进行读取,他是将读写放入到队列中,优化之后再执行,而字符设备可以直接读取物理磁盘不经过系统缓存.
2021-07-19 18:58:16
230
原创 Linux调试——gdb的使用
需要使用gdb进行调试的时候需要在编译.c文件的时候在gcc后面加上-g在调试的时候使用gdb ./可执行文件就可以对其进行调试输入l就可以打印程序的代码在终端上;设置断点输入b 行号 (break)让程序运行输入 r(run)使用print打印程序信息:让程序从当前位置向后执行输入c(continue)退出输入qgdb调试core文件可以直接定位到段错误的位置;配置.bashrc文件添加ulimit -c unlimited当运行程序出现段错误的时候就会在当前文件
2021-07-19 14:52:18
189
原创 智能家具项目
本项目使用工厂模式来编写代码,其中包括指令工厂和设备工厂,使用工厂模式的目的是为了让各模块代码更加独立,并且让C语言具有所谓的面向对象的属性;本项目使用树莓派作为主控芯片,开发环境选择ubuntu下的Linux,通过使用交叉编译工具链,将x86架构下的代码,交叉编译成为arm架构下可执行程序,置于树莓派中;控制方案采用socket网络控制线程和串口控制线程,其中串口控制使用的是LD3320语音模块,通过对该模块的二次开发,使其成为能够在特定语音环境下实现串口通信的功能,与树莓派通过串口进行通信,在树莓派
2021-07-14 20:35:08
781
原创 Boot——移植u-boot
启动过程:1.初始化硬件,关闭看门狗,设置时钟,设置SDRAM,初始化NAND FLASH2.如果bootloader比较大,要将其重定位到SDRAM中3.把内核从NAND FLASH读到SDRAM4.设置要传给内核的参数5.跳转执行内核start.s文件中1.设置为管理模式;2.屏蔽所有中断;3.设置时钟比例;4.设置时钟比例5.设置内存控制器;6.设置栈,调用c函数board_init_f7.调用函数数组init_sequence的各个函数8.重定位代码9.清除bss10
2021-07-14 16:21:47
184
原创 Boot——自己编写简单的bootloader
bootlaoder目标:启动内核1.从FLASH上把内核读入内存;需要可以读写FLASH;初始化时钟,内存,其他;2.启动设置参数;跳转执行;最简单bootloader的编写步骤:1.初始化硬件:关看门狗(防止自动复位整个开发板);设置时钟,SDRAM,NAND FALSH;2.如果bootloader比较大需要将其重定位至SDRAM;3.把内核从NAND FLASH读到SDRAM中;4.设置需要传给内核的启动参数;5.跳转执行内核;假设是NOR启动:将代码直接从NOR FALSH
2021-07-11 15:26:06
1371
原创 Linux——构建根文件系统
内核如何启动第一个程序:1.open(/dev/console);其中有两个sys_dup(0);2.run_init_process启动应用程序(命令行中的init = “xxx”)如果命令行中没有设置该命令,则按照以下顺序启动if (execute_command) { run_init_process(execute_command); printk(KERN_WARNING "Failed to execute %s. Attempting " "defaults...
2021-07-08 15:24:25
124
原创 QT——简单的串口调试助手实现
界面布局:widget.h#ifndef WIDGET_H#define WIDGET_H#include <QWidget>#include <QSerialPort>QT_BEGIN_NAMESPACEnamespace Ui { class Widget; }QT_END_NAMESPACEclass Widget : public QWidget{ Q_OBJECTpublic: Widget(QWidget *parent =
2021-07-07 20:31:14
561
原创 Uboot、内核
启动过程:PC机上电过程:上电->BIOS->引导操作系统内核->识别C,D盘->运行应用程序;嵌入式系统:上电->bootoader->Linux内核->挂载根文件系统->应用程序;
2021-07-07 15:51:16
564
原创 2440——Nand、Nor启动方式
Nand启动:对于2440而言其内部有cpu和内部的4K大小的SDRAM,外接上Nand Flash和SDRAM,使用Nand方式进行启动的时候,会将Nand Flash的前4K内容复制到2440 片内的4K的SDRAM中启动时内部4K的起始地址为0;Nor启动:2440外接Nor Flash(可以像内存一样进行读数据,但是不能够像内存一样进行写数据,需要通过命令先擦除)Nor启动时0地址不再指向SDRM,而是指向NorFlash...
2021-07-03 16:09:07
207
原创 Linux——Makefile
Makefile的核心 ----规则:目标:依赖1 依赖2 …[TAB]命令当目标文件不存在或某个依赖文件比目标文件新时执行命令;
2021-07-03 15:31:09
164
原创 Qt——QFile
对文件进行读写操作:QFile读文件的时候默认只能读utf-8格式的文件,可以使用编码格式类,对格式进行转码,转换成指定的格式QTextCodec *codec = QTextCodec::codecForName(“gbk”);注意:准换格式之后默认的utf-8的格式就不能用#include "widget.h"#include "ui_widget.h"#include <QFileDialog>#include <QFile>#include <QText
2021-07-01 20:21:54
536
原创 Qt——QPainter绘画
绘图的事件: void paintEvent(QPaintEvent *); 在widget.h中进行声明声明一个画家对象:QPainter painter(this) this指定的绘图的设备画线、圆、矩形、文字;设置画笔和画刷;#include "widget.h"#include "ui_widget.h"#include <QPainter>Widget::Widget(QWidget *parent) : QWidget(parent)
2021-06-28 21:12:19
832
原创 Linux——硬链接软链接
ln -s是为某一个文件在另外一个位置建立一个不同的链接;具体用法:硬链接 :ln 源文件 目标文件;该命令会在选定的位置上生成一个和源文件大小相同的文件;软链接:ln -s 源文件 目标文件;该命令只会在选定的位置上生成一个文件的镜像,不会占用磁盘空间;无论是硬链接还是软链接文件都保持同步变化;硬链接:硬链接通过索引节点来进行连接,在LInux文件系统中,保存在磁盘分区的文件不管是什么类型都会为期分配一个编号,称为索引节点号。在Linux中,多个文件名指向同一索引节点是存在的,一
2021-06-27 15:45:42
74
原创 Qt——事件
鼠标事件:鼠标进入事件: enterEvent鼠标离开事件: leaveEvent鼠标按下:mousePressEvent(QMouseEvent ev)鼠标释放:mouseReleaseEvent鼠标移动:mouseMoveEvent鼠标x坐标:ev->x()鼠标y坐标:ev->y()ev->button() 可以判断所有按键Qt::LeftButton Qt::RightButtonev->buttons() 判断组合按键,判断移动的时候左右键结
2021-06-25 21:28:39
258
原创 Qt——控件
按钮组:QPushButton:常用按钮;QToolButton:工具按钮;用于显示图片,修改风格,toolButtonStyle,凸起风格autoRaise;radioButton:单选按钮;设置默认选项:ui->rBtnMan->setChecked(true);checkBox:多选按钮;监听状态,2是选中,0是未选中,1是半选;connect(ui->cBox,&QCheckBox::stateChanged,[=](int state){qDebug()
2021-06-24 21:08:40
392
转载 C++——STL(常用算术生成是算法、集合算法)
常用算术生成算法:accumulate // 计算容器元素累计总和fill // 向容器中添加元素accumulate计算区间内 容器元素累计总和需要包含头文件 #include accumulate(iterator beg, iterator end, value);// 计算容器元素累计总和// beg 开始迭代器// end 结束迭代器// value 起始值#include<iostream>#include <algorithm>#incl
2021-06-23 15:45:36
163
转载 C++——STL(常用拷贝和替换算法)
copy // 容器内指定范围的元素拷贝到另一容器中replace // 将容器内指定范围的旧元素修改为新元素replace_if // 容器内指定范围满足条件的元素替换为新元素swap // 互换两个容器的元素copy容器内指定范围的元素拷贝到另一容器中copy(iterator beg, iterator end, iterator dest);// 按值查找元素,找到返回指定位置迭代器,找不到返回结束迭代器位置// beg 开始迭代器// end 结束迭代器// dest 目.
2021-06-23 14:22:48
231
转载 C++——STL(常用排序算法)
sort对容器内元素进行排序sort(iterator beg, iterator end, _Pred);// 按值查找元素,找到返回指定位置迭代器,找不到返回结束迭代器位置// beg 开始迭代器// end 结束迭代器// _Pred 谓词#include<iostream>#include <vector>#include <algorithm>#include <functional>using namespace std
2021-06-22 15:49:46
172
原创 C++——STL(常用遍历算法、查找算法)
概述:算法主要是由头文件 组成。是所有STL头文件中最大的一个,范围涉及到比较、 交换、查找、遍历操作、复制、修改等等体积很小,只包括几个在序列上面进行简单数学运算的模板函数定义了一些模板类,用以声明函数对象。遍历算法for_eachfor_each //遍历容器transform //搬运容器到另一个容器中for_each可以利用普通函数和仿函数进行遍历;#include<iostream>#include <algorit
2021-06-22 15:09:40
317
原创 Qt——登录窗口布局
实现登录窗口:利用布局方式,给窗口进行美化;选取widget进行布局,水平布局、垂直布局、栅格布局;给用户名、密码、登录、退出按钮进行布局;默认窗口和空间之间有9间隙,可以调整layoutLeftmargin;利用弹簧进行布局;密码不可见用echoModelearned from:传智教育;...
2021-06-21 20:57:08
93
原创 Qt——标准对话框
消息对话框:错误对话框:QMessageBox::critical(this,"critical","错误"); 信息对话框:QMessageBox::information(this,"info","信息");问题对话框:QMessageBox::question(this,"question","提问");改变按钮属性:在之前的QMessageBox的参数后面增加参数;激活按钮:QMessageBox::question(this,"question","提问",
2021-06-21 19:52:15
88
原创 Qt——添加资源文件
步骤:1.将图片文件拷贝到项目位置下;2.右键项目->添加新文件->Qt->Qt resource file->给资源文件起名3.res生成 res.qrc4.open in edit编辑资源5.添加前缀->再添加文件6.使用" : +前缀名 +文件名"learned from:传智教育...
2021-06-20 20:38:50
66
原创 Qt——QMainWindow
QMainWindow是一个位用户提供主窗口程序的类,包含一个菜单栏(menu bar),多个工具栏(tool bars)、多个锚接部件(dock tool)、一个状态栏(status bar)以及一个中心部件(central widget),是许多应用程序的基础,如文本编辑器,图片编辑器;在新建文件时需要选择QMainWindow;菜单栏最多一个(QMenuBar);工具栏可以有多个(QToolBar);状态栏最多只能一个(QStatusBar);铆接部件(浮动窗口)可以有多个(QDockWi
2021-06-20 20:15:18
420
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人