自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 嵌入式学习:数据库sqlite3

create table 表名(列名1 数据类型, 列名2 数据类型, ....);select * from 表名 where 列名 like "%梅";select * from 表名 where 列名 关系运算符 值;select * from 表名 order by 列名 DESC;select * from 表名 order by 列名 ASC;变量、数组、链表-------------》内存 :程序运行结束、掉电数据丢失。select 列名1,列名2 from 表名;

2025-03-07 20:16:57 838

原创 嵌入式学习:网络编程(3)

NULL:不设置超时。readfds:文件描述符读事件集合表。nfds:关注的最大文件描述符+1。exceptfds:其他事件集合表。writefds:写事件集合表。0:超时事件到达但没有IO事件。提前预创建大量线程,避免任务执行过程中创建线程。在不创建新的进程和线程的前提下,可以在一个进程。成功:返回到达的事件个数。功能:阻塞等待IO事件,返回事件结果。资源消耗大,同资源平台下,并发量小。4. 根据不同的IO事件处理不同的任务。2. 将关注的文件描述符加入到集合。select:实现IO多路复用。

2025-03-06 20:08:50 262

原创 嵌入式学习:网络编程(2)

接收方收到相关数据,会回应ACK报文,报文中的确认号是接收方下次希望接收到的数据的起始序号。4.超时重传:TCP发送数据后会在一定的时间内等待ACK,假设在指定时间ACK未收到,则视这包数据已经 丢失,会重新传输这包数据。UDP:传输效率高,头部开销小,但不保证传输的顺序和路径,同时在传输较大文件时可能会丢包(只管传输,不管接收方是否收到)。1.应答机制:为每个数据增加序列发,发送数据时,第一个数据的序号作为报文中的序号。TCP:头部开销大,机制复杂,发送时建立链接,确保数据无差错、不丢失、按序到达。

2025-03-04 20:15:44 674

原创 嵌入式学习:网络编程(1)

物理层:定义物理设备标准,比如网线,光纤等传输介质 比特流 bit 0 1。数据链路层:封装成帧,点对点通信(局域网内通信),差错检测 交换机 ARP。物理层:定义物理设备标准,比如网线,光纤等传输介质 比特流 bit。数据链路层:封装成帧,点对点通信(局域网内通信),差错检测 交换机。C/S模式 :有一个专用的客户端 client----server。应用层:HTTP、HTTPS、FTP、TFTP、MQTT。QQ1--->腾讯服务器---->QQ2。

2025-03-03 20:30:40 329

原创 嵌入式学习第二十七天

今天我学习了三种进程间通信的方法:消息队列,共享内存,信号灯. 这几种通信都依赖于IPC对象,这是一种内存文件,独立于两个进程空间,属于内核空间(掉电后IPC对象会销毁), 使用ipcs -m/-/s可以查看IPC对象的信息 m:共享内存 q:消息队列 s:信号灯 ipcrm -m/M id/key删除IPC对象。生成key值(IPC对象的名称),通过在不同进程中创建相同的IPC文件,我们可以完成通信.信号灯:可以说是有名信号量,也是一组信号量,包括创建,初始化,申请/释放,销毁,

2025-02-27 20:03:30 153

原创 嵌入式学习第二十五天

今天我学习了线程间通信的内容,因为线程有共享的空间,所以实现起来比较方便,不过在操作数据时有可能产生全局变量的竞争导致程序的错误,因此我们采用了互斥锁,在对全局变量操作之前,我们可以加锁,当程序再次想加锁时,加不上,就不会运行下面的代码,操作完后解锁.同一个锁的代码区域不会同时执行.在锁和解锁之间最好不要阻塞或睡眠,不然其他线程都等着用,非常浪费时间.此外还可以用信号量的方法,等待信号时阻塞,得到信号执行,最后再释放信号,这种方法可以让程序按顺序执行.

2025-02-24 20:39:59 140

原创 嵌入式学习第二十六天

有名管道功能强的多,可以在任意两个进程间通信,不过需要读写两端同时加入才能继续向下执行,否则会阻塞等待,所以在写程序的时候要注意文件读写的顺序,不然也可能会卡住.具体方法是:用int mkfifo(const char *pathname,mode_t mode)函数创建一个管道文件,先在一个程序中以写方式打开文件,再在另一个程序中以读打开,这样就可以实现信息交流了,在这之上还可以再创建一个管道文件实现互相输入输出的功能,还需要创建两个线程分别执行读和写的操作,这样就可以实现简单的全双工通信.

2025-02-24 20:24:41 257

原创 嵌入式学习第二十四天

