自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 嵌入式学习笔记(44)IMX6ULL

串行外设接口,是一种高速、全双工、同步的通信总线四线SPI的四根信号线及其作用:SCLK- 串行时钟线同步主从设备之间数据移位和采样的时钟信号。所有数据传输都在时钟的节拍下进行。MOSI- 主设备数据输出,从设备数据输入线在主设备向从设备发送数据时使用。数据从主设备通过此线移位输出到从设备。MISO- 主设备数据输入,从设备数据输出线在从设备向主设备发送数据时使用。数据从从设备通过此线移位输出到主设备。CS - 片选线由主设备控制,用于选择要进行通信的特定从设备。

2025-09-19 18:41:15 397

原创 嵌入式学习日记(43)ARM汇编指令

判断方法:一个32位数,能用一个8位的数循环右移偶数位得到,就是合法12位立即数。关键:汇编里如果用了某些寄存器(如R4-R11),要先保存再恢复。将系统寄存器(如程序状态寄存器)的值读取到通用寄存器中。将寄存器中的值写入到内存地址中。将通用寄存器的值写入到程序状态寄存器等系统寄存器。按位执行逻辑 OR 操作,用于将寄存器中的特定位置1。满减(FD):SP指向最后的数据。将一个寄存器或立即数的值复制到另一个寄存器。bl:跳转前把返回地址存到LR寄存器(用于调用函数)。满增(FA):SP指向最后的数据。

2025-09-10 17:54:21 329

原创 嵌入式学习日记(42)ARM

不同模式下有自己专属的备份寄存器(Banked Registers),但总数是37个。:指令系统复杂,指令长度不固定,单条指令可完成复杂操作,但执行效率可能较低。:指令系统精简,指令长度固定,采用流水线技术,追求单周期执行指令,效率高。,用于实现安全扩展(TrustZone),在安全世界和非安全世界之间切换。,对应一种特定的异常(如复位、未定义指令、IRQ、FIQ等)。,进入特定的异常模式(如IRQ、FIQ等)。:操作系统保护模式,复位和软中断指令进入。:也是复位和软件中断(SVC)的入口。

2025-09-08 18:25:12 935 1

原创 嵌入式学习日记(41)串口

串行通信:数据位一位接一位地在单条信道(如一根数据线)上顺序传输。就像单车道的公路,车辆必须依次通过。优点:成本低(线少)、抗干扰能力强、适合远距离通信。缺点:速度相对较慢(在相同时钟频率下)。并行通信:数据的多位(如8位、16位)同时通过多条并行的信道(如8根数据线)传输。像多车道的公路,多辆车可以并排同时行驶。优点:速度理论上是串行的N倍(N为线数)。缺点:成本高(线多)、线间干扰严重(信号同步困难),不适合远距离通信。单工:数据只能单向传输。一端固定为发送端,另一端固定为接收端。例如:广播、电视。

2025-09-05 18:32:15 729

原创 嵌入式学习日记(40)中断

当CPU响应某个中断时,会根据中断源的编号,自动到这个表中查找对应的入口地址,并跳转到该地址去执行相应的中断服务程序。是指当一个中断服务程序正在执行时,有更高优先级的中断源发出了请求,CPU暂停当前的中断服务,转而去响应和处理更高优先级的中断,待高优先级中断处理完毕后,再返回继续执行原低优先级中断服务程序的过程。:指当计算机执行正常程序时,系统中出现某些急需处理的紧急事件或特殊请求,CPU暂停当前正在执行的程序,转而去处理这些事件,处理完毕后,再返回原程序继续执行的过程。它通过改变一个固定频率的方波的。

2025-09-04 18:02:07 362

原创 嵌入式学习日记(39)51单片机

STC89C52RC是一款由宏晶科技(STC)公司生产的8位单片机,它是全球范围内非常流行且经典的8051内核单片机。您可以把它理解为一台“超微型电脑”,它集成了CPU、RAM、ROM、定时器、串口、I/O口等部件到一块芯片上。因其功能强大、价格低廉、易于学习,被广泛应用于各种教学、工业控制、家电和电子制作项目中。编写代码:使用Keil C51等集成开发环境(IDE),用C语言或汇编语言编写程序。编译程序:将写好的源代码编译生成单片机可执行的.hex或.bin文件(机器码)。烧录程序:通过。

