自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 LINUX-线程

进程是内存资源分配的基本单位,cpu调度是以线程为单位;线程:是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。线程上下文主要包括PC指针、栈指针等。分类用户级线程:由用户态的线程库(如POSIX线程库pthread)来管理。线程切换不需要内核参与,效率高但缺乏系统级别的保护。内核级线程:由操作系统内核直接支持和管理。线程切换需要内核参与,但可以获得系统级别的保护和调度。Linux中的实现:Linux实际上是将进程控制块(PCB)和线程控制块合并,通过。

2024-09-27 17:51:13 970

原创 linux-IO-进程-线程(相关函数)

错误处理:是一个全局变量(在大多数实现中),用于报告系统调用的错误。当系统调用(如文件操作、内存分配等)失败时,会被设置为一个特定的错误码,以指示发生了什么类型的错误。的定义位于(或在某些系统上)头文件中。注意:由于是全局的,它可能会被多个线程同时访问,因此在多线程程序中需要特别注意其线程安全性。许多现代系统提供了线程局部存储(TLS)版本的,以避免这种问题。使用示例:函数用于打印一条描述最近发生的错误的消息到标准错误(stderr)。它会自动使用的值来确定要打印的错误消息。的原型定义在头文件中。使用示例:

2024-09-13 16:15:21 1326

原创 数据结构-

Dijkstra算法从一个源点开始,逐步找到该源点到其他所有顶点的最短路径。算法使用了一个优先队列(通常是最小堆)来存储待处理的顶点,以及一个距离数组来记录从源点到图中每个顶点的当前最短估计距离。

2024-08-31 13:21:38 903

原创 Shell脚本

首行/bin/bash这是脚本的解释器指示,告诉系统使用bash解释器来运行脚本。性质: Shell 脚本是一种解释性语言,脚本中的命令由 Shell 逐行解释和执行,而不是编译成二进制代码。后缀.sh(虽然后缀不是强制要求,但它有助于标识文件类型)定义和使用注意事项赋值时: 等号两侧不能有空格,例如val=123。变量引用123:没有格式。'123':字符串常量,不解析变量。"123":可以解析变量,使用${}语法引用变量值。删除变量unset val局部变量local val命令替换。

2024-08-22 09:48:54 843

原创 stm32

在通信协议中,不同的设备或传感器可能采用不同的时序和通信方式来进行数据交换。

2024-08-21 08:34:11 1151

原创 linux操作系统命令-文件系统-用户系统-网络-磁盘-进程-常用特殊字符-重定向-内核作用

-选项][参数];

2024-08-20 20:24:15 1057

原创 git-版本管理工具基本操作-创建仓库-拉取-推送-暂存库-版本库

在命令行输出两行指令配置git才能克隆:username:gitee账号名useremail:gitee账号绑定的邮箱。

2024-08-19 20:25:39 746

原创 STM32-定时器-定时器中断-PWM调光

比较寄存器用于存储一个预设的值,这个值通常是用户根据需要设定的。当定时器或计数器接收到时钟信号(可以是内部时钟或外部输入信号)并开始计数时,其内部的计数器寄存器会不断递增或递减。当计数器寄存器的值达到与比较寄存器中预设的值相匹配时,定时器或计数器会触发一个中断或事件,以通知CPU或相关硬件执行特定的操作。

2024-08-13 19:54:11 1149

原创 STM32-外部中断-AFIO-串口-串口通信-串口中断(空闲中断和接收中断)-printf移植-ADC数模转换-初始化和读取光敏电阻AO

通过对数据进行封装,形成数据协议;

2024-08-13 10:02:16 1015

原创 STM32F103-固件库开发-keil一些警告解决-中断机制-NVIC-简单按钮电灯流程及其代码;

选择GPIO端口和引脚:确定要配置的GPIO端口(如GPIOA、GPIOB等)和具体的引脚号。配置MODER寄存器:通过写入MODER寄存器来设置GPIO引脚的模式。每个引脚的模式由MODER寄存器中的两位决定,这些位可以设置为输入模式、输出模式、复用功能模式或模拟模式等。配置其他相关寄存器(如果需要):根据所选模式,可能需要配置其他寄存器,如输出速度寄存器(OSPEEDR)、上拉/下拉寄存器(PUPDR)、复用功能选择寄存器(AFRx)等。启用GPIO时钟。

