自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(80)
  • 收藏
  • 关注

原创 串口通讯

USART是全双工同步通讯在同步通信中,数据信号所传输的内容绝大多数属于有效数据,而异步通信中包含了各种帧的标识符,所以同步通讯的效率更高。但是同步通信对时钟要求苛刻,允许的误差小。而异步通信则允许双方的误差较大。

2023-08-19 17:11:11 128

原创 Cmake

cmake常用指令

2022-08-25 15:26:06 227 1

原创 git/GitFlow使用

给master配备一个develop分支,在本地新建空的develop分支,以后以develop为父分支,推送到服务器。HEAD默认指向分支名。

2022-07-25 18:21:05 162

原创 进程间的通信方式简单介绍 interprocess communication(IPC)

当有一个较复杂的工作,一个进程完成不了的时候,需要多个进程共同完成,涉及到进程之间的通信,主要涉及以下四个功能数据怎么传输资源怎么共享事件互相通知进程之间的控制Linux系统下IPC早起Unix下的IPC管道:完成数据传输信号:完成时间通知功能FIFO:完成数据传输功能system-v ipc(属于Unix的分支(贝尔实验室),是在早起Unix系统不断优化得来的)system-v 消息队列:完成消息传输、进程控制功能system-v 信号量:完成资源共享、进程控制功能

2022-02-17 16:43:38 445

原创 僵尸进程和托孤进程

一个进程正常退出应该遵循以下步骤:子进程调用exit()函数退出进程父进程调用wait函数获取子进程的退出状态,并且把子进程占用的进程控制块销毁掉僵尸进程子进程调用了exit函数,但是父进程没有调用wait函数,没有为子进程处理“身后事”。子进程死掉了但是父进程不知道,子进程变成僵尸进程#include <stdio.h>#include <stdlib.h>#include <unistd.h>int main(){ pid_t result

2022-02-17 16:23:39 151

原创 ps命令详解

常见的扩展选项auxa:显示一个终端所有的进程u:显示进程的归属用户及内存使用情况x:显示没有关联控制终端的进程axjfj:显示进程归属的进程组id、会话id、父进程idf:以ascii的形式显示出进程的层次关系举例auxUSER:进程是哪个用户产生的PID:进程的身份证号码%CPU:指进程对CPU的占用率%MEM:进程占用内存的百分比VSZ:进程使用虚拟内存的大小RSS:进程使用物理内存的大小TTY:进程关联的终端STAT:进程当前状态

2022-02-17 15:53:44 4400

原创 守护 进程