2025-09-03 18:01:45 877

原创 嵌入式学习日记(38)HTTP

所谓”事务“就是指一组SQL命令,这些命令要么一起执行,要么都不被执行。就会隐式地开启了一个事务,如果插入一条数据,就调用该函数一次,事务就会被反复地开启、关闭,会增大IO量。如果在插入数据前显式开启事务,插入后再一起提交,则会大大提高IO效率,进而加数据快插入速度。插入19000+行的数据:24.087827 s。插入19000+行的数据:0.094387 s。2. http -->超文本传输协议。3. html -->超文本标记语言。1. url--->统一资源定位符。浏览器---->服务器。

2025-08-30 17:57:52 164

原创 嵌入式学习日记(37)数据库

select * from 表名 where 列 like "__梅";年-月-日 时:分:秒。create table 表名(列名1 数据类型,列名2 数据类型,列名3 数据类型);select * from 表名 where 列 like "%梅";3. 插入数据时,主键值自动增长列给NULL,让其自动增长。insert into 表名 values(值1, 值2, 值3);select 列名1,列名2,列名n form 表名;

2025-08-29 19:11:09 444

原创 嵌入式学习日记(36)TCP并发服务器构建——epoll

3. epoll通知内核开始进行事件监测 :int epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout);2. 添加关注的文件描述符:int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);1. 使用红黑树(二叉树)实现文件描述符集合的存储,没有文件描述符上限限制,提高查找效率;events:保存返回的到达事件的结果(数组)

2025-08-28 17:36:36 1139

原创 嵌入式学习日记(35)TCP并发服务器构建

为了解决多线程或者多进程模型,在服务器运行过程,频繁创建和销毁线程(进程)带来的时间消耗问题。3. 使用select传递集合表给内核,内核开始监测事件 select()4. 当内核监测到事件时,应用层select将解除阻塞,并获得相关的事件结果。在不创建新的进程和线程的前提下,使用一个进程实现对多个文件读写的同时监测。exceptfds:其他事件的文件描述符集合。readfds:读事件的文件描述符集合。writefds:写事件的文件描述符集合。成功:返回内核监测的到达事件的个数。

2025-08-27 18:06:34 437

原创 嵌入式学习日记(34)HTTP协议

2. 应答机制:TCP对于每一包数据都会给出相应的应答。发送数据时序列号表示这包数据的起始编号,响应报文中的确认号是接收方收到的最后一个字节编号+1。3. 超时重传机制:当数据发送出去等待指定时间没有收到响应,此时认为这包数据丢失则进行冲传。Connection: keep-alive ---->长连接:连接保持一定时间。4. 滑动窗口机制:一段缓冲区,缓存TCP已发送未收到响应,准备发送等数据。3. 捎带应答机制:ACK报文可能和应用层的数据同时发送。ACK:响应报文标志位。

2025-08-26 17:27:57 251

原创 嵌入式学习日记(33)TCP

AA C0 00 00 00 F0 00 BB 10 A0 00 00 00 10 校验 BB AA C0 00 00 00 F0 00 BB 10 A0 00 00 00 10 校验 BB AA C0 00 00 00 F0 00 BB 10 A0 00 00 00 10 校验 BB。2. 接收方数据处理速度较慢,导致多包数据在接收缓冲区缓存,应用层读时,一次将多包数据读出。TCP粘包问题:发送方应用层发送的多包数据,将来在接收方可能一次读到,多包数据产生了粘连。

2025-08-23 18:34:06 996

原创 嵌入式学习日记(32)Linux下的网络编程

2)编辑--》虚拟网络编辑器--》更改设置--》VMnet0---》桥接至--》当前PC正在上网的网卡上--》应用--》确定。公有IP:由电信公司直接分配,并需要付费的IP地址, 可以直接访问internet。

