- 博客(50)
- 资源 (2)
- 收藏
- 关注
原创 gpio子系统
用于处理和管理 通用输入输出引脚(GPIO),在内核里面主要是3个结构体来支持gpio子系统,分别是gpio_chip,gpio_desc,gpio_device。将 GPIO 控制器 (gpio_chip) 和设备 (pdev->dev) 关联起来,并将它注册到内核的 GPIO 框架中。上面是gpio子系统框架的gpio_chip,主要实现这个结构体,用的是platform_device总线设备模型。gpio_chip主要是用来做具体的硬件实施的,我们主要是用它来对寄存器的操控,
2024-09-10 21:57:05 166
原创 输入子系统
主要是用这个结构体来描述这个硬件,__set_bit()使用这个函数来配置事件类型,哪种事件和事件参数,在使用下面这个函数来上报输入事件给input_Core层。它提供了一个通用的框架,用来处理各种输入设备的数据,比如键盘、鼠标、触摸屏、游戏控制器等。在linux内核里面主要用哪个结构体来配置输入设备,使用input_dev来描述这个输入设备,下面是input_dev结构体。2.3 输入设备层 :硬件相关的驱动,从硬件里面获得数据,转换为标准输入事件,上报给核心层。代表同步事件给上面的输入核心层。
2024-09-09 21:11:30 280
原创 使用i2c子系统驱动i2c oled模块
然后在对应的设备树里面i2c master下面加上i2c client的信息就可以了。1、使用linux内核里面的i2c子系统来驱动i2c oled 屏幕。
2024-09-08 16:22:32 378
原创 pintrl子系统
在 Linux 内核中,pinctrl子系统是一个专门用于管理和控制 SoC引脚复用和配置的子系统。SoC 通常具有大量的引脚(pin),这些引脚可以被配置为不同的功能,比如 GPIO(通用输入输出)、I2C、SPI、UART 等。而 pinctrl 子系统的任务就是为这些引脚提供一个统一的配置接口。
2024-08-20 22:10:37 444
原创 I2c子系统
总结一下数据传输的关键点:数据稳定性:在 SCL 的高电平期间,SDA 上的数据必须保持稳定,不发生变化。这是因为在 SCL 的高电平时,数据被接收方读取。数据变化时机:SDA 上的数据变化应在 SCL 的低电平期间进行,这样数据在 SCL 的下一个高电平到来之前已经稳定,确保数据的正确读取。数据有效性:数据在 SCL 为高电平时被视为有效,此时数据被从设备读取。每一次发送数据过后都需要收一个ack来确认数据是否收到在I2C中,0110这个数据是先发送最高位,然后再发送低位。
2024-08-15 22:37:47 659
原创 驱动基础开发
字符设备驱动框架,首先我们需要去用module_init这个宏去修饰整个驱动的入口函数,用module_exit去修饰整个驱动的出口函数,然后还需要用MODULE_LICENSE用于声明模块的许可证类型。在入口函数里面我们需要注册字符设备,使用register_chrdev()注册字符设备,使用class_create来注册区分一个类,在用device_create来为这个类创造一个设备节点,供我们在linux根目录下的dev目录下给应用层程序访问。
2024-08-14 21:16:46 924
原创 输入系统应用编程
在linux中使用一个结构体叫做input_event来保存上报的数据(通常还有个表示时间的结构体)ev=b,代表二进制1011代表支持0号事件,1号事件,3号事件,可以通过linux内核源码查询。可以使用cat /proc/bus/input/devices来查看输入系统的具体的设备信息。可以使用hexdump来查看/dev/input/下节点的输入。高位在前,低位在后,可以通过查看内核源码,找到他对应什么事件。0003代表abs事件,后面代表他所支持的事件。value:值,如0按下,1松开,2长按。
2023-12-25 21:11:23 411
原创 C语言调用python
一,安装环境sudo apt install libpython3.10-dev,安装C代码调用python的库函数和动态库。
2023-12-25 20:09:25 458
原创 内建函数对象和常用算法
1,stl函数对象的分类a,算数仿函数b,关系仿函数c,逻辑仿函数这些函数与一般函数相同,使用内建函数对象,需要引入头文件#include2,算术仿函数这里举两个例子plus和negate#include<functional>#include<iostream>using namespace std;int main(){ negate<int> p;//取反 cout << p(50) << endl; plus&
2022-05-31 19:15:03 236
原创 STL函数对象和谓词
函数对象1,重载函数调用操作符的类,其对象常称为函数对象2,仿函数,函数对象使用重载的()时,行为类似函数调用,也叫仿函数注意:函数对象不是一个函数而是一个类。函数对象的使用a,函数对象在使用时,可以像普通函数那样调用,可以有参数可以有返回值b,函数对象超出普通函数的概念,函数对象可以有自己的状态c,函数对象可以作为参数传递#include<iostream>using namespace std;class myadd{public: int operator()
2022-05-24 19:32:23 142
原创 STL模板set容器和map容器
set容器特征set/multiset属于关联式容器,底层是一棵二叉树。set不容许容器中重复的元素,multiset允许有重复的元素pair对组创建功能描述:成对出现的数据,利用对组可以返回两个数据。两种创建方式pair<type,type>p<val1,val2>;pair<type,type>p=make_pair(val1,val2);#include<set>#include<iostream>using name
2022-05-20 19:08:40 191
原创 STL模板栈、队列
栈模板stack()和队列模板queue()#include<stack>#include<iostream>#include<queue>#include<string>//先进后出的规律using namespace std;class person{public: string m_name; int m_age; person(string name,int age) { this->m_age = age;
2022-05-18 19:31:00 182
原创 deque容器
deque容器是一个双端数组,可以对头端进行插入和删除操作#include<vector>#include<deque>#include<iostream>using namespace std;void printDeque(deque<int> &Deque){ for (deque<int>::const_iterator it = Deque.begin(); it != Deque.end(); it++) {
2022-05-17 19:04:19 117
原创 stl容器string类
1,string类概述string本身就是一个类,类内部封装了char*,管理这个字符串是个char*的容器。string类内部封装了许多的成员方法。2,string类的方法#include<string>#include<iostream>#include<stdio.h>using namespace std;int main(){ string str = "NULL";//无参构造 const char* str2 = "have pare
2022-05-13 19:42:07 107
原创 stl容器vector和list容器
stl容器vector可以把vector理解为一个可以动态变化的数组。#include<iostream>#include<vector>#include<algorithm>using namespace std;void myprint(int val){ cout << val << endl;}void test(){ vector<int> v;//实例化一个vector容器 v.push_bac
2022-04-21 14:59:10 91
原创 数据库基础篇(DML&&DQL&&DCL)
1,DML添加数据a,给指定字段添加数据insert into 表名(字段名1,字段名2,…) values(值1,值2,…);eg:insert into employ (age)values(10);b,给全部字段添加数据insert into 表名 values(值1,值2,…);eg:insert into employ (name,age)values("lfj",10);c,批量添加数据insert into 表名(字段名1,字段名2,…)values(值1,值2,…),(值
2022-03-17 15:45:25 405
原创 数据库基础篇(DDL)
1,一些名词的含义数据库:数据存储仓库数据库管理系统:操作和管理数据库的大型软件SQL:操作关系型数据库的编程语言,是一套标准
2022-03-17 10:29:56 2001
原创 Makefile
1,#为注释第一个目标是最终目标目标文件:依赖文件【tab】[commond]#伪目标.PHONY:eg:out:main.o gcc main.o -o out#链接main.o:main.s gcc -c main.s -o main.o#汇编main.s:main.i gcc -S main.i -o main.s#编译main.i:main.c gcc -E main.c -o main.i#预编译.PHONY
2022-03-10 12:41:12 124
原创 C++泛型编程(模板)
c++主要提供两种模板函数模板和类模板1,函数模板的作用:建立一个通用函数,其函数返回值类型和参数类型可以不具体制定,用一个虚拟的类型来代表。template:关键字template表明是声明模板。typename可以用class代替,cal名称可以替换叫做通用数据类型。#include<iostream>using namespace std;template<typename cal>void swap(int &a,int &b){ int
2022-02-28 16:35:12 498
原创 驱动认知(1)
1,linux一切皆为文件,在这里我们需要把设备抽象为文件,linux的目录下有一个dev设备是专门用来存储着设备文件2,linux下会有一个专门的驱动链表来管理所有的设备驱动。3,设备文件会有a,文件名b,设备号(主设备号不同种类的设备,次设备号同种设备不同型号)4,驱动链表驱动插入链表的顺序由设备号检索,a,添加。(编写完驱动程序,加载到内核,调用驱动程序(用open调用))b,查找5,做驱动需要干两件事a,添加驱动1,设备名2,设备号3,设备驱动函数b,调用驱动用户态下调用
2022-02-05 21:28:33 761
原创 文件系统(linux采用混合索引结点文件系统)
什么是文件系统?常规认知: 根目录文件系统是操作系统用于明确存储设备组织文件的方法。以上说的方法:就是文件管理系统(程序),简称文件系统文件系统(文件管理系统的方法)的种类有哪些?FAT VFAT NTFS EXT1/2/3/4 HFS …树莓派查看文件系统的命令: df -Tvfat : boot(bootloader, kernel)ext4 : 根目录tmpfs : 内存文件系统3.什么是分区Linux: 按照功能来分区,每个分区严格存放文件(开发者)嵌入式系统可以分为.
2022-01-22 22:06:52 1303
原创 编译内核的相关知识
1,在PC端搭建环境。(ubantu)2,树莓派等芯片带操作系统的启动过程C51,STM32(裸机)用C直接操控底层寄存器实现相关业务。 业务流程型的裸机代码。3,带有操作系统的(X86,intel,windows)启动过程:电源->bios芯片->windows内核->C,D盘->启动程序嵌入式产品:树莓派,mini2440,mini6410,nanopi,海思,RK(瑞芯微)启动过程: 电源-》BootLoader(引导操作系统启动)-》Linux内核-》文件系统
2022-01-19 23:20:24 1081
原创 关于交叉编译的一些知识和操作
1,为什么要交叉编译,交叉编译是什么交叉编译 是在一个平台上生成另一个平台上的可执行代码。我们再windows上面编写C51代码,并编译成可执行代码,如xx.hex,是在c51上面运行,不是在windows上面运行我们在ubuntu上面编写树莓派的代码,并编译成可执行代码,如a.out,是在树莓派上面运行,不是在ubuntu linux上面运行编译:是在一个平台上生成在该平台上的可执行代码C51 交叉编译的发生在keil(集成环境上面)stm322,交叉编译需要用到什么交叉编译器、交叉编译
2022-01-13 17:26:58 583
原创 关于linux系统上scp命令报错的两个问题及Linux常用命令
1,出现这种情况直接输入命令ssh -o StrictHostKeyChecking=no 192.168.31.135(ip地址为本地地址)之后便能正确使用2,出现这种情况需要先使用命令rm -rf ~/.ssh/known_hosts解决这个问题后,又会出现第一个问题按照方法一就可以解决...
2022-01-13 16:19:02 3284
原创 树莓派3b+镜像的安装以及常用的登录方式及树莓派换源
安装镜像1,格式化内存卡用第一个工具2,把镜像写道内存卡中用第二个工具登录串口登录因为树莓派默认的是蓝牙连接,我们要断开蓝牙连接,打开串口连接。将安装好的sd卡文件夹下的cmdline.txt文件的内容修改为dwc_otg.lpm_enable=0 console=tty1 console=serial0,115200 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwaitconfi
2022-01-12 16:36:10 1074
原创 C++文件操作
通过文件可以将数据持久化C++中对文件操作需要包含头文件文件类型分为两种:1,文本文件2,二进制文件操作文件的三大类写操作:ofstream读操作:ifstream读写操作:fstreameg:#include<fstream>#include<iostream>using namespace std;fstream ofs;//定义一个流void test(){ ofs.open("text.txt",ios::out); ofs<
2021-06-06 17:37:47 149
原创 怎样把写好的QT程序打包成在Windows下直接可以执行的软件
1,什么是打包和部署?因为我们要把写好的程序发给用户来用,我们写好的源码也不是随便给别人的2,怎么打包和部署?1,我们把工程切换到release模式,然后编译。release模式:基本没有调试信息。debug模式:有很多调试信息。2...
2021-06-02 20:12:34 532
原创 c++QT自制串口助手
1,界面2,相关文件3,文件源码widget.h#ifndef WIDGET_H#define WIDGET_H#include <QWidget>#include <QSerialPort>#include<QString>namespace Ui {class Widget;}class Widget : public QWidget{ Q_OBJECTpublic: explicit Widget(QWidg
2021-05-30 21:52:18 344
原创 C++:QT学习
1,工程文件学习2,gui做一个简单的登录界面qlable:放图片,放gif图,放文本的组件qlinedit:放账号和密码的对话框用的组件PushBotton:按钮
2021-05-25 20:28:52 394
原创 C++之多态
多态多态的基本概念多态分为两类a,静态多态,函数重载和运算符重载属于静态多态,复用函数名b,动态多态:派生类和虚函数实现运行时多态静态多态和动态多态的区别:静态多态的函数地址早绑定,编译阶段确定函数地址动态多态的函数地址晚绑定,运行阶段确定函数地址多态满足条件1,有继承关系2,子类重写父类中的虚函数多态的使用:父类指针或引用指向子类对象重写:函数返回值类型 函数名 参数列表 完全一致称为重写运用多态的优点1,代码组织结构清晰2,可读性强3,利于前期和后期的扩展以及维护#in
2021-05-22 19:28:13 124
原创 嵌入式C语言补充(GNU C语言补充)
1,内联函数inline内联函数和普通的函数相同,但是打开编译器优化选项时,内联函数和实质上不生成独立的代码,而是将代码直接嵌入到所要调用的地方去。这样做可以加快执行速度。一般与static连在一起使用,所使用的函数内容为尽量简短eg#include<stdio.h>static inline void test(){printf(“hi inline\n”);}int main(){test(); return 0;}2,extern声明外部环境变量通俗的
2021-05-21 20:30:55 358 3
原创 c++核心之继承
继承1,继承的好处:可以减少重复的代码派生类里面的成员,包含两部分:a,一类是从基类中继承过来的,一类是自己增加的成员。b,从基类继承过来的表现其共性,而新增的成员体现其个性。2,继承方式有三种a,public 父类:继承下来的都可以访问b,protected 父类:继承过后子类中的继承全部变为protectedc,private 父类:继承过后子类中的继承全部变为private.注意子类只能访问父类中的public和protected,不能访问private权限eg:#include
2021-05-18 13:27:59 640
原创 C++权限案例点到圆的距离
本案例主要在于用到类中里面使用了一个类。及带有类的模块化的编程eg:#include<iostream>using namespace std;class point{public: void setx(int x) { m_x = x; } int getx() { return m_x; } void sety(int y) { m_y = y; } int get
2021-04-29 21:52:42 203
原创 C++核心课程学习总结(对象——封装)
1,内存分区C++程序在执行时,将内存大方向划分为4个区域a,代码区:存放函数体的二进制代码,由操作系统进行管理的b,全局区:存放全局变量和静态变量以及常量c,栈区:由编译器自动分配释放,存放函数的参数值,局部变量等d,堆区:由程序员分配和释放,若程序员不释放,程序结束由操作系统回收1.1程序运行前在程序编译后,未执行该程序前分为两个区域a,代码区:存放CPU执行机器指令特点:共享的,只读的b,全局区全局变量和静态变量存放在此还包含了常量区,字符串常量(“jkl”),和其他常量都存放在
2021-04-26 20:11:01 302
原创 C++第一阶段过关题
采用模块化编程未使用简单工厂模式//主函数#include"common.h"int main(){ int cmd=0; int len = 0; person people[1000]; len = sizeof(people)/sizeof(person); initTelephoneInventory(people,len); while(1) { show(); cout<<"\t***************please input cmd:";.
2021-04-24 15:52:08 220
原创 C++基础语法学习2
1,指针。记住一句话指针就是地址(可以通过指针间接访问地址)2,空指针和野指针空指针:指针变量指向内存中编号为0的地址空指针用于初始化指针,不可以被访问野指针:指针变量指向非法的变量空间注意:空指针和野指针都不是我们申请的空间因此不要访问。3关键字const#include<iostream>using namespace std;int main(){ int a=10; int b=10; int const *p;//常量指针:不可以更改指向内容的数值;
2021-04-22 10:49:02 102
原创 C++基础语法学习函数模块化编程(在ubutun下vim中编写)
作用:让代码结构更加清晰函数分文件编写一般有4个步骤1,创建后缀名为swap.h的头文件2,创建后缀名为swap.cpp的源文件和主函数mainpro.cpp3,在头文件中写函数的声明4,在swap.cpp中写函数的定义swap.cpp文件源码#include"swap.h"int swap(int a,int b){ cout<<"a="<<a<<"b="<<b<<endl; return a>b?a:b;}
2021-04-21 09:56:13 120
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人