进程间的任务切换需要映射到不同的物理地址空间,频繁切换资源开销大. 在通信上,多线程共享空间,更方便,不过需要注意共享也就是空间谁都可以访问,有风险,崩溃也会让该进程中所有线程崩溃,需要用加锁来解决,多进程没有这种资源竞争,不过需要更复杂的方法实现,崩溃不会影响其余进程.这个可以指定回收PID进程空间输-1则是任意;我今天学习了进程和线程的相关知识,先说一下进程和线程的区别吧,进程是有独立空间的而线程是在进程里共享数据区文本区和堆区,只有独立个栈区空间, 对于消亡和调度进程和线程保持一致。

2025-02-21 18:26:39 174

原创 嵌入式学习第二十三天

这是一个组合命令,前面的输出作为后面的输入 I 是管道. pstree树状图查看进程关系,kill -9 PID 杀死进程 ./a.out &在后台执行a.out。进程就是程序执行的过程,是操作系统资源分配的最小单元(文本段,数据段,系统数据段)包括创建,调度和消亡。让父进程先结束,子进程会成为孤儿进程,被init进程收养,子进程结束时,init进。子进程结束,父进程回收子进程空间(wait或者waitpid回收子进程空间。进程执行结束,空间没有被回收,就会成为僵尸进程。5. 进程相关的命令有哪些?

2025-02-20 21:22:37 459

原创 嵌入式学习第二十二天

今天我学习了软件编程中的文件IO相关函数接口,与标准IO不同的是:文件IO是系统调用,是Linux内核中的函数接口,没有缓存IO. 标准IO有缓存,是库函数,是对文件IO的封装,例如fputs,fopen等等都是对write,open的封装,同时文件描述符也可以和文件流指针相互转换, 用fdopen可以把文件描述符转换成文件流指针,然后我学习了几个目录IO的函数接口。

2025-02-17 21:47:30 253

原创 嵌入式学习第十九天

这样出现频率高的字符用较短的编码,频率低的用较长的编码,从而达到整体压缩的效果通过构建一棵二叉树来实现的。然后,每次取出权值最小的两个节点,合并成一个新的节点,新节点的权值是这两个节点的权值之和。然后把新节点放回优先队列中。今天我了解了二叉树的知识,知道怎么生成一个满二叉树,还可以用用递归法 前序遍历,中序遍历,和后序遍历.我还了解了DFS:深度优先遍历 BFS:先找到最左边的叶子节点入栈,在出栈,将根节点和有孩子入栈,在找最左边的叶子节点 通过打印的位置不同 可以 打印出前序遍历和中序遍历的顺序。

2025-02-16 16:43:46 260

原创 嵌入式学习第二十一天

之外我还了解到如何用fseek找到文件的末尾 先用 fseek(FILE *stream, long offset, int whence)) 找到文件末尾,再用long ftell(流)获得流的偏移量 还可以获得文件的长度。我了解了流的输入和输出函数 fputc、fgetc fputs、fgets fprintf、fscanf fwrite、fread。保存文件本身的数据(数据可能无法在终端显示或在终端显示乱码)文件中所有的内容均为能够在终端显示的ASCII码字符。

2025-02-15 20:22:04 137

原创 嵌入式学习第二十天

还有一种文件IO是没有缓存的直接和内核进行交互,效率低但实时性很好,在设备操作、即时通信使用文件IO,此外文件IO是系统调用:1. Linux内核中的函数接口,称为系统调用。今天我学习了软件编程的相关内容, 在Linux操作系统中,所有东西都是文件,包括屏幕磁盘,网卡键盘鼠标. 在IO编程中,操作的对象都是文件,下面是文件的类型总结。特点是效率高但实时性差,在满缓存没满的时候不会访问,行缓存是遇见\n会释放一次缓存,也可以用fflush(stdout);2. 库函数每次调用内核中的代码称为一次系统调用。

2025-02-14 20:09:53 172

原创 自学嵌入式第十八天

链式栈空间无限,只需改变对内核链的操作就能实现各种操作,非常方便.即便是队列等数据结构,原理也都相同.栈的特点是先入后出,顺序栈通过标签pdata,tlen和top操作数据空间,空间是有序且有限的,今天我学习了队列和栈,了解了顺序队列,链式队列,顺序栈,链式栈的使用.

2025-02-11 20:27:32 121

原创 自学嵌入式第十七天

list.h中有许多对内核链表操作的函数,需要对其中的函数多了解,还有对内核函数的遍历函数,用偏移量找结构体的函数,以及基础的删除,尾插法等等;头插法添加数据,先创建一个头结点(循环链表头结点存指向自己的地址),再申请一个空间存数据,pos是大结构体,head是头节点,member是大结构体内头节点的名字,再用list.h的函数连接头节点和数据中的新节点;

2025-02-10 21:50:00 140

原创 自学嵌入式第十六天