2025-08-22 18:49:24 951

原创 嵌入式学习日记(31)信号、共享内存

管理员信号:只能按照默认方式处理,不能够被忽略和捕获 9) SIGKILL 19) SIGSTOP。使用内存映射技术,减少的数据的反复拷贝,提高了通信效率。编写程序,检测用户是否输入,如果用户3s内没有输入,则超时一次,如果超时3次则自动退出。功能:设置一个闹钟,当闹钟时间到达时,向自己所在的进程发送一个SIGALRM的信号。SIG_DFL:以缺省方式处理(系统默认方式)19)SIGSTOP: 让运行态的进程进入停止态(暂停)强制停止。函数的地址:以捕获方式处理(自定义)

2025-08-19 18:49:49 763

原创 嵌入式学习日记(30)线程通信、进程通信

(2) 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放(执行流本身使用着一把锁并不释放,还在请求别的锁)。(3) 不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺(A执行流拿着锁,其它执行流不能释放)。(1) 互斥条件:一个资源每次只能被一个进程使用(一个执行流获取锁后,其它执行流不能再获取该锁)。2. 读阻塞:读端和写端都存在,从管道中读数据,若管道为空,则发生读阻塞。1. 写阻塞:读端和写端都存在,向管道中写数据,当管道满时,发生写阻塞。写端:pipefd[1]

2025-08-18 19:52:54 598

原创 嵌入式学习日记(29)线程

5. 销毁锁:int pthread_mutex_destroy(pthread_mutex_t *mutex);4. 解锁:int pthread_mutex_unlock(pthread_mutex_t *mutex);3. 加锁:int pthread_mutex_lock(pthread_mutex_t *mutex);1. 分离属性:不需要被其他线程回收的线程称为分离属性得到线程,将来会被操作系统所回收。2. 非分离属性:可以被其他线程回收或者结束的线程,称为非分离属性的线程。

2025-08-16 19:16:45 291

原创 嵌入式学习日记(28)进程、线程

线程是轻量级的进程,也可以实现多任务并发,由进程创建。

2025-08-15 22:03:53 199

原创 嵌入式学习日记(27)进程

2、让该进程成为孤儿进程,被系统回收。如何避免僵尸进程:1、子进程退出后父进程及时回收空间。孤儿进程:父进程在子进程之前消亡,子进程成为孤儿进程。命令用于显示当前进程状态。僵尸态Z:进程执行结束后空间未被回收。就绪态R:正在执行,未被CPU调度。结束态X:进程执行结束后空间被回收。运行态R:正在执行,被CPU调度。不可唤醒态D:使进程无法被调度。2.进程调度:由操作系统完成。1.执行结束 2、空间回收。1.进程创建 fork()可唤醒态S:阻塞等待进程。暂停态T:被暂停的进程。

2025-08-14 17:54:20 882

原创 嵌入式学习日记(26)UI技术

NULL:让操作系统自己分配用户空间。2. 获取显示设备相关参数(分辨率,像素格式)---》ioctl。失败:MAP_FAILED((void *)-1)Linux内核专门为图形化显示提供的一套应用程序接口。addr :映射的用户空间首地址。length:要映射的空间大小。1. 打开显示设备(/dev/fb0)3. 建立显存空间和用户空间的内存映射。4. 向映射的用户空间写入RGB颜色值。成功:映射的用户空间首地址。fd:显示设备文件描述符。prot: 操作权限。offset:偏移量。

2025-08-13 18:10:32 309

原创 嵌入式学习日记(25)文件IO

whence:要偏移的相对位置 SEEK_SET:文件开头位置 SEEK_CUR:文件当前读写位置 SEEK_END:文件末尾。O_CREAT: 创建文件。stdin ---->标准输入设备 ---->0。stderr ---->标准出错设备-----> 2。stdout ---->标准输出设备----->1。3. 无缓冲 0k -------->出错信息对应的设备。

2025-08-12 17:54:30 771