2024-08-08 19:28:02 773

原创 STM32-门电路-储存器-寄存器-STM32f1-MCU-GPIO-总线-keil5-点led-寄存器编程

系统总线是一个单独的计算机总线,用于连接计算机系统的主要组件,如CPU、内存和输入输出接口等。数据传输:通过数据总线(Data Bus,DB)实现CPU与存储器、输入输出接口等部件之间的数据交换。地址指定:通过地址总线(Address Bus,AB)确定数据传输的目的地,即指定CPU访问的存储单元或外设的地址。控制信号传输:通过控制总线(Control Bus,CB)传输各种控制信号和时序信号,协调各部件之间的操作。

2024-08-07 20:42:37 815

原创 linux-信号-信号产生时机-更改信号默认行为signal-sigaction-sa_mask-raise-alarm信号-时钟getitimer-setitimer

当三个信号(非实时信号)要进入pending,第一个信号会被pending存储,pending标识1,当第二第三信号要进入pending,由于pending是位图,只能标识1个信号,所以后面的信号丢失;当信号递送时进入回调函数,如果在函数运行过程中,也就是递送没有结束时,标准输入流的数据会被留在输入缓冲区,等到递送完成后重启的系统调用使用该数据;当进程递送信号A,把信号A本身加入mask,之后有A信号产生;mask:阻塞集合;产生信号(来源)-------时间(可变)---------递送信号(目标进程)

2024-07-23 15:29:43 622

原创 linux-二元信号量和计数信号量-生产者消费者模型以及用二元信号量实现-死锁(2)-侠义消息队列(fifo)-proc文件系统

二元信号量和计数信号量在嵌入式系统和多任务环境中都是重要的同步机制,用于控制对共享资源的访问。

2024-07-19 13:18:35 845

原创 linux-共享内存-shmget-shmat-shmctl-shmdt-物理内存虚拟内存转换-页表-页框-分级页表(局部性原理)-信号量(计数二元)semget-semctl-semop-time;

定义:信号量是一种取值为整数的变量,表示可用的临界资源数目或等待资源的进程数。进程通过调用PV原语(即Wait和Signal操作,也称为P操作和V操作)来改变信号量的值,从而实现对进程间同步或互斥的控制。类型整型信号量:信号量是整数,用于记录资源的数量或等待的进程数。记录型信号量:除了整数值外,还包含一个进程等待队列,用于记录阻塞在该信号量上的各个进程的标识。二进制信号量:只允许信号量取0或1值,常用于实现互斥锁。timeval:用于表示时间。// 秒数// 微秒数timezone。

2024-07-18 17:17:57 1146

原创 Linux-进程间通信-管道-有名管道-匿名管道(父子进程popen,pipe)-基于阻塞的同步-共享内存(system V(命令:)(函数:shmget)(shmat)(shmdt)(ipcrm))

IPC(Inter-Process Communication,进程间通信)是操作系统中多个进程或线程间进行数据交换或通信的机制。IPC的参数宏主要用于控制IPC对象的创建、访问、删除等操作。

2024-07-17 11:18:35 828

原创 linux-进程权限-system启动多进程-fork系统调用-exec函数族-wait回收资源-waitpid-进程终止-进程组-会话-守护进程-进程间通信-popen

进程:正在运行的程序(操作系统分配资源的基本单位)程序·:程序(Program)是计算机系统的必备元素,是计算机能识别和执行的指令集合;操作系统管理进程,把task_struct(任务描述符:进程的所有信息),放入双向链表(任务队列),任务队列由操作系统内核管理;uid(用户ID)、euid(有效用户ID)、gid(组ID)和egid(有效组ID)是核心概念,它们与进程执行时的权限级别紧密相关。此外,sticky(粘滞位)是一个与目录权限相关的特殊权限标志,用于控制目录中文件的删除权限。

2024-07-15 16:56:46 550

原创 linux-虚拟内存-虚拟cpu-进程pid-ps命令-进程权限-进程相关命令-优先级系统-分时任务

计算机中的程序关于某数据集合上的一次运行活动。

2024-07-07 18:24:25 931 1