我们可以定义两个指针,一个快指针 一次走两步,一个慢指针,一次走一步 如果这两个指针能够相遇那么就是有环的, 然后我们可以计算出相遇点到环的入口==开头到环入口的距离.如此我们就能得到环长和环的入口在哪里了。今天我学习了有头单向链表的一些操作 :倒置,翻转,排序和如何判断有无环。最值得说的是如何去判断有无环。

2025-02-09 19:18:27 193

原创 自学嵌入式第十五天

在文件较多时我们用gcc显然比较麻烦,此时我们可以将.c文件放在src文件夹中,.h文件放在include文件夹里,再创建一个makefile文件,内容编写如下。我了解了单向链表中有头链表的结构 每一个链表有一个值的内存空间和一个指向下一个链表的指针内存空间,最开始有一个头链表 其值为0,指向第一个链表.以此类推.${OBJ}:${OBJS} 生成目标文件和其依赖的源,只有当其源文件发生改变时才会重新生成目标文 件.h文件不在其列。

2025-02-07 20:09:03 210

原创 自学嵌入式第十四天

今天我学习了多文件编程,也就是如何在一个工程中编写代码,首先需要创建一个main.c用来存放main函数,一个工程必须有而且只能有一个main函数作为程序的入口地址,如果有别的功能函数可以封装到其他.c文件中,与其搭配的还有一个.h的头文件,在头文件中需声明.c文件中的函数,以及所用的变量名,最后只需在main.c中写上头文件,就可以使用.c文件中的函数了,这样函数的功能性比较强,想再用.c文件中的功能也很方便。此外我还了解了gdb调试工具的用法下面是我总结的。

2025-02-06 21:15:06 230

原创 嵌入式学习第十三天

在函数中传二维数组时 可以传数组指针(char (*p)[ ])和长度(int len),数组指针指向的是一个数组空间,步长是一个数组存储的空间,对数组指针取*后,虽然指向的首地址一样,但其类型和意义都会改变,类型会变为char *p ,指向的是数组的第一个元素.在函数内部改变值不会影响外部。还有一种传二维数组的方法是定义一个指针数组指向二维数组,传入(char **p)和长度,数组指针里的指针地址是二维数组的每一个一维数组的首地址,可以借此来改变数组中的值,函数内部的改变会影响外部.

2025-01-22 21:05:03 285

原创 嵌入式学习第十二天

指针数组的字符串是不可以改变的,只能通过改变指针来指向不同的字符串.与其相反的是,二维数组的地址是有序的,有限的,数组的地址是不能改变的,而可以改变的是其地址里的内容。指针数组里存放的是指针char* 型,指针数组的数组名是二级指针是char**型, 指针数组和二维数组都可以用来存放字符串,但两者有不小的区别.今天继续学习了指针相关内容下面是我补充的思维导图。

2025-01-21 21:08:54 163

原创 嵌入式学习第十一天

今天继续学习了指针相关内容,数组名实际上是一个指针常量,存的是数组第一个元素的首地址,在编写数组倒置问题上,我们不用像以前传入数组的名和数组的长度,只需要先传入str数组名(也是地址),通过操作这个地址,我们可以遍历整个数组,从而对数组实现各样的操作.最后,当定义一个字符型数组时,存储在栈区,是局部变量,在函数中用指针操作时,函数结束后内存空间会被回收,而指针可以直接存字符串常量的首地址,用这个地址可以找存在数据区的字符串常量,.字符串常量的类型是char*

2025-01-20 20:15:53 201

原创 嵌入式学习第十天

有了指针,我们可以从一个函数中取到两个返回值.只要在形参表中定义两个指针变量,通过*p可以修改该地址中的值,在使用函数时只需放入变量的地址,就可以获得函数运行的返回值了.今天学习了指针的相关内容,下面是我的思维导图。

2025-01-19 19:00:40 108

原创 嵌入式学习第九天

在使用#define的时候一定要给参数加(),不能省略,因为预处理时只是将#的内容进行展开和对代码进行替换,所以在define时没有计算和申请空间的步骤,只是将代码替代了,那么替代过去的时候很容易因为计算优先级的问题而发生错误,带上括号就可以了。在函数传参时,只是将内容复制到了形参变量当中,在函数内操作变量不会对主函数变量产生影响。但整形数组变量在函数中是直接操作数组内容的。今天我学习了函数的递归和预处理命令的使用,下面是我的思维导图。另外,我还学习了函数的传参和函数的递归。

2025-01-18 20:48:18 234

原创 自学嵌入式第八天

在做一个工程时,往往会采取将一个复杂任务,切割成简单的,模块化的程序,我们可以将经常用到的一个功能封装成一个函数,这样在主函数中只需要声明后拿来使用就好了,除此之外还可以将函数放在别的文件中,这样我们就可以将任务分配给多个人,每个人都负责编写一部分的功能,最后将这些整合到主函数中应用,大大加快了工程的速度.在调用别的文件中的函数时,我们不需要再定义,只要在使用前加上extern声明函数后就可以了.今天我学习了c语言的函数相关内容,下面是我的思维导图。