原创 嵌入式学习日记(24)标准IO、流定位接口

fgets :1、从指定文件读取最多一行 2、保留“\n”,加“\0” 3、最多读 size - 1 个字符,最后一位放“\0”gets :1、从终端读取 2、将末尾“\n”换成“\0” 3、读取时没有限制,可能造成越界访问。功能:向文件中写入nmemb个大小是size的数据到文件中。功能:从文件中读取nmemb个大小是size的数据。返回值:成功:返回实际写入的元素个数。返回值:成功:返回实际读取的元素个数。ptr:要写入的数据的首地址。nmemb:要写入的元素个数。nmemb:要读取的元素个数。

2025-08-11 17:59:59 262

原创 嵌入式学习日记(23)LINUX软件编程——文件操作

2、读写 fgetc/fputc fgets/fputs fread/fwrite。2、文件IO:Linux内核提供的操作方法——系统调用。1、标准IO:C语言库提供的操作方法——库函数。c :字符设备文件——输入输出设备、传感器。3、关闭 fclose。b :块设备文件——存储类文件。l :软链接文件——快捷方式。s :套接字文件——网络通信。p :管道文件——进程间通信。1.文件操作——一切皆文件。2、多任务——进程、线程。d :目录文件——文件夹。

2025-08-09 18:06:08 164

原创 嵌入式学习日记(22)树

树: n ( n≥0 )个结点的有限集合。n=0 ,空树。在任意一个非空树中,有且仅有一个特定的根结点当 n>1n>1 时,其余结点可分为 mm 个互不相交的有限集合 T1,T2,T3,…,TmT1,T2,T3,…,Tm ,其中每一个集合又是一个树,并且称谓子树。

2025-08-08 18:45:29 290

原创 嵌入式学习日记(21)顺序表、哈希表

哈希存储:将要存储的数据的关键字和存储位置之间建立起对应关系,这个关系称为哈希函数。存储时通过对应的哈希函数将数据映射到指定位置,查找时仍通过该函数找到数据。哈希冲突(哈希矛盾):key1!= key2,f(key1) = f(key2)利用链地址法创建哈希表制作电话簿。存储位置 = f(key)

2025-08-07 17:55:26 144

原创 嵌入式学习日记(20)栈

队列:允许从一段进行数据插入,另一端进行数据删除的线性存储结构,插入称为入队,删除称为出队,入队端称为队尾,出队端称为队头,遵循先进先出原则(FIFO)offset_of :获取内核链表中的链表节点到结构体起始位置的偏移量。顺序栈:数据存储在顺序表(数组),分为满增栈、满减栈、空增栈、空减栈。栈:1、局部变量 2、函数的形参、返回值 3、函数的调用关系。栈结构:只允许从一段进行数据的插入及删除的线性存储结构。内核链表不将数据存储在节点中,而是将节点嵌入到数据中。满、空:根据栈顶是否存在数据判断。

2025-08-06 19:05:50 159

原创 嵌入式学习日记(19)双向链表

Makefile 由一系列规则(rules)组成,每条规则定义如何生成目标文件及其依赖关系。◦ prerequisites:依赖的文件或目标(空格分隔)◦ target:生成的文件名或操作名称(如 clean)◦ recipe:执行的命令(必须以 Tab 开头)4、链接,处理多文件及函数的链接关系。1、预处理,处理和 # 相关的指令。3、汇编,将汇编指令生成二进制指令。◦ $^:所有依赖文件(去重):比目标更新的依赖文件。◦ $<:第一个依赖文件。◦ $*:% 匹配的部分。◦ $@:当前目标名称。

2025-08-05 19:09:42 141

原创 嵌入式学习笔记(18)单向链表

2、编辑→虚拟网络编辑器→更改设置→VMnet0→桥接→桥接到PC正在上网的网卡→应用→确定。valgrind :内存探测工具,用来监测内存错误和内存泄露。1、虚拟机→设置→网络适配器→桥接模式→确定。利用快慢指针法找到链表的倒数第K个元素。利用快慢指针法找出链表的中间值。