原创 Linux-select同时监听读写-ulimit-select的原理-select的调用流程-select设置超时;

mmap实现的细节与 DMA 的使用是分开的。当通过mmap访问映射的文件或设备时,数据可能通过传统的 I/O 路径(涉及 CPU、内存和 I/O 控制器)进行传输,也可能在某些情况下使用 DMA 来优化性能。但是,这种优化是由操作系统和硬件共同决定的,而不是由mmap系统调用直接控制的。DMA(Direct Memory Access),即直接存储器访问,是一种在计算机系统中允许某些硬件子系统与主存储器(RAM)进行直接数据传输的技术,而无需通过中央处理器(CPU)的干预。

2024-06-29 22:25:40 1095 1

原创 linux-内存映射MMAP-lseek-dup-fifo-通信-IO多路复用

让newfd与oldfd指向同一个文件对象;如果newfd已有指向就会自动close;通过把dup2把标准输出的文件描述符改成savefd,再把标准输出的屏幕对象改成文件对象,最后再改回来,把屏幕定向到文件,再恢复;

2024-06-28 23:25:10 1107

原创 关于read,write,open时出现的文本文件和二进制文件读写的问题(怎么写入怎么读)

使用read读取文本文件,一般采用字符空间作为缓存,最后输出;使用read读取二进制文件,这里采用整数读取的展示:首先创建文本文件,用write写入i的值到文件中;再通过lseek改变读写一个文件时的读写指针位置,用SEEK_SET把指针设置回起始位置;然后再次把读取到的数据写入整型变量a的地址,直接%d输出。问题1:为什么文本文件要用字符数组,而二进制文件要用变量名的地址呢。问题2:在打开文件对象时,文件是什么格式传输的。问题3:可以通用转化read吗,这样会不会有些麻烦?

2024-06-23 14:10:41 1072

原创 Linux-cp命令实现-系统调用和函数区别-文件截断-文件空洞

在UNIX文件系统中,文件位移量(offset)可以大于文件的当前长度。当对这样的文件进行写操作时,文件会被“撑大”,并在文件中构成一个空洞(hole)。空洞是文件中没有实际写入数据的部分,由重复的0表示。

2024-06-22 23:23:14 845

原创 Linux ls-al命令实现,tree命令实现,不带缓存的文件IO(open,read,write)

