- 博客(30)
- 资源 (10)
- 收藏
- 关注
转载 Linux根文件系统的制作(转载)
Linux根文件系统的制作什么是文件系统计算机的文件系统是一种存储和组织计算机数据的方法,它使得对其访问和查找变得容易,文件系统使用文件和树形目录的抽象逻辑概念代替了硬盘和光盘等物理设备使用数据块的概念,用户使用文件系统来保存数据不必关心数据实际保存在硬盘(或者光盘)的地址为多少的数据块上,只需要记住这个文件的所属目录和文件名。在写入新数据之前,用户不必关心硬盘上的那个块地址没有被使用,硬盘上的存储空间管理(分配和释放)功能由文件系统自动完成,用户只需要记住数据被写入到了哪个文件中。文件系统通常.
2020-08-07 21:19:13 1225
原创 Linux Qt 开发之多线程
Qt 应用程序中所有的界面响应事件都在一个主线程中运行,当我们去调用QApplication对象的exec()方法时,Qt就不断去循环查询当前的事件队列中有没有事件发生,如果有则转去执行对应的槽函数,如果将过多的业务逻辑及耗时的操作放到当前的主线程中去执行,则界面的响应事件就无法及时得到响应,整个界面就会卡顿。一般Qt应用程序的开发分为界面和后台两部分,在主线程中执行界面显示相关的操作,其他的业务逻辑则放到线程中去作为后台程序去执行,线程和线程及线程和主线程之间通过信号和槽进行通讯。多线程开发中,常
2020-08-02 20:58:56 1236
原创 Linux 应用开发之系统调用
系统调用(System Call)是操作系统提供给用户程序调用的一组”特殊”函数接口。Linux 系统分为内核空间和用户空间,用户空间只能通过系统调用接口与内核空间进行通信。 Linux 系统提供了两种方式供用户调用内核中的API来完成各功能,一种是Linux 自身提供的API接口,一种是C标准库接口,进行程序开发时推荐使用后者,后者不依赖于开发平台,可移植性更强。Linux 提供的系统调用包含以下内容: 进程控制:如 fork、clone、exit 、setpriority 等创建、中止、.
2020-07-30 21:48:17 409
原创 Linux驱动开发之设备树
设备树是一种用来描述硬件的数据结构,在Linux驱动程序中用来替代Platform_device等结构体用来描述设备的板级信息,Linux设备驱动程序通过特定的API接口从设备树中获取设备信息来对设备进行初始化和操作.设备树可以用来描述CPU、描述时钟、描述中断控制器、描述IO控制器、描述SPI总线控制器、描述I2C总线控制器、描述存储设备等任何设备信息。设备树是一个树状结构,由节点、属性构成,属性是成对出现的键值对,每个节点除了属性外还会包含其他的子节点。每个设备树有且只有一个根节点,每个节点中包
2020-07-29 21:59:12 818
转载 Qt 开发常用快捷键整理
Qt creator 最常用的13个快捷键alt +enter// 自动创建类的定义F1// 查看帮助,文档F2// 快速到变量声明Shift + F2// 函数的声明和定义之间快速切换F4// 在 cpp 和 h 文件切换Ctrl +M创建书签,Ctrl + .切换书签Alt + M打开书签栏。Ctrl + Enter换行 ,Ctrl +Shift + Enter到上一行添加Ctrl + ],Ctrl+[跳到程序段结尾 或者开头Ctrl ...
2020-07-28 21:18:36 845
原创 Linux设备驱动开发之Platform总线设备
1. Linux 设备模型:• 设备 (device):设备板级信息描述(描述设备硬件信息,主要是设备树开发); • 驱动 (driver):设备驱动程序(不依赖板级信息的设备驱动程序); • 总线(bus):负责管理挂载对应总线的设备以及驱动(常用platform 总线、SPI总线、I2C总线,负责设备和驱动的匹配); • 类 (class):对于具有相同功能的设备,归结到一种类别,进行分类管理(sysfs文件系统,导出设备信息到sys/目录下);Linux 驱动程序的开发有两大特..
2020-07-27 21:28:30 283
原创 Linux设备驱动开发之字符设备驱动
Linux 下的驱动程序,不论是字符设备还是paltfrom 虚拟总线设备,看起来很复杂,其实都是固定的一套流程,只要步骤整理出来,实际开发的时候,直接套用模板就可以。Linux下字符设备的开发遵循一套固定的流程,1. 创建设备 (动态、静态创建) 2. 申请设备号 (主、次设备号) 3. 实现设备的操作方法(file_operations结构体中描述的方法) 4. 向内核中注册设备(将设备号、设备操作方法与设备结构体绑定注册到内核) 5. 在module_exit()函数中实现资源的释放,主要是设..
2020-07-25 20:46:03 238
原创 LINUX设备驱动开发之内核模块
本文介绍Linux内核模块的相关知识,Linux是一个微内核操作系统,包含内核和内核模块两部分,其中内核实现进程管理、内存管理、文件系统等基本功能,内核模块实现系统的各种扩展功能(主要是设备驱动)。1. Linux内核模块常用指令:lsmod :查看内核中加载的内核模块。insmod: 向内核中加载的内核模块。rmmod:从内核中卸载相关内核模块。modinfo: 查看指定内核模块信息。modprobe:向内核中加载内核模块,同时加载内核模块的依赖模块。depmod: 查看内核模
2020-07-25 13:31:47 352 1
原创 FPGA Verilog语言常用语法
本文介绍FPGA Verilog语言语法知识。1. 逻辑值,Verilog语言中有四种逻辑值,分别代表4中逻辑状态,逻辑1:高电平状态、逻辑0:低电平状态、逻辑X:不定状态、逻辑Z:高阻状态。2. 标志符,Verilog语言中的标志符用于定义模块名、端口号、信号名等,注意标识符的定义是区分大小写的。3. 数字的基数表示法:Verilog语言常用基数表示法表示数字,例如4’b1010表示二进制数据1010,其中4表示数据占4个bit位,4’h9表示16禁止数字9,4'o8表示8进制数字8,4‘d2
2020-07-02 18:45:13 2806
原创 Could not get lock /var/lib/dpkg/lock 问题解决方法
今天在ubuntu上安装sqlite 时,执行命令sudo apt-get -y install sqlite3 时,系统提示:Could not get lock /var/lib/dpkg/lock - open (11: Resource temporarily unavailable)上述提示的意思是,无法获取/var/lib/dpkg/lock 锁,解决的办法很简单,把当前的锁干掉就可以了,执行 sudo rm -rf /var/lib/dpkg/lock ,执行完就没问题了。...
2020-06-30 20:20:15 18849 1
原创 有符号数与无符号数之间的转换
本文讲解有符号数和无符号数之间的转换。针对同一数据类型有符号数和无符号数之间的转换,例如 int 和 unsigned int 之间和 char 和 unsigned char 之间 。这种情况下,二者之间的数据类型长度一致,不会发生转换后数据溢出而导致截断的问题。例如把一个int 类型转为unsigned char 类型,转换后数据存不下,导致被截断。1. 首先针对这种情况,有符号类型和无符号类型中存储的数据是一致的,不一致的是数据的解释方式,有符号类型中最高位被解释为符号位,无符号数中最高...
2020-06-29 21:23:43 16365 2
原创 补码原码转换
本文主要讲述补码和原码之间的换算。1. 原码 转 补码: 正整数的补码是它本身,即 1的原码是0000 0001 ,补码 还是 0000 0001. 负整数的补码是符号位不变,其余位按位取反 ,再加1 ,例如 -1 的原码 1000 0001 ,补码 1111 1111 .2. 补码 转 原码 正整数的补码即是原码。例,1 的补码是0000 0001 ,原码还是 0000 0001 负整数已知补码求原码,只需要再对补码求一次...
2020-06-29 20:47:37 60233 3
原创 从零实现基于事件轮询的操作系统
本文我们从零实现一个基于事件轮询的操作系统。事件轮询机制,很简单就是系统不断去判断当前是否有事件发生,如果有事件发生,就转去执行对应的事件处理函数。这是典型的基于前后台的设计模式,当外部事件发生时,我们在对应中断函数中,接收数据拷贝到缓存中,并置位对用事件标志位,在main函数中,根据对应的事件去做出相应的处理。要实现上述功能,1. 首先我们要实现一个事件表,事件表里面保存每个任务对用事件。2 .其次实现一个函数表,函数表里面保存各个任务事件对用的处理函数。3. 建立事件表与函数表之间.
2020-06-26 15:52:03 494
原创 FreeRTOS嵌入式操作系统常用API总结
本文介绍嵌入式实时操作系统FreeRTO的常用API,freertos基本功能包括 任务调度、内存管理、中断管理、定时器管理、消息队列、信号量、互斥锁等。1. FreeRTOS 任务相关API: 1.1 任务结构 void Task (void *pvParameters) voidTask (void *pvParameters) { for (; ;) { ...
2020-06-26 09:43:49 2036
原创 使用CRC16校验一帧数据是否正确(使用查表法,附源码)
在数据传输过程中,怎样保证接收端接收到的数据就是发送端发送的,如果发送端发送的数据在发送过程中收到干扰,某个比特位反转了,接收端接收到数据后怎样确认这帧数据是错误的,这就需要使用CRC校验算法了,首先我们对要发送的数据使用CRC算法进行计算,得出一个2字节的校验码附加在要发送的数据包结尾,接收端接收到数据后,对接收的数据使用CRC算法进行计算,计算的结果与附加在数据包结尾的校验值进行对比,如果对比一致,则可以断定接收的数据就是发送端发送的数据,否则,接收到的数据有误,丢弃。帧头(2字节,例如AA、BB)
2020-06-25 21:07:41 3970
原创 串口接收完整一帧数据包的3种方法
本文介绍3种使用串口接受一帧完整数据包的方法,串口接收数据是字节接收的,串口每接收1字节数据,产生一个串口中断,我们在中断中将接收到的数据存放到buf中进行保存,但是数据的发送和接收都是按照帧为单位进行传输的,因此我们要在接收数据的同时判断当前接收的数据是否是完整的一帧。一般串口完整数据帧的定义:帧头(2字节,例如AA、BB) + 数据长度(2字节) + 数据+ CRC16校验(2字节) + 帧尾(2字节)帧头、帧尾表示一帧数据的开始和结尾,数据长度表示当前数据帧中负载数据大小,CRC16校...
2020-06-25 20:08:07 56494 14
原创 使用SSH协议在PC和开发板之间进行文件传输
在嵌入式开发中常需要电脑和嵌入式开发板之间进行远程访问和文件传输,SSH协议就是一个很好的选择。使用SSH协议访问嵌入式开发板,PC端需要安装SSH 客户端,ubuntu自带SSH 客户端,当然也可以使用以下命令进行安装:sudo apt install openssh-client1. 使用SSH协议在PC端远程访问嵌入式开发板。在PC 端命令行界面输入命令: ssh root@192.168.1.110 其中root是嵌入式开发板的用户名,一般是root, 192.16...
2020-06-23 22:05:01 2968
原创 MQTT协议研究
MQTT协议是轻量级的以太网数据交换协议,在物联网中应用越来越广泛,本文简要介绍MQTT协议的相关知识点。1. MQTT协议简介:MQTT是一个基于客户端-服务器的消息发布/订阅传输协议。MQTT协议是轻量、简单、开放和易于实现的,这些特点使它适用范围非常广泛。在很多情况下,包括受限的环境中,如:机器与机器(M2M)通信和物联网(IoT)。2. MQTT协议特点: 1.使用的发布/订阅消息模式,提供了一对多消息分发。 2.对传输消息有三种服务质量(QoS): ...
2020-06-22 20:38:49 490
原创 以太网数据包长度限制
我们使用以太网进行数据传输(UDP、TCP),数据包的大小是有限制的,并不是多长都可以。TCP/IP协议从下到上包含:链路层、IP层、传输层、应用层。链路层:链路层的数据交互是基于数据帧, 一帧数据包的最大长度1518(以太网帧最大长度)-18(以太网帧头帧尾) = 1500字节。IP层:由于链路层的数据帧最大为1500,所以该层的最大数据包长度为1500-20(IP包首部)=1480字节。传输层:如果禁止IP层进行数据分包传输:对于TCP数据包最大长度1480-20(TCP
2020-06-21 19:13:10 15496
原创 C++、C语言运算符优先级
C、C++ 运算符优先级:1. 首先相同优先级的运算符按照结合方向进行匹配,除了特殊的三种运算符从右至左进行匹配外,其余的都按照从左至右进行匹配,这三种特殊的运算符是双目运算符中的赋值运算符(= 、+=、-=、%=、*=、/=、&=、^=、|=、<<=、>>=)、三目运算符中的条件运算符(?:)、所有的单目运算符(+、-、++、--、*、&、!、~、(type)、sizeof).2. 不同优先级运算符匹配 2.1 规律总结指针成员及括号运算...
2020-06-19 21:10:59 1337
原创 C标准库常用头文件及函数总结
本文我们总结一下C标准库常用的接口头文件及函数,包含C99和C11标准。1. 断言 assert.h (程序错误检测)void assert(int exprs) 如果exprs表达式为真,则什么也不做,如果exprs表达式为假,则编译器显示表达式所在的文件名和行号,然后打断程序执行。2. ctype.h(字符类型判断)int isalnum(int c) 如果c 是字母或数字,返回真。int isalpha(int c)如果c是字母,返回真。int isdigit(int c...
2020-06-14 09:06:25 1110
原创 C语言内存对齐规则
为什么要内存对齐,内存对齐的根本原因是由于处理器访问内存的方式决定的,以ARM 32位处理器为例,地址总线为32位,处理器访问的内存地址只能是4的倍数,如果一个int 类型的变量占用内存地址0、1、2、3字节空间,则处理器从0地址一次就可将数据去除,如果该int类型从地址空间2开始存储,占内存地址2、3、4、5字节空间,则处理器需要先访问0地址空间取出数据的高8位,再访问4地址空间取出数据的低8位,让后再将高低位数据组合在一起,这样的话处理器的效率就慢了一倍。因此我们在定义变量使用时,编译器会自动使分配的变
2020-06-14 07:35:42 1239
原创 STM32串口printf函数重定向
在进行MCU处理器的程序调试时,免不了需要使用串口打印调试信息到PC端进行程序代码运行状态的追踪监视,使用串口自身的发送函数进行输出打印,难免不是很灵活,一般情况下对printf函数进行重定向,打印调试信息。printf函数是由C语言标准库实现的,使用时需要包含头文件include <stdio.h>,在C语言标准库中定义了三类终端,stdin,stdout,stderr,其中printf默认输出数据到stdout终端中,我门可以通过修改printf底层函数fputc(),来使printf函
2020-06-08 07:12:07 1211 1
原创 ubuntu 下编译QT5
嵌入式开发中ARM+LINUX+QT对于有显示需求的项目而言是标准配置,本文介绍使用ubuntu编译QT5,并配置Qt Creator开发环境,并移植QT库到ARM开发板(注意:针对电容屏,是不需要编译tslib库的,同时如果Qt源码版本高于等于Qt5.0 即使是电阻屏,也不需要编译tslib库,因为自Qt5.0以后,源码中已经集成了tslib)。1. 下载QT 源码http://download.qt-project.org/archive/qt/5.14/5.14.2/在该网址下下载q...
2020-05-31 21:03:50 3091
原创 从零开始搭建STM32开发环境
STM32处理器是目前市面上比较流行同时性价比很高的一款MCU,本文开始介绍基于STM32的程序开发知识。STM32开发的第一步:搭建开发环境(安装MDK5(keil)、串口调试驱动、JLINK驱动),其中MDK 5用于工程代码的编辑编译,串口驱动用于PC端查看程序输出打印,JLINK驱动用于使用jlink烧写器下载工程代码到MCU。STM32开发的第二步: 在MDK下创建一个最简工程,可以编译通过,无警告,无错误。(STM32 驱动的开发分为直接配置外设寄存器和使用驱动函数库两种方式,其中使用驱动
2020-05-31 17:30:10 2886
原创 LINUX编译过程中常见问题
1. 安装arm-linux-gcc工具链后,明明已经再/etc/profile中添加安装路径,运行arm-linux-gcc -v 系统提示找不到arm-linux-gcc解决方法:apt-get install libc6-dev-i386 安装完这个包后,就可以了2.error while loading shared libraries: libz.so.1: cannot open shared object file: No such file or directory解决方法...
2020-05-31 14:55:19 268
原创 嵌入式Linux开发使用NFS挂载根文件系统
嵌入式Linux开发包含uboot(启动程序类似与windows中的BIOS)、kernel(内核)、根文件系统、各种应用程序几个部分,这几个部分的关系是开机上电后uboot初始化网络、串口、FLASH等驱动,加载系统参数或设备树文件到指定内存区域,为kernel的运行准备相关工作环境,最后加载kernel到内存,启动linux内核的运行。linux内核中包含了linux系统的各个相关功能,例如设备驱动、进程管理、内存管理、以太网协议栈等,kernel运行起来后会到根文件系统中查找/sbin/init应用程
2020-05-31 12:24:03 1028
原创 C语言标准库glibc
基础知识:LINUX下动态库加载相关知识在LINUX 系统/etc 目录下有三个与动态库加载相关的文件,分别是ld.so.conf、ld.so.conf.d、ld.so.cache.其中ld.so.conf中记录了程序在运行过程中需要加载的动态链接库(后缀名为.so的文件)的路径,默认情况下/lib路径和/usr/lib路径下的动态链接库会直接被包含到系统的搜索路径中,也就是说只要把动态库放到这两个目录中的任何一个,应用程序就可以直接调用,但是如果所有的动态库都放到这两个路径中,就会看起来很乱,而且
2020-05-24 09:01:39 1542
原创 ubuntu虚拟机网络配置同时连接WIFI上外网和连接以太网与ARM开发板通信
再学习ARM嵌入式开发过程中,需要再ubuntu虚拟机下进行程序编写开发编译,一般需要使用网线直连ARM开发板,或挂载NFS网络文件系统,或 通过SSH 、TFTP等网络协议传输在PC端编译完的二进制文件,另一方面又需要使用ubuntu虚拟机连接外网,用来下载一些依赖包或者编辑工具链等,本文介绍一种方法,使得ubuntu虚拟机既可以连接WIFI上外网,又可以连接ARM开发板满足开发要求。1. ...
2020-03-27 21:22:12 3579 3
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人