- 博客(41)
- 收藏
- 关注
原创 I2C时序
并且IIC在每次启动通信后的第一个字节就是需要接收数据的设备的地址。作为一种通信方式,IIC总线在某一时刻,总线只允许有一个设备处于发送状态,所发出的数据被总线上所有的设备所接收。单字节读时序比写时序要复杂一点,读时序分为 4 大步,第一步是发送设备地址,第二步是发送要读取的寄存器地址,第三步重新发送设备地址,最后一步就是 I2C 从器件输出要读取的寄存器值,我们具体来看一下这几步。上图所示是IIC的总线的使用场景,所有挂载在IIC总线上的设备都有两根信号线,一根是数据线SDA,另一根是时钟线SCL。
2024-09-25 23:24:12
1555
原创 串口通信概念
就好比在合唱团里,大家一起唱歌的节奏是由指挥员指挥的,每个人都按照指挥员的节奏唱歌,保证大家唱的是同一首歌且节奏一致。嵌入式系统中的通信是指两个或两个以上的主机之间的数据互交,这里的主机可以是计算机也可以是嵌入式主机,甚至可以是芯片。串行通信是指将数据拆分成一个个比特,按照先后次序在一根总线上进行发送,串行通信有着系统占用资源少,结构简单等优点,是主机间通信的常用方式。上图的纵坐标为电压值,横坐标就是时间了。常见的波特率有1200、2400,4800,9600,115200等,表示每秒钟传输的比特数。
2024-09-22 23:27:29
1067
原创 ARM体系结构
System on Chip,简称Soc,也即片上系统 芯片。sp(r13):栈指针,解决函数嵌套调用,地址存入栈(使用时初始化)MMU:内存管理单元,把虚拟内存映射到物理内存上,提高RAM使用效率。每一个不同的工作模式拥有一个不同的栈区空间(sp)nor flash 可寻址,存程序。cortex体系结构有40个寄存器。七种异常,每种异常工作模式不同。pc(r15):程序计数器。lr(r14):链接返回。APB:高级外设总线。AHB:高级高速总线。ALU:算术逻辑单元。ARM有37个寄存器。
2024-09-18 21:11:49
476
原创 framebuffer帧缓存
在计算机中,颜色通常用 RGB(红绿蓝)模型来表示。我们可以将我们想要显示的图像数据写到framebuffer中,驱动程序每隔一段时间会自动的去读取Framebuffer中的图像数据,并根据读取到的图像数据在屏幕上显示对应的图像。RGB555 格式也使用 16 位来表示一个像素的颜色信息,其中 5 位用于红色通道、5 位用于绿色通道、5 位用于蓝色通道。我们知道一幅图像其实是由一个一个的像素点组成的,诸多的不同颜色的像素最终组成了一幅图像,因此上面提到的图像数据指的就是这一幅图像中每个像素点的颜色数据。
2024-09-10 21:35:33
845
原创 哈希表及算法
将所有关键字为同义词的记录存储在一个单链表中,我们称这种表为同义词子表,在哈希表中只存储所有同义词子表的头指针。此时,已经不存在什么冲突换址的问题,无论有多少个冲突,都只是在当前位置给单链表增加结点的问题。查找时,根据确定的对应关系,找到给定的key的映射。对于关键字集合{12,67,56,16,25,37,22,29,15,47,48,34},用12为除数,进行除留余数法,可得到如图结构。查找时,根据同样的散列函数计算记录的散列地址,并按此散列地址访问记录。思想:相邻两元素两两比较,小的放前,大的放后。
2024-09-09 20:37:56
1412
原创 数据结构栈和队列
3,函数的调用关系 函数中调用函数时会把调用函数的下一条指定的首地址保存在栈区。不含元素的空表称为空栈。栈的修改是按后进先出的原则进行的。:链队是指采用链式存储结构实现的队列。允许从一端插入数据, 另一端删除数据的线性存储结构。程序运行中使用的栈,由操作系统维护。只允许从一端进行数据的插入和删除的线性的存储结构。允许插入的一端称为队尾,允许删除的一端则称为队头。2,函数的形参的返回值。选择链表表头做对头,表尾做队尾。:指利用顺序存储结构实现的栈(数组):指采用链式存储结构实现的栈。
2024-09-07 00:08:45
688
原创 单向链表排序及双向链表
每个节点都是由结构体组成的数据类型,但是双向链表结构体中增加了一个指向前一个节点的指针。由于单向链表只能通过指针单向的访问后继节点,不能向前遍历前驱节点,所以要引入双向链表。双向链表:在保持单向链表的基础上,既可以向后遍历后继节点,也可以向前遍历前驱节点。缺点:修改和查找效率低,只能单向的向后遍历后续节点,不能向前遍历前驱节点。优点:存储空间没有上限,插入删除效率高。定义数据类型及节点和链表对象。
2024-09-04 21:27:12
306
原创 数据结构及单向链表
程序的设计:将现实中大量而复杂的问题以特定的数据类型和特定的存储结构存储在内存中,并在此基础上实现某个特定的功能的操作;线性结构:元素之间一对一的关系(表(数组,链表),队列。索引存储:通过关键字构建索引表,通过索引表来来找到数据的存储位置。散列存储(哈希存储):将数据元素的存储位置与关键码之间建立确定对。链式存储:采用一组非连续的内存空间保存元素 (链表)1, 一组用来保存一种或者多种特定关系的数据的集合(组织和存储数据)4. 预分配内存空间。数据的物理结构:数据的逻辑结构在计算机内存中的存储形式。
2024-09-03 21:39:16
546
原创 IO多路复用
2. 添加文件描述符到集合中 void FD_SET(int fd, fd_set *set);4.select只能工作在水平触发模式(低速模式)无法工作在边沿触发模式(高速模式)4.poll只能工作在水平触发模式(低速模式)无法工作在边沿触发模式(高速模式)nfds : 关注的文件描述符中的最大值+1。
2024-08-28 23:18:21
779
原创 网络服务器及IO模型
为了解决进程或线程阻塞到某个 I/O 系统调用而出现的技术,使进程不阻塞于某个特定的 I/O 系统调用。优势:系统开销小,系统不需要建立新的进程或者线程,也不必维护这些线程和进程。1.可以实现多任务同步(多个事件相互影响)并发服务器模型:服务器在同一时刻可以响应多个客户端的请求。单循环服务器:服务器在同一时刻只能响应一个客户端的请求。1.实现异步IO操作,节省CPU开销。2. 为文件描述符添加非阻塞属性。1)为IO设备增加信号驱动属性。2.只能针对比较少的IO事件。1.可以访问多个IO事件。
2024-08-27 21:42:49
374
原创 TCP 粘包问题
TCP是一个面向字节流的传输层协议。这不同于 UDP 协议提供的是面向消息的传输服务,其传输的数据是有边界的。TCP 的发送方无法保证对方每次收到的都是一个完整的数据包。2. 对于变长的包,还可以在包和包之间使用明确的分隔符,这个分隔符是由程序员自己来定的,只要保证分隔符不和正文冲突即可。(3)超时重传:当发送端发送的数据在网络中丢失时,在一定时间内没有收到接收端的ACK,则发送端会重新发送丢失数据。TCP协议是面向字节流的协议,接收方不知道消息的界限,不知道一次提取多少数据,这就造成了粘包问题。
2024-08-23 20:15:39
614
原创 UDP 通信模型服务器端及TCP编程 C/S模型
当客户端连接请求到达时,accept 函数会创建一个新的套接字,并返回一个新的套接字描述符,该描述符与客户端的套接字建立连接。功能:如果该函数在服务器端调用,则表示将参数1相关的文件描述符文件与参数2 指定的接口地址关联, 用于从该接口接受数据。如果该函数在客户端调用,则表示要将数据从 参数1所在的描述符中取出并从参数2所在的接口设备上发送出去。void *buf, //保存数据的一块空间的地址。address_len:一个指向 socklen_t 类型的指针,表示 address 缓冲区的长度。
2024-08-22 21:08:17
1049
原创 共享内存及网络通信
int flags, //0 --- 默认。const struct sockaddr *dest_addr, //表示 要发送到的 地址 (网络地址 ip+端口号 )domain 地址族,PF_INET == AF_INET ==>互联网程序。socket //1.一种特殊的文件 --- 专门用于网络通信(不同主机间的进程)//domain --域 (范围) ---socket 用于什么范围的通信。//SOCK_RAW 原始套接字 ===》IP。
2024-08-21 20:34:02
774
原创 进程间通信 有名管道和信号
进程间通信----信号,也称为软中断,在软件层面上实现一个类似中断的过程。参数:pathname 要创建的管道文件名。信号本身不能传递大量数据,是一种异步的通信方式。mode 文件权限。两个无亲缘关系的进程通过有名管道进行通信。管道中数据遵循fifo读写规则,先进先出。函数 mkfifo 创建一个有名管道。返回值: 成功 0,失败 -1;可以在父进程回收子进程效率更高。在信号处理函数中判断对应的信号。两文件通过管道文件传递信息。文件大小为0 bytes。有名管道是一种特殊文件。系统中有一个对应名称。
2024-08-17 20:05:17
246
原创 信号量及进程间通信
参数: @pipefd //用来获取 管道的两端 //读端pipefd[0] //写端pipefd[1] ,其中为文件描述符。3. 信号量的PV操作 (核心) sem_wait()/ sem_post() ---生产者 消费者 模型。信号量集() //信号量 (6)有资源可用,直接使用,资源个数减一 ,如果没有资源可用,此时等待。如果sem没有资源(==0),则线程阻塞等待,一旦有资源。如果sem有资源(==1),则申请该资源,程序继续运行。
2024-08-16 19:51:22
813
原创 【无标题】
int pthread_cancel(pthread_t thread) 参数为要发送线程的tid 成功返回0,失败返回错误码。静态初始化 ,定义的同时并初始化 pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;(2)pthread_detach //可分离属性 , 子线程运行很久才结束,一般在线程创建好后设置分离状态,不关心线程退出状态。
2024-08-15 21:11:48
466
原创 进程的退出函数及线程
函数的第2个参数为void**,为二重指针,接收的是线程中函数pthread_exit(void∗retval)的参数可以用来查看pthread_exit传递的参数(如果不关心退出状态,phtread_join的这个参数可以置空,即phtread_ join(tid,NULL), 函数在线程退出时,用来清理线程资源。如果成功,wait会返回被收集的子进程的进程ID,如果调用进程没有子进程,调用就会失败,此时wait返回-1,@retval //退出状态值 //传的是,退出状态值 对应的地址。
2024-08-14 19:26:35
765
原创 exec函数族
exit() 函数与 _exit() 函数最大的区别就在于 exit() 函数在终止当前进程之前要检查该进程打开了哪些文件,并把文件缓冲区中的内容写回文件,就是图中的“清理IO缓冲”的表述。当程序执行到 exit() 函数或者 _exit() 函数时候,进程 会 无条件停止剩下的所有操作,清除各种数据结构,并终止本进程的运行。但是,这两函数还是有区别的,return 表示的是把程序流程从被调函数转向主调函数并把表达式的值带回主调函数,实现函数值的返回,返回时可附带一个返回值,由return后面的参数指定。
2024-08-13 21:19:50
1084
原创 目录函数及常用函数
函数 link 创建硬链接文件,两个文件关联一个存储地址,不能链目录,一个被删另一个无影响 // ln 1 2。函数 symlink 创建一个链接向oldpath文件的新符号链接文件 //软链接,类似快捷方式。参数: oldpath:被链接向的文件的路径, newpath:新符号链接文件。参数: oldpath:要链接向的文件 ,newpath:创建的新硬链接文件。返回值:成功返回1970年到现在的秒数 ,失败返回-1。函数 ctime 将时间秒数转化成字符串。
2024-08-08 21:05:29
796
原创 对目录的操作函数
参数: buf:保存工作路径空间的首地址, size:保存路径空间的长度。参数: path: 文件或路径 ,buf: 属性存放空间的首地址。返回值:包含文件信息的结构体,出错或者读到目录流末尾返回NULL。返回值: 成功返回包含路径空间的字符串首地址 ,失败返回NULL。功能:从目录流中读取文件信息并将保存信息的结构体地址返回。返回值:成功返回目录流指针,失败返回NULL。返回值: 成功返回0, 失败返回-1。返回值: 成功返回0 ,失败返回-1。返回值: 成功返回0 ,失败返回-1。
2024-08-07 20:48:29
401
原创 缓冲区及文件IO的学习
使指针复位到起始位置。O_EXCL,需要和O_CREAT同时使用,表示新建的文件不能存在,成功,否则open就会失败。功能:将stream流文件中的文件指针从whence位置开始偏移offset字节的长度。参数:fd:文件描述符,buf:要写入文件的字符串的首地址,count:要写入字符的个数。参数:fd:文件描述符,buf:存放数据空间的首地址,count:要读到数据的个数。返回值:成功返回读到数据的个数,失败返回-1,读到文件结尾返回0。参数:stream 要移动文件指针的目标文件流对象。
2024-08-06 20:22:48
734
原创 【无标题】
eg : ====》stdio.h ===>stdio.c==>libc.so ==>/usr/lib so 动态库。I: 键盘是标准输入设备 ====》默认输入就是指键盘 /dev/input。man xxx == man 1 xxx ===>查看当前xxx命令。man 2 xxx ===>查看xxx对应的系统调用函数。man 3 xxx ===》查看xxx对应的标准库函数。流对象 ===》头 《===数据====》尾。fgetc/fputc,,,,,,一个字符,
2024-08-05 19:38:02
465
原创 Linux系统编程shell脚本的学习
test -eq 相等 test 10 -eq $i [ $i -eq 10 ] if( a == 10)shell编程:解释型语言,边翻译边执行,擅长文件处理,操作系统管理,开发效率高 cp 1 2,执行效率低,移植性好。.c :编译型语言,先编译再执行,擅长数据计算和数据处理,开发效率低,执行效率高,移植性差。数学运算a=2 b=3 c=`expr $a \* $b` \*代表*'':打印字符串,遇到$变量依然打印$变量。``:将中间的字符串按照命令打印。
2024-08-03 19:13:50
392
原创 共用体及枚举类型及位运算
十进制的5,该数二进制为 0000 0101,将该数左移3为0010 1000,转换成十进制为 40, 验证了上面的结论:5左移三位就等于5乘以2的三次方等于40。即:0 & 0= 0 ,0 & 1= 0,1 & 0= 0, 1 & 1= 1。即:0 | 0= 0 ,0 | 1= 1,1 | 0= 1, 1 | 1= 1。即:0 ^ 0= 0 ,0 ^ 1= 1,1 ^ 0= 1, 1 ^ 1= 1。enum Week声明week取值范围。即:~0 = 1 , ~1= 0。
2024-08-02 20:26:46
477
原创 结构体及单向链表的学习
应当说明struct student是一个类型名,它和系统提供的标准类型(如int、char、float、 double 等)一样具有同样的作用,都可以用来定义变量的类型,只不过结构体类型需要由用户指定。(2、结构体成员按照结构体成员声明先后次序依次存放,并且每个成员的首字节放置的位置必须能够整除成员的字节数;(3、如果结构体某个成员的字节数大于CPU的字节数,则最长按照CPU的字节数对齐;有头链表,从栈区开空间作首节点,由头指针pHead-->首节点-->头节点。结构体的初始化是按声明顺序依次初始化。
2024-08-01 19:39:17
437
原创 指向数组的指针及指向函数的指针
如void printString(char **s,int len);p指向一个长度为10的一维整型数组;函数名为函数自身的入口地址,间接访问函数,用于降低程序耦合性。pfn指向两个int型参数,返回值为int的函数。一个指针数组做实参传递形参为指针的指针。二维字符数组的打印,逆序,排序及查找。char *s[3] 指针数组。求二维数组元素和及打印二维数组。三,指针数组及指针的指针。求二维数组每行平均值。
2024-07-31 19:37:49
171
原创 字符串与指针
向堆区申请的连续的字节,返回值为连续的字节的首字节地址,申请用完后要销毁。无法通过该指针修改p指向的变量。= NULL)代表申请到了,申请不到空间返回NULL。q - p 表示两指针之差的基类型,表示pq地址间前后关系。万能指针不能进行指针运算,可以接收任意地址。strncat从源中取前n个字符链接到目标。则i的值被改为100。销毁前p的地址不能改变,销毁后使指针置空。strncpy从源中拷n个字符到目标。三,万能指针void *p。可以通过指针间接修改i。
2024-07-30 20:43:24
266
原创 指针变量及传参的学习
printArray(a + 1,len - 2)表示打印数组从第二个元素开始向后打印len - 2个。p + n 在p基础上向后偏移n * sizeof(基类型)个字节。d中保存i的地址,通过指针p间接访问i。打印数组a[i]可替换为*(a + i)或*a++(2)从定位处向后偏移sizeof(基类型)将指针变量p置为空值,表示当前指针p不可访问。*&i为i的值,&*p,*&p为p装的地址。“*”为类型说明符,说明为指针类型。int *p 为初始化p为随机地址。1,指针为装地址的数据类型。
2024-07-29 19:02:19
377
原创 标识符作用域和可见性
3.两个或两个具有包含关系的不同作用域中定义的同名标识符,外层标识符在内层不可见。4,在函数或全局变量前加static,限制使用范围只能在本.c文件使用。形参也是局部变量,局部变量未初始化为随机数,全局变量未初始化全清0;#define N N为标识符,定义宏名字,宏名大写。2,在无包含关系的作用域中定义的同名标识符互不影响。在{}中的为局部作用域,不在任何{}中为全局作用域。1,auto自动变量,变量i的空间自动存储。4,同一作用域中不得定义同名标识符。1,标识符必须先定义在使用’
2024-07-27 20:38:11
212
原创 数组作为函数参数
用数组元素作实参,向形参传递数组元素的值,数组名做实参向形参传递的是数组首元素地址。如:void printArray(a,len) 实参传数组名和数组元素个数。const char*src 形参可为字符数组名或字符串常量。数组元素做函数实参从实参到形参,是值传递的方式。字符串的复制,连接,比较等函数。传参需要数组名和二维数组行数。二维数组中字符数组做函数参数。二,一维数组名做函数参数。一维数组中查找元素的函数。一,数组元素作函数实参。三,字符数组作函数参数。四,二维数组做函数参数。不用传数组元素个数,
2024-07-26 20:14:50
227
原创 函数的调用
在调用函数f的过程中,又要调用f函数,这是直接调用本函数,如果在调用f1函数过程中要调用f2函数,而在调用f2函数过程中又要调用f1函数,就是间接调用本函数,这两种递归调用都是无终止的自身调用,会使栈区消耗完使程序崩溃。(1)栈区,保存返回地址,函数形参及定义的变量。栈先进后出,后进先出,保护现场。实参向形参只能值传递,无法在被调函数中修改主调函数。逻辑结果为整型,被调函数发现错误无法通知主调函数。传参方向自右向左 add(i,j) 先传j再传i。递归求斐波那契数列第n个数。(4)静态区(全局区)
2024-07-25 20:20:26
313
原创 二维数组及函数
列 cols = sizeof(a[0]) / sizeof(a[0][0])行 rows = sizeof(a) / sizeof(a[0])被调在前,主调在后。return默认返回值为int。类型说明符 数组名[常量表达式][常量表达式]a[3][4] 三个长度为4的一维整型数组。a[ ][4]靠近变量名的可省略。二维数组地址等于数组首元素地址。查找一个一维数组是否在二维数组中。实参与形参个数相同,类型匹配。类型标识符 函数名(形参)类型标识符为结果的数值类型。
2024-07-24 20:00:54
167
原创 二分查表法及字符数组
先把乱序的数组按升序排序,在数组中定义一个中间数a[mid] ,mid=(begin+end)/2,用n 与a[mid]比较,再细分区间,具体如下。fgets(s,sizeof(s) / sizeof(s[0]),stdin)输入字符大于字符个数停止输入。strcmp(字符串1,字符串2),比较字符串1字符串2。(2)如果字符串1>字符串2,则函数值为一个正整数。(3)如果字符串1<字符串2,则函数值为一个负整数。(1)如果字符串1=字符串2,则函数值为0。(1) puts() 输出字符串。
2024-07-23 19:02:15
307
原创 利用一维数组处理数据
(2)在定义数组时,需要指定数组中元素的个数,方括号中的常量表达式用来表示元素的个数,即数组长度。a[10],表示a数组有10个元素,a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9]。不存在数组元素a[10]。t = a[10],其中“[]”为下标运算符,int a[10]中“[]”不是下标运算符是类型说明符说明a为数组。(3)连续性,a[0]a[1]a[2]...a[9]连续存放。数组越界访问,a[10],a[-1],可能会修改部分字节内容。
2024-07-22 21:51:53
357
原创 C语言循环控制结构
continue 语句和break语句的区别是:continue语句只结束本次循环,而不是终止整个循环的执行。(2)求解表达式2,若其值为真(值为非0),则执行for语句中指定的内嵌语句,然后执行下面第(3)步。若为假(值为0),则结束循环,转到第(5)步。continue:其作用为结束本次循环,即跳过循环体中下面尚未执行的语句,接着进行下一次是否执行循环的判定。如图,对要跳转的语句命名loop ,在要跳转的地方输入goto loop,即构成循环结构。(5)循环结束,执行for语句下面的一个语句。
2024-07-20 19:33:40
868
原创 关系逻辑运算符及if,switch语句的学习
例如,a>3是一个关系表达式,大于号(>)是一个关系运算符,如果a的值为5,则满足给定的“a>3”条件,因此关系表达式的值为“真”(即“条件满足”);如果a的值为 2,不满足“a>3”条件,则称关系表达式的值为“假”。“&&”和“||”是“双目(元)运算符”,它要求有两个运算量(操作数),如(a>b)&&(x>y),(a>b)||(x>y)。(非)→&&(与)→||(或),即“!在执行if语句时先对表达式求解,若表达式的值为0,按“假”处理,若表达式的值为非0,按“真”处理,执行指定的语句。
2024-07-19 20:45:20
376
原创 C语言输入输出函数的学习
即一个C程序可以由若干个源程序文件(分别进行编译的文件模块)组成,一个源文件可以由若干个函数和预处理命令以及全局变量声明部分组成 一个函数由数据声明部分和执行语句组成。表达式语句由一个表达式加一个分号构成,最典型的是,由赋值表达式构成一个赋值语句。一个语句必须在最后出现分号,分号是语句中不可缺少的组成部分,而不是两个语句间的分隔符号。“地址表列”是由若干个地址组成的表列,可以是变量的地址,或字符串的首地址。%md,m为指定的输出字段的宽度,如果数据的位数小于m,则左端补以空格,若大于m,则按实际位数输出。
2024-07-18 19:01:46
627
原创 C语言算术运算符和赋值运算符表达式的学习
printf("%d\n",i + j) 中i + j为临时变量,临时变量为右值,放赋值运算符右边。%的左右操作符为整型或与整型兼容,结果符号与左操作数符号一致,%结果小于右操作数。int = short 符号位扩展正数空穴补0负数空穴补1。4.( )强制转换运算符讲一个表达式转换为所需类型,(显式转换)。判断是否为左值可以对其取地址&,能取地址为左值,否则为右值。i++先复制一个临时变量再对i加1,++i的效率高于i++。顺序求职运算符自左向右,逗号表达式结果为最后一个子式结果。
2024-07-17 18:24:05
217
原创 C语言数据类型的学习
有符号长整型[signed] long [int],8个字节,范围(-2)^63~(2)^63 -1。有符号短整型[signed]short [int],两个字节,范围(-2)^15~(2)^15 -1。有符号基本整型[signed] int,4个字节,范围(-2)^31~(2)^31 -1。无符号短整型unsigned short [int],两个字节,范围0~(2)^16 -1。无符号长整型unsigned long [int],8个字节,范围0~(2)^64 -1。
2024-07-16 18:18:24
678
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