stat配合目录流(目录流==链表加指针链表结点目录项dirent)opendir,closedir,readdir。const char *restrict pathname:路径(文件名和路径不完全对等,(文件名在当前目录下才对等))struct stat *restrict statbuf:被调函数通过传入传出参数给主调函数传递信息。传递信息优先用传入传出参数,返回值用于报错。getpwuid:/etc/group:把计算机时间转换为日历时间。用time_t获取时间,返回标准日历时间(带有换行的字符串

2024-06-14 19:45:46 580

原创 linux-makefile,系统编程,文件流(fopen),目录流(opendir)

可以使用反斜杠 \ 调整格式换行。

2024-04-09 19:27:06 1057

原创 指针数组复习

++p,*(++p) 表达式的值为*(p+1),副作用p自增;++*p,++(*p) 表达式的值为*p+1,副作用*p自增;(*p)++ 表达式的值为*p,副作用*p自增;指针的好处,值传递不够改变实参的值,而通过传递实参的地址,可以通过指针改变实参的值;1、指针的算数运算,当指针指向数组元素时,可以通过指针的算术运算访问数组的其他元素;*p++,*(P++) 表达式的值*p,副作用p自增;两个指针相减(指针的比较运算,两个数组指向同一数组元素)

2024-03-05 15:59:25 278

原创 51单片机—串口,led点阵屏,C51中的sfr,sbit

基于普中的stc89c52,

2024-03-02 16:06:23 892

原创 linux_gcc,库文件,gdb,

进入循环断点时,gdb会进入这个断点循环次数,所以需要用到忽略这个断点若干次多次命中循环体中的断点。

2024-03-01 21:03:36 1706

原创 ROS机器人入门

本文基于一些关于ros学习资料,对ros学习的一些笔记进行整理记录

2023-12-18 20:54:40 1595 1

原创 51单片机,LED,数码管,模块化编程,定时器,矩阵键盘

内部集成了cpu,RAM,ROM,定时器,中断系统,通讯接口,用于信息采集处理硬件设备控制;8051内核所以带了这个内核的单片机都叫51单片机(是所有兼容8031指令系统的单片机统称);

2023-12-04 21:10:05 2165

原创 c primer plus_chapter_four——字符串和格式化输入/输出

0 数值格式:用0代替空格填充字段宽度,整数格式:有- 或指定 精度,则忽略该标记,”%010d" ,,"%0.83f"%G 根据值不同,自动选择%f、%E、%E格式用于指数小于-4或者大于或等于精度时。#define a 1 //程序中所有的a都被替换成1;//40表示元素数量,char表示访问类型;

2023-11-12 21:18:06 149

原创 linux_磁盘命令,远程拷贝,vim,编译工具链SDK

遇到虚拟机异常退出,会生成配置文件,不确定文件以后是不是还要用的情况下,先改文件名,再启动虚拟机;

2023-11-12 21:14:32 305

原创 linux_链接,查找,权限,重定向,打包,正则表达式

一个点表示当前工作目录,两个点表示上一层工作目录;目录的本质:文件(该文件储存目录项,以链表的形式链接,每个结点都是目录项,创建文件相当于把目录项添加到链表中)如果想在一个目录中添加或者删除目录项,需要获取这个目录的写权限;软连接:符号链接,单独的文件里面存储了文件路径,类似于指针,指向目录;硬链接:文件以链表形式存于物理文件系统,虚拟文件系统(VFS)与物理文件系统存在一种映射,上图he目录和点目录指向同一个文件,这种映射情形叫硬链接;

2023-11-11 19:21:35 759

原创 linux-用户,用户子系统用户操作添加删除用户等,文件子系统(路径),pwd,cd等文件系统操作

内核(kernel):(管理硬件资源(cpu,内存,外部设备),文件管理,内存管理,进程调度,网络通信,硬件驱动;为上层应用软件提供一个运行环境;系统调用(system calls):内核对上层应用程序提供的接口;库函数(library routines);对系统调用进行包装(方便程序员使用);shell:(命令解析器,shell本质是一个程序,解析命令,执行命令,执行脚本(script,命令的集合))上层应用程序可以通过shell,shell访问内核完成调用;

2023-11-05 17:57:17 229 1

原创 c语言经典算法—二分查找,冒泡,选择,插入,归并,快排,堆排

工作原理:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后再从剩余未排序中继续寻找最小(大)元素,然后放到已排序序列的末尾,以此类推,直到所有元素均排序完毕;交换次数:((n-1)+(n-2)+...+1 = (n(n-1))/2)原数组逆序(比较次数,(n-1)+(n-2)+...+1 = (n(n-1))/2);(比较次数:大于交换的次数,小于(n(n-1))/2)最坏情况原数组逆序(比较次数(n-1)+(n-2)+...+1 = (n(n-1))/2)

2023-11-04 12:16:48 763

原创 编译器项目,词法加语法分析

2、运算:ADD,SUB,MUL(乘),DIV(除),MOD(取模)//,OR(或),xOR(异或),AND(与),SHL(左移),SHR(右移),IQ(等),NE(不等),LT(小于),LE(小于等于),GT(大于),GE(大于等于)以0为起始状态,通过getchar----(i)--》假设进入标识符状态,继续读n,读t,认为是标识符,遇到空格结束回到状态0,遇到等号进入赋值状态,再遇到等号进入等号状态,空格回到状态0;语义(semantic):语法背后实际的含义;以乘法表达式的规则进行匹配;

2023-10-19 18:21:42 197

原创 c语言文件处理,错误处理,文件流,缓冲,读写,错误处理

在读和写的过程中我们希望读和写是同时进行的,但是只用“wb”加fwrite读写入(序列化)加上“rb”和fread(反序列化)这样涉及到 操作系统从内核态转化到用户态的变化,导致硬件应用不合理,所以使用“wb+”进行读写,但是因为序列化已经到文件的末尾了,此时的指针指向的是字符流的末尾,反序列化的时候要思考怎么把指针移到字符流的起始位置,这就需要用到文件定位;"A"-------append,追加(不要求文件存在,如果文件存在,不会清空原文件的内容)不同操作系统表示换行不同,Linux----'\n';

2023-10-13 13:13:16 85

原创 c语言,程序生成,预处理,进程虚拟内存空间,变量,标识符,二维数组,汉诺塔,约瑟夫环,时间复杂度,指针,字符串,结构体,链表,栈,队列,哈希表,二叉树,红黑树

指针可以作为数组长度:在C和C++中,如果我们有一个指针"p"指向数组的第一个元素,并且我们知道数组中元素的类型大小,那么我们可以通过计算"p + n"来获取数组的第n个元素,其中n是数组长度。(2):根据索引查找值,(O(n),平均遍历n/4个元素,单链表平均遍历n/2)//双链表记录索引值,比中间值大就逆序遍历,小则顺序遍历;先比较两个链表的第一个元素确定第一个位置,再把第二个元素和另一个链表的下一个元素或者本结点的下一个元素比较,当一个链表结束后直接在尾结点接入另一个链表剩下的元素;

2023-10-08 20:00:46 176

原创 c语言经典面试题

传统上,主函数定义了一个int空间,子函数就必须接收一个int * 的变量,通过这个变量,反向更新,将主函数中的int空间的值进行修改;int a[3][4] = {1,2,3.....}//二维数组看后面那个来操作空间,a是4个int4个int地访问地址;那么,如果子函数中想更新一个int * 的值,必须传递一个int * * 的变量来达到同样的效果;&a + 1,是一个数组一个数组加,指针的地址会到a数组后面,(*p)[4]//存的是地址,4个int4个int地访问地址;

2023-09-05 20:52:55 53

原创 c语言的函数上设计思想

第九行可能打印出不是hello world的信息,常量字符串 赋值给局部变量数组,函数返回局部变量消失,常量字符串依然存在,用等号给空地址赋值,虽然该地址可以赋值给str,但是该地址已经随着函数返回而成为随机地址,里面存的值已经不确定了;*a =200//下级函数a中存的是上级函数中a的地址,而*a直接通过该地址访问到了上级的a,通过赋值改变上级函数中a的值;p是局部变量,第三行用malloc申请的堆空间的值为局部变量赋值,函数返回后局部变量消失,而堆空间未消失,没有回收导致了内存泄漏;

2023-09-03 20:48:34 97

原创 Makefile

makefile中:rm *.o test;表示移除makefile中所有.o文件和test;利用命令行由依赖文件生产可执行文件,命令行前必须是TAB键;export :把变量传递给子目录的makefile;$(SUBDIRS):执行指定目录下的makefile;make命令的选项及makefile中的隐含规则;创建和使用变量://用变量来代替一个文本字符串;make -i 忽略错误;CHECK_DIR:生成BIN目录;生成文件必须和依赖文件之一相同;不能变量套变量,不然会死循环;@ECHO:打印不提示;

2023-08-28 21:03:14 54

原创 linux c语言高级编程

p指针没有初始化,是一个野指针,在内存中是一个随机的值,所以不能赋值,否则非法访问空间出现段错误;堆内存的分配与释放:*malloc(开辟size大小的空间并返回地址)/free;b num(行号);info b (查看断点);编译器根据条件的真假决定是否编译相关代码;//释放p中存的地址对应的空间;恢复执行,退出一行一行执行模式,一次执行完;来访问结构体指针的成员;

2023-08-28 16:58:12 91

Linux基础xmind

Linux基础思维导图,shell脚本,文件系统,用户系统,网络,进程,磁盘,相关命令

2024-09-03

stm32的入门介绍外设,特殊机制

systeminit,固件库开发,时钟,总线,命名规则,仿真,AHB,apb,外设:gpio,tim,串行通信接口,adc,特殊机制(中断,协议),基本知识,常见硬件

2024-09-01

c语言思维导图,xmind,主要分类,数据类型,函数,指针,数组,结构体,共用体,枚举,基本查找算法,排序算法,树,图,栈,等

从c语言的数据,开发工具,数组,函数,指针,自定义数据类型,输入输出,运算符和表达式,程序结构控制语句,数据结构与算法,c高级(动态内存呢规划)做一个思维导图梳理

2024-09-01

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

TA关注的人

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