会话是来管理前后台进程组,会话一般关联着一个终端。当退出这个终端,会话也随之关闭,那么会话管理的前后台进程组也会被关闭。关闭终端后会话中所有的进程组都会被关闭守护进程不受终端影响,即使关闭终端也可以继续在后台运行写一个守护进程创建一个子进程,让父进程直接退出(通过fork()函数实现)创建一个新的会话,摆脱终端影响(通过setsid()函数实现)改变守护进程当前的工作目录,在创建子进程的时候它的工作目录是继承了父进程的(通过chrdir()函数实现)重设文件权限掩码,(通过umask()

2022-02-17 14:53:17 457

原创 进程管理_进程组、会话、终端

1、进程组对相同类型的进程管理进程组的诞生在shell里直接执行一个应用程序,执行shell就相当于创建一个进程,顺便创建了一个进程组,对于应用程序来说,他们自己就是进程组的首进程如果进程调用了fork函数,那么父子进程同属于一个进程组,父进程是首进程在shell中通过管道执行连接起来的应用程序,两个程序同属于一个进程组,第一个程序为进程组的首进程进程组首进程作用:作为进程组的pid,叫做pgid,等于进程组首进程的pid2、会话管理进程组,主要两大类进程组:前台进程组会话的诞生调

2022-02-17 11:49:45 557

原创 进程生老病死

在调用fork函数时候,子进程就处于就绪态了,通过调度器切换进程之间的各种状态(来自野火Linux教学视频),这六种状态是通过宏定义的进程状态TASK_RUNNING //就绪/运行状态TASK_INTERRUPTIBLE //可中断睡眠状态TASK_UNINTERRUPTIBLE //不可可中断睡眠状态TASK_TRACED //调试态TASK_STOPPED //暂停状态EXIT_ZOMBIE //僵尸状态EXIT_DEAD //死亡态...

2022-02-15 12:44:13 233

原创 进程的退出

一个进程退出的时候,需要把退出状态报告给父进程,父进程通过调用wait函数会一直等待子进程退出,父进程也是用过wait函数获取子进程退出状态的wait函数头文件#include <sys/wait.h>函数原型pid_t wait(int *status)//这个形参配合宏使用返回值成功:退出子进程的pid失败:-1处理子进程退出状态的宏WIFEXITED(status),如果 子进程正常退出那么该宏为真WEXITSTATUS(status):如果子进程正常退出,该

2022-02-14 22:50:23 441

原创 进程 退出

exit(0)_exit(0)进程退出#include <stdio.h>#include <unistd.h>#include <stdlib.h>int main(){ pid_t result; result = fork(); if (result == -1) { printf("fork error\r\n"); } if (result == 0) { .

2022-02-14 22:20:04 267

原创 创建一个进程

fork函数头文件#include <unistd.h>函数原型pid_t fork(void);返回值成功:正整数失败:-1fork函数特征fork函数执行之后会返回两次,在初始进程中执行fork函数后,会创建一个新的进程,而且这个新的进程会几乎复制旧进程的所有东西,为什么是几乎呢?在执行fork函数之前操作系统只有一个进程,那fork之前的代码就只会执行一遍。调用fork函数之后,产生新进程,会把fork函数之后的代码复制一遍,所以fork之后的代码才会执行两次。

2022-02-14 21:35:52 297

原创 进程了解入门

首先明白程序是怎么运行的,保存在flash中的程序会被调入内存,在被执行进程通过pstree可以查看进程之间的关系,是树状的PID:进程编号,不同的应用程序有不同的PIDps -ef 查看所有进程ps -ef | more 分页显示进程...

2022-02-08 22:43:50 267

原创 标准IO函数

在系统IO函数中像read、write等频繁使用这些函数对磁盘频繁的读写操作会降低系统的性能,用户可以在自己的地盘开辟一块空间,当用户区存储了一定的数据量的时候在一起到内核去进行数据的读写,C标准库实现了这个缓存区。C标准库的IO函数和系统IO函数用法类似freadfwritefseekfclosefopenfflush:和sync很类似,强制将IO缓存区的数据写到页缓存区当使用标准IO编程时,buff中的内容就不能写到也缓存区...

2022-02-08 22:27:08 168

原创 lseek和sync函数

lseek函数功能: 设置文件读写位置头文件#include <unistd.h>函数原型/** 操作文件的文件描述符* 偏移量* 偏移量的基准点* * 所以实际的读写位置是基准点 + 偏移量的值off_t lseek(int fd, off_t offset, int whence)如果whence = SEEK_SET,基准点是文件开头如果whence = SEEK_CUR,基准点是文件当前位置如果whence = SEEK_END,基准点是文件末尾返回值

2022-02-08 22:03:41 405

原创 read_write函数

read 函数包含头文件#include <unistd.h>函数原型/** 文件描述符* 想要读取文件内容的buffer地址* 要读取的文件字节数量*/ssize_t read(int fd, void* buff, size_t count);返回值count:成功读取全部字节0~count:说明要读取的文件数小于count字节数,或者在读取期间被异步信号打断-1:失败write函数包含头文件同read函数函数原型/** 文件描述符* 想要

2022-01-18 22:46:50 497

原创 open_close函数

open头文件使用open函数需要包含#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>函数原型当文件存在时int open(const char* pathname, int flags)当文件不存在时int open(const char* pathname, int flags, int perms)返回值成功:文件描述符失败:-1close头文

2022-01-17 23:07:01 652

原创 系统/标准IO编程

系统IO编程open:打开文件write:写文件read:读文件lseek:设置文件读写位置close:关闭文件伪代码:int fd; //定义一个文件描述符/*文件名, 打开文件的模式, 设置文件权限*/fd = open(filename, flag, mode); //打开文件,会返回一个文件描述符/*文件描述符, 读写位置的偏移量, 文件读写位置的基准值*/lseek(fd, offset, whence);//设置好这个才能对文件进行读写操作/*文件描述符,写入文件的内

2022-01-12 21:58:42 147

原创 Linux,一切皆文件

Linux内核屏蔽硬件区别,把所有的硬件设备抽象成文件,提供统一的接口供用户使用,这就涉及到虚拟文件系统虚拟文件系统抽象层,对文件的访问实际上是对抽象层的访问,虚拟文件系统包括几个抽象对象,抽象对象就封装了底层的读写细节,使用C语言的多态实现具体文件系统的读写接口虚拟文件系统比较重要的抽象对象(VFS,virtual file system)super_block:表示具体的文件系统,当系统中增加新的文件系统的时候,就需要增加一个super_block对象来管理文件系统inode:具体的文件i

2022-01-11 22:06:15 243

原创 Makefile语法+简单应用

make工具make工具:找出修改过的文件,根据依赖关系,找出受影响的相关文件,然后单独编译这些文件Makefile文件:记录依赖关系和编译规则Makefile三要素:目标、依赖、命令目标:依赖文件或者其他文件 命令1 命令2 命令3使用make命令之后,到当前目录寻找Makefile文件,然后找到第一个要执行的目标,由于targeta依赖于targetb和targetc,所以先去执行b、c目标对应的命令,等到targeta依赖目标命令执行完之后才能执行targetamake + 目标:

2022-01-10 22:39:13 471

原创 本地编译与交叉编译

比如在X86架构的PC机上编译一个程序,在X86平台运行,这就叫本地编译在X86架构编译在ARM平台运行,这就叫交叉编译(单片机)一句话:编译工具链与目标程序的运行是否在相同的架构平台有本地编译为什么还要交叉编译?编译程序是很复杂的工作,对CPU的运算能力要求较高,需要较大的磁盘空间。对于常用的ARM平台,满足不了安装编译器的条件,特别是MCU(单片机),根本就没办法安装编译器,只能用PC机去编译。ARM-GCC和GCCARM-GCC针对ARM平台的一款编译器,它只是GCC编译器的一个分支。寻

2022-01-05 22:29:35 1299

原创 helloWord执行过程

GCC由来是由GNU组织编写,对抗商业收费的软件GCC编译工具链C语言整个编译过程可以分为四个阶段预处理阶段、编译阶段——GCC编译器汇编阶段、链接阶段——binutils工具链运行helloWordgcc helloword.c -o hellohello.c 的文件执行变为hello.i的文件(hello.c预处理之后的文件,头文件包含,条件编译、宏定义等)hello.i编译成hello.s的文件(hello.s是汇编文件。通过词法分析、语法分析就能编译成汇编文件了)hell

2021-12-28 18:38:32 615

原创 shell基本语法

变量赋值首先使用shell变量要指定一个解析器一般默认为跟目录下的bin下的bash,用$符号使用这个变量三种情况:只适用于没有空格或者制表符的时候var=123适用于不连续的字符,单引号所见即所得var='123 789'适用于不连续的字符,以及可以使用$符使用这个变量var="123"在使用$符解出变量时,最好加上大括号 $ {……}命令赋值给变量1、打印命令使用反引号var=`pwd`echo "$var"$符+()var=$(pw

2021-12-21 22:37:30 271

原创 Linux命令

shell是什么shell就是一个Linux系统的应用程序,是用户和Linux内核沟通的桥梁。对外接受用户输入的命令对内通过系统调用传递给内核运行最后呈现出运行结果shell操作以键盘为主,需要记住各种命令Linux常用命令查询命令man printf //告诉你一个尽可能详细的命令用法cd -- help //告诉你主要的命令用法目录操作类cd / //进入根目录cd ~ //进入家目录pwd //打印当前目录ls //列出当前目录下的文件,ls -a //打印出所

2021-12-12 22:38:17 292

原创 对FSMC地址非对齐访问支持的理解

HADDRHADDR是来自AHB总线上地址线,是字节地址。连接到FSMC_A[25:0],再连接到外部的存储器,地址线首先明确一点,26根地址线,它是26个位。它的寻址空间或者寻址容量是2^26,单位是Byte。HADDR是字节地址,说明地址线每变一条,就对应着一个字节的地址:8位。FSMC_A[25:0]和HADDR[25:0]的联系正常情况下,FSMC_A和HADDR是pin对pin连接的,如果访问的SRAM数据宽度是8位,就正好很匹配。如果SRAM的数据宽度是16位的SRAM(案例来自野火

2021-12-07 11:17:39 981

原创 FSMC——扩展外部的SRAM

SRAM:静态随机存取存储器,易失性存储器,读写速度非常快,适合做内存SRAM的引脚图:A是地址线、IO是数据线,就是通过地址去访问数据整个芯片的内部架构芯片是通过地址译码器来寻址,找到要访问的存储器矩阵的地址,然后通过IO数据电路去访问SRAM信号线A0~A8:信号线,用来寻址IO8~IO15:数据线,用作读出或者写入数据CS1和CS2:同样的功能UB和LB后面介绍SRAM存储矩阵RAM通过行地址和列地址,来找到某一个单元,但是SRAM没那么复杂,只需要行地址就能找到对应的单元

2021-12-06 17:19:14 4512

原创 P型半导体、N型半导体、PN结

N型半导体N型半导体是添加+5价的P元素,参一个P原子就多一个自由电子,多子是自由电子,少子是空穴。在N型半导体中多子是自由电子,带负电,这是N型半导体的由来:negativeP型半导体P型半导体参入+3价的B元素,每参一个B就多一个空穴,空穴就成多数载流子,自由电子成了少子,所以叫P型半导体,positive...

2021-12-01 22:07:20 4585

原创 惠斯通电桥分析

惠斯通电桥是干嘛的这是一种能精确测量电阻的电路结构惠斯通电桥原理图,结构分析当开关闭合之后,电路中有电流流过,四边形ABCD四个电阻,每条边电桥的一个臂,BD这条线在中间像是一个桥梁,故称为电桥。R0、R1、R2 是已知电阻,RX是未知电阻,适当调节RX电阻,可以使BD两点电势差为0。此时BD边没有电流流过,这个状态叫电桥平衡。所以AB之间的电势差 = AD之间的电势差、BC的电压等于DC的电压。此时Rx x I1 = R1 x I2;R0 x I1 = R2 x I2,有R1/Rx = R2/

2021-10-09 23:58:07 3628

原创 多普勒雷达原理

多普勒效应波的波长会随着波源(观察者)的运动而变化,生活中的例子:迎面驶来的汽车声音尖锐、离去的汽车声音低沉多普勒雷达基于多普勒效应,脉冲式的多普勒雷达(pulse-doppler radar,简称PD)发射固定频率的脉冲波对空扫描时,如遇到活动目标,回波的频率与发射波的频率出现频率差,也就是多普勒频移,根据频移的大小可测出目标对雷达的径向相对运动速度;根据发射脉冲和接收的时间差,可以测出目标的距离。...

2021-09-22 17:34:07 2547

原创 推挽输出、开漏输出

推挽输出推挽输出就是有两个MOS管,在某一时刻,只能有一个导通,可以做到的就是可以输出高电平 或者 低电平开漏输出开楼输出和推挽输出的区别就是,上边的PMOS管去掉了,所以呢,开漏输出要么表现出低电平、要么表现出高阻态,如果想输出高电平,就滴外接上拉电阻。...

2021-09-18 17:45:57 177

原创 RS——485通讯协议

1、RS485通讯实验简介RS485是一种工业控制环境中 常用的通讯协议,它具有抗干扰能力强、传输距离远的特点。485协议又232协议改进而来,协议层不变,只改进了物理层,因而保留了串口通讯协议应用简单的特点。看图就知道了,和CAN有点像,也是差分线传递的2、RS485物理层差分信号具有很强的抗干扰能力,特别适合应用于电磁环境。RS485通讯网络的打传输距离是1200米,总线上可挂载128个通讯结点,由于RS485网络只有一对差分信号线,它使用差分信号来表发逻辑,当电压差为-6~-2V时表示0,

2021-09-13 22:50:58 4697

原创 文件操作

对文件进行操作有三个头文件istream 输入流ostream 输出流fstream 文件流,有前两个的功能写文件,操作步骤包含头文件#include <fstream>创建流对象fstream fs;打开文件fs.open("文件路径", 打开方式);写数据fs << "写入的数据";关闭文件fs.close();这里的fs是文件读写的通用类名,对于写文件也可以用ofstream文件的打开方式读文件读文件与写文件类似,再打开文件步骤要检查

2021-08-24 21:17:29 101

原创 纯虚函数与抽象类

在多态中,通常父类中的虚函数是毫无意义的,主要实现都在子函数的重写函数里,所以就能把父类中的虚函数写成纯虚函数当类中有了纯虚函数,这个类就叫抽象类抽象类的写法也很好写,不写函数大括号,直接在最后写上 = 0;抽象类的哇特点:抽象类无法实例化对象子类必须重写父类的虚函数,否则子类也属于抽象类上代码:父类中有纯虚函数,子类继承,子类也属于纯虚函数,不可实例化对象在看重写show函数(返回值相同,函数名相同,形参列表相同,void就是没有),所以子类实例化对象就不报错了...

2021-08-23 21:48:29 95

原创 菱形继承和c++开发人员命令提示工具的使用

菱形继承的问题菱形继承问题出现在多个子类继承父类的时候,将父类的数据一分为二,问题是在子类又出现了多继承的问题。被一分为二的属性又重新被赋值给了一个子类,本应该就是一份数据,这时确出现了两份,见如下案例#include <iostream>using namespace std;//菱形继承问题//羊和驼都继承了动物类,动物中的Age属性被一分为二//羊驼是羊和驼的后代,子类多继承了父类,对于羊驼来说Age属性发生冲突class Animal{public: int Ag

2021-08-23 21:27:51 96

原创 绘图事件paintEvent

绘图事件不用手动调用,通过重写父类虚函数之后会自动调用绘图基本设置,要有画家——画家类可以设置画笔,比如画笔颜色和线条样式可以设置画刷,可以对封闭图形进行涂刷。画刷的颜色,和画刷的样式设置完画笔之后,不要忘了,要把这个对象传入画家,才能画出美丽的图形重写父类虚函数,防止写错,加上override//画图事件void paintEvent(QPaintEvent *event) override;主要代码,可以实现画线、矩形、椭圆、圆、文字、等基本图案//绘图事件,也不用手动调用,系统.

2021-07-25 19:07:24 5441 1

原创 定时器事件TimerEvent

定时器1使用定时器:打开定时器。规定间隔时间,单位是毫秒,意思就是每隔一个时间就会去执行定时器事件的函数,并且每个定时器都有唯一的ID标识,这样就可以设置多个定时器了重写父类的虚函数,定时器函数,最好加上override,防止函数名写错定时器的参数可以判断定时器的ID号,从而知道是那个定时器调用的函数。Widget::Widget(QWidget *parent) : QWidget(parent) , ui(new Ui::Widget){ ui->setup

2021-07-20 22:51:06 1587

原创 鼠标事件~

Qt中的鼠标事件包括鼠标进入离开事件(进入离开检测)鼠标左中右键按下松开检测事件鼠标单击/双击事件一般以event结尾这些可以配合自定义封装的控件使用,通过提升为的方式,去调用如代码所示:自定义类MyLable,继承与QLabel,因为在主窗口中封装在一个Label标签中class MyLable : public QLabel{ Q_OBJECTpublic: explicit MyLable(QWidget *parent = nullptr); //鼠标

2021-07-19 12:50:23 74

原创 自定义控件封装(提升为)

自定义控件就是自己定义并封装的控件比如在主窗口中封装一个区域,要显示封装的内容,要新建一个Qt设计师界面类,自己定义的类,可以继承widget,然后在这个类的UI界面去设计。关键点:在新的类UI界面设计好之后,如果想显示到主窗口,主窗口显示区域的空间必须做提升为的操作,提升类为自定义的类名如图所示:在类:Mysmallwidget的UI界面拖拽如下控件要显示要widget的UI窗口,就必须吧widget的显示区域,提升为自定义的类名,运行就会显示到这个区域了。另外在主窗口中可以调用要提升控件

2021-07-19 09:27:45 153

原创 一些控件按钮的使用

工具按钮——ToolButton添加图片和文字拖一个ToolButton按钮,前提是添加资源文件,添加几张图片,在Icon这选择添加的组员图片,附上text文本,还可以调整宽度和高度ToolButton属性按钮自身,这个沟能够让按钮变透明。单选按钮选中按钮之后要知道选中的是什么,信号和槽实现。、connect(ui->radioButton, &QRadioButton::clicked, this, [=](){ qDebug() << "点击了方案

2021-07-11 18:14:04 115

原创 系统对话框——消息、字体、颜色等

information:消息对话框指的是弹出额选择对话框:(比如确定还是取消)QMessageBox::information(this, "标题", "提示信息",QMessageBox::Ok | QMessageBox::Cancel, QMessageBox::Ok);既然是选择的对话框,自然有返回值,返回单击的按钮标识判断返回值:if (QMessageBox::Ok == QMessageBox::information(this, "标题", "提示信息",QMessageBox:

2021-06-23 21:11:08 142

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除