2025-01-17 19:46:38 161

原创 自学嵌入式第七天

需要注意的是,在字符型数组定义时和一般一维数组一样,要进行初始化操作,不然会产生乱码,在对字符串进行操作时,要注意字符串的空间是否足够,否则将会产生存储越界,非常麻烦;字符型数组是用来存储字符串的,是n个字符组成的数组,最后末尾会有一个\0作为结束标志。今天我学习了字符型一位数组,下面是我的思维导图。

2025-01-15 19:01:54 158

原创 自学嵌入式第六天

冒泡排序方法是,先假设a[0]为最大值,然后从a[1]开始比较,如果有比当前最大值更大的值那么将两数位置互换,依次执行下去,数组中最后一位数的值会变成其中的最大值,将上面执行若干次后,数组中的值会按小到大排序好。选择排序的方法是,先假设a[0]为最小值,再用循环选出最小值的下标,将其放到a[0]处,接下来再假设a[1]为最小值,再用循环选出最小值的下标,将其放到a[1]处,执行若干次后会从小到大排序好。最后要注意的是,数组要初始化时就定好大小,不然也可能有存储越界。

2025-01-14 19:40:24 230

原创 自学嵌入式第五天-流程控制

在编写代码时,我们首先要想清楚解决问题的流程是什么,在我们运算这个方程式我们往往会先看i的值满足哪一个条件,再看i和result的关系是什么,最后得出result的运算结果。以上是我今天学习的思维导图,有了顺序结构,分支结构,和循环结构,许多问题都可以被我们用这三个结构组成的代码来解决,例如下面这个分段函数问题。然后可以用if语句来判断i满足哪一个条件。当i<=5时,result等于1到i之间的整数累和,可以用for循环实现。当 i >=10时 i 的平方可以暂时用i*i代替,因为我还不会用次方的函数。

2025-01-13 19:17:14 208

原创 自学嵌入式第四天总结

gets和puts可以输入输出字符串,在c语言中没有字符串常量,字符串实际上是一个由字符组成的数组,不过数组我暂时没有学习到,只知道在定义时要提前设置数组的长度,不然在输入时超出存储空间可能会导致错误。要想不识别空格字符只能像下面这样用空格提前隔开,那么我们在输入时无论输入了多少个空格它都不会识别,直到接到下一个字符。我们在scanf中输入两个字符时通常会用 ' ' 空开,而空格字符也会被识别进去,导致输出的ch跟我们想的不一样。scanf同样可以用来输入字符串,并且不用打地址符&就可以输入了。

2025-01-12 18:59:28 233

原创 学习嵌入第三天

1011 1000 那么这时候很容易得到十进制数为184 ,但这并不是答案 因为字符型变量的存储空间是-128到+127之间,最高位是符号位1,所以这是一个负数,当然肯定有同学也想到符号是负数了那么他的答案会是-56,那这也是不对的。负数存储时 会按照 原码*>反码->补码的形式存放,那我们先要求得原码才能获得正确的十进制数。那么我们首先知道的是字符型数据是只有一个字节的存储,而440的二进制数为。在昨天的数据存储的学习上,还是有些不足,例如下面的ch会输出为几。这是我今天学习内容的思维导图。

2025-01-11 19:22:53 251

原创 自学嵌入式第二天

值得注意的是 \ 这个转义字符有很多用途 :“\0”表示ASCII码中的零,而字符“0”在ASCII码中的十进制数为48,还可以用 '\143'来表示在ASCII码中八进制数的值。我们常说的CPU是由运算器和控制器组成的,其中的内容会在断电后丢失,但其特点是与cpu交互速度快,但价格贵,而存储设备价格便宜内存大。此外,我知道了表达式和运算符的用法 双向运算符必须注意类型的变化,有很多时候不注意的类型变化会导致结果错误。我还了解到计算机有五大部分:运算器,控制器,存储设备,输入设备,输出设备。

2025-01-10 20:09:15 260

原创 嵌入式自学第一天笔记

此外Linux系统的目录结构是一种树形结构,最顶层为/是根目录,该目录下的系统文件普通用户没有权限看,超级用户只有一个 而且名字叫root家目录在/root ,普通用户的家目录爱/home/用户名。功能:创建空目录文件(Linux不需要通过后缀名区分文件类型,为了方便移植最好加上后缀)功能查看当前目录下的所有文件,包括隐藏文件(以 . 开头的文件)功能:查看当前目录文件下所有文件的详细信息。注意:如果目录文件不为空,使用该命令会报错。功能:查看当前目录下的所有文件。功能:完成文件移动(剪切)

2025-01-09 19:56:10 266

空空如也

空空如也

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

TA关注的人

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