2025-08-04 20:13:19 163

原创 嵌入式学习日记(17)——数据结构

数据结构内容:1、链表(单向、双向、循环、内核)2、栈 3、队列 4、二叉树 5、哈希表 6、常用算法。(4)散列结构(哈希结构):将数据的存储位置与元素间的关键字建立起对应关系。(2)、线性关系:元素之间存在一对一的关系(顺序表、链表、队列、栈)(4)、图形结构:元素之间存在多对多的关系(网状结构)(3)、树形结构:元素之间存在一对多的关系(二叉树)链表:存储数据的对象->属性(变量)、行为(函数)2、对链表进行操作:插入、删除、查找、修改、销毁。(1)、集合:元素之间平等的集合关系。

2025-08-02 19:26:37 153

原创 嵌入式学习日记(16)

按位与:将两数二进制展开,按位进行与运算;功能:指定位清零,要求操作数与整型相兼容。<< 左移:将一个数二进制展开,左移几位就删去前几位,并在后面补上对应个数的0。将不同类型的数据组合为一个整体,谷歌编程规范要求首字母大写,大括号后有分号。结构体的初始化顺序与声明顺序一致,若进行部分初始化,剩下的部分默认为0。| 按位或:将两数二进制展开,按位进行或运算;2、在结构体成员中找到最长的成员,最终按该成员的长度对齐。1、默认按CPU位数对齐,最终大小为8的整数倍。结构体的声明允许嵌套。

2025-07-31 19:52:31 208

原创 嵌入式学习日记(15)

动态内存分配 memory allocate。使用动态内存分配需要包含一个标准库头文件。函数指针:指向函数的指针,降低程序耦合性。指针数组作为函数参数,形参是二级指针。二级指针:指向指针的指针。

2025-07-30 19:34:23 159

原创 嵌入式学习日记(14)

int (*p)[10] 数组指针 int *p[10] 指针数组。sizeof(&a[0]) = 8 , sizeof(&a[0])相当于 sizeof(int*)sizeof(a) = 40 , sizeof(a) 相当于 sizeof(int[10])指针函数是指返回值为指针类型的函数,不能返回局部变量地址。a[i][j] 等价于 *(*(a + i) + j)二维数组作为函数参数传递,形参是指向一维数组的指针。void *p 万能指针,不能做指针运算。

2025-07-29 17:55:05 154

原创 嵌入式学习日记(13)

迭代器:提供一种方法顺序访问聚合对象中的元素,而无需暴露其底层表示。迭代器模式将遍历逻辑从聚合对象中分离出来,使得聚合对象可以专注于数据存储,而迭代器负责遍历。对指针类型进行加法运算,p + n 的结果依旧是指针,新指针是在原来的地址上加 n * (sizeof(基类型))个字节。指针与指针之间不能求和,可以求差,结果表示相差几个基类型(要求两个指针基类型相同)利用字符串指针编写遍历函数及有效字符长度函数。快速排序 算法复杂度 nlgn。指针函数:返回值为指针的函数。利用指针函数实现二分法查找。

2025-07-28 19:43:15 142

原创 嵌入式学习日记(12)

i = 1000 直接访问 *p = 1000 间接访问。双引号与尖括号的区别在于文件名使用的是相对路径还是绝对路径。2、从定位处开始向后偏移 sizeof (基类型)的字节。64位操作系统下地址占8字节,32位占4字节。3、将偏移后的那部分内存当作一个基类型变量。1、根据指针变量所保存地址去内存中定位。此处的 * 是类型说明,不是指针运算。指针的作用:在被调函数中修改主调。gcc -E 表示只做预处理。

2025-07-26 17:32:44 192

原创 嵌入式学习日记(11)

4、在两个或多个有包含关系的作用域中定义的同名标识符,外层在内层不可见(就近原则)static 的作用:1、定义静态局部变量2、限制函数的使用范围为本身。register int k :定义寄存器变量,提高读写速率,不可寻址。变量的生存期分为静态与动态,静态生存期与程序的运行周期相同。2、在没有包含关系的两个不同作用域中的同名标识符互不影响。静态区(全局区):全局变量、静态局部变量。栈区:局部变量、函数形参、返回地址。全局变量的生存期为静态生存期。

2025-07-25 17:15:10 157

原创 嵌入式学习日记(10)

栈的数据结构:FILO first in last out ,先进后出。函数传参是值传递,无法在被调函数中改变原函数中的变量。栈区、堆区、字符串常量区、代码区、静态区。指针传参能在被调函数中修改主调。将函数调用到本地:地址传导。函数参数默认自右向左传参。求斐波那契数列的第n位。利用函数实现二分查找法。

2025-07-24 18:19:25 151

原创 嵌入式学习日记(9)

求二维数组的列数:sizeof(a[0]) / sizeof(a[0][0])可以将二维数组 a[i][j] 看作是由 m 个长度为 n 的数组组成。求二维数组的行数:sizeof(a) / sizeof(a[0])函数:判断输入年份是否为闰年及输出给定区间的闰年。可以省略元素个数,但是只能省略行数。若无 return ,返回值不确定。函数:输入年月,得到该月的天数。将二维数组以列为单位逆序排列。函数的作用:提高代码的复用性。若未定义,返回值默认为整型。函数的返回值不能为数组。

2025-07-23 19:02:45 228

原创 嵌入式学习日记(8)

fgets(s,sizeof(s),stdin) :从终端获取数组中的元素。创建一个中间数将数组分为两部分,判断要查找的数在哪个部分,循环这一操作。当数组中的元素不为结束标志时计数,得到的结果就是数组中的有效字符个数。<string.h> :用于调用操作字符数组的函数的头文件。将 s1 数组中的元素一个一个复制到 s2 数组中去。字符数组的作用:使字符串常量能在程序中动态变化。比较字符串大小: strcmp(s1,s2)将数组 s2 的内容连接到数组 s1 后面。\0 :空字符,是字符数组的结束标志。

2025-07-22 19:02:13 195

原创 嵌入式学习日记(7)

数组的长度 length = sizeof(a) / sizeof(a[0]) :数组的元素个数可以通过数组在存储空间占的总字符数除以一个元素的长度得到。一维数组的初始化:在定义数组时使用初始化列表器,为初始化的元素默认为0。选择排序:将数组中的元素从前到后两两比较,比较后将较大的数字往后置位放。数组的下标超出数组元素的个数会导致越界访问,可能覆盖存储中的其他数据。冒泡排序:将相邻的元素进行比较,较大的元素放在右边。创建数组和引用数组元素时的中括号具有不同的功能。数组的数组名代表的是数组的首元素的地址。

2025-07-21 22:58:45 315

原创 嵌入式学习日记(6)

do while 与 while 的区别:do while 先执行再判断表达式真假,至少会执行一次;循环控制的三要素:1、循环变量初始化语句 2、循环的执行条件 3、使循环趋于结束的语句。break 语句会打断 for 语句中的表达式3的计算,只打断break所处的该层循环。三目运算符,若表达式1为真,则结果为表达式2;若表达式1 为假,结果为表达式3。continue 循环短路语句:打断该次循环,进行下一次循环。循环结束时,循环变量的值为首次时循环结束的值。= 0)等价于 if(a)

2025-07-19 18:01:39 114

原创 嵌入式学习日记(5)

判断一个年份是否为闰年:year % 4 == 0 && year % 100!表达式阶段:&&左操作符若为0,右操作数截断不计算;||左操作数若为1,右操作数截断不计算。连续关系表达式从左往右计算,计算后将结果0或1带入继续计算,因此要避免使用连续比较。i 和 i == 0都可以用来判断 i 是否为0。在语句中将不同功能的程序分开运行,降低程序耦合性。关系表达式结果是整型,1表示真,0表示假。return 终止程序运行。&&逻辑与:有0即为0。

2025-07-18 19:46:25 142

空空如也

空空如也

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

TA关注的人

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