自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 嵌入式学习---驱动开发基础

(2)超级用户模式(Supervisor):也称为管理模式,通常用于操作系统内核,具有更高的权限,可以访问所有资源和硬件。(7)未定义模式(Undefined):当处理器遇到未定义的指令时,进入此模式,用于处理未定义的行为。(6)异常模式(Abort):当出现内存访问错误等异常时,处理器进入此模式,用于处理这些异常。(3)中断模式(IRQ):当外部中断发生时,处理器进入此模式,允许处理器快速响应中断请求。(4)快速中断模式(FIQ):用于处理更高优先级的中断,响应速度比IRQ模式更快。

2024-09-18 21:21:52 598

原创 嵌入式学习--linux系统提供的显示接口”framebuffer“

2.利用framebuffer实现输出一个字。1.利用framebuffer绘制图像。

2024-09-11 22:50:11 414

原创 嵌入式学习---Linux中的画面显示

显示屏:800*600(横向有800个像素点,纵向有600个像素点)RGB颜色模式:(8个bitR,8个bitG,8个bitB)Linux内核为显示提供的一套应用程序接口(驱动内核支持)2.获取显示设备相关参数(分辨率、位深度)通过内存映射技术,向显存空间写入RGB值。1.打开显示设备(/dev/fb0)显卡(显存(保存像素点的值))4.写入RGB颜色值。

2024-09-11 09:11:56 581

原创 嵌入式学习---哈希表

哈希表的基本工作原理是将关键字(Key)通过哈希函数转换为一个整型数字(哈希值),然后将该数字对数组长度进行取余操作,取余结果作为数组的下标,将对应的值(Value)存储在该下标对应的数组空间中。由于哈希函数的输出范围有限,而输入范围可能很大,因此不同的关键字可能会映射到相同的索引位置,即发生冲突。例如,当哈希表的负载因子(已填充元素与总容量的比例)较低时,哈希表中可能会存在大量的空闲空间。然而,找到一个完美的哈希函数是非常困难的,因为不同的应用场景对哈希函数的要求也不同。

2024-09-09 20:41:43 957

原创 嵌入式学习---栈,队列

在使用数组实现的队列中,如果队列的尾部已经到达数组的末尾,但数组的前部仍有空闲空间,此时队列将无法继续入队,产生假溢出。:特别是在使用数组实现的队列中,如果队列的长度远小于数组的长度,那么数组的大部分空间将被浪费。虽然队列的遍历通常比栈更简单(因为不需要额外的空间来保存遍历过程中的元素),但在某些情况下(如需要频繁遍历队列),队列的遍历效率可能不是最优的。栈的底层是由数组实现的。栈的遍历通常需要额外的空间来保存遍历过程中的元素,因为栈的后进先出特性使得遍历过程与元素的自然顺序相反。入栈:在栈顶插入元素。

2024-09-06 21:17:24 494

转载 嵌入式学习---内核链表

因为对每一种不同的数据,所构建出来的链表都是跟这些数据相关的,所有的操作函数也都是数据密切相关的,换一种数据节点,则所有的操作函数都需要一一重新编写,这种缺陷对于一个具有成千上万种数据节点的工程来说是灾难性的。在某些实现中,还可能包含一个指向数据本身的指针,但在Linux内核的链表中,节点本身并不直接存储用户数据,而是将用户数据保存在包含链表节点的结构体中。在双向链表中,链表头还可能包含指向链表最后一个节点的指针,以及一个指向链表第一个节点的指针。②针对标准节点,设计由标准节点构成的标准链表的所有操作。

2024-09-05 22:48:12 390

原创 嵌入式学习----双向链表

双向链表(Doubly Linked List)是一种常见的数据结构,它由一系列节点组成,每个节点包含数据和两个指针,分别指向其直接前驱和直接后继的节点。单向链表:若要删除一个节点或在某个节点后插入一个新节点,你需要访问该节点的前一个节点,这在没有头节点的情况下可能需要从头遍历链表。双向链表:由于可以双向遍历,删除节点或在节点后插入新节点时,可以直接访问到前一个节点,这使得插入和删除操作更加灵活和高效。双向链表:每个节点包含两个指针,一个指向前一个节点,一个指向后一个节点,因此可以双向遍历。

2024-09-04 22:32:30 512

原创 嵌入式学习----数据结构

这意味着,它存储的是数组首元素的地址,但与普通指针不同的是,通过它可以知道数组的大小(如果指针类型明确指定了数组的长度)。然而,在C语言中,直接声明一个“指向数组的指针”的语法并不直接支持指定数组的长度,但可以通过指针的运算或类型定义来间接实现。这些指针可以指向相同类型的数据,也可以指向不同类型的数据(但在大多数情况下,为了类型安全,它们会指向相同类型的数据)。单道连续分配只有内部碎片。程序的设计:将现实中大量而复杂的问题以特定的数据类型和特定的存储结构存储在内存中,并在此基础上实现某个特定的功能的操作;

2024-09-03 21:50:50 1080

原创 嵌入式学习----IO多路复用

例如如果有客户端进行连接,则,再调用accept()函数与4号socket进行连接,连接后返回一个新的socket号,且需要监听读事件,则再通过epoll_ctl()将新的socket号以及对应的事件(如read读事件)写入fd中,epoll_wait()进行监听。如网卡想通过IO来向系统传输一个数据,就通过中断获取CPU时间片,将该数据放置就绪事件序列中,等待CPU下一次进行epoll_wait()即可获取到对应数据,无需再通过往fd中注册socket号对应的事件等等。EPOLLOUT : 写事件。

2024-08-28 18:32:13 788

原创 嵌入式学习----基于TCP连接的并发式网络服务器

多进程流程:socket()---bind()---listen()---accept() ---fork()阻塞IO:fgets,scanf,read,recv,getchar(用来实现多个IO同步的效果)TCP实际上是单循环的服务器,只能建立一对一连接,其他人不能再与其建立连接,之前只有一个套接字。信号驱动IO:实现:(当终端有输入的时候应该会触发,发射信号,才会执行)非阻塞IO:非阻塞就是访问内核,有数据带着数据返回,没有数据也带着返回。特点: 1、异步通知io的方式,节省CPU。

2024-08-27 22:44:40 368

原创 嵌入式学习----TCP和UDP通信的内核实现

具体来说,当发送方连续发送多个数据包时,由于TCP的缓冲机制,这些数据包可能会被合并成一个大的数据包发送给接收方,或者在接收方由于接收缓冲区的原因,多个数据包被合并在一起处理,这就是粘包现象。数据头中存储了数据体的大小等信息,接收方在接收到数据后,先解析数据头,根据数据头中的信息来提取数据体,从而避免粘包问题。例如,如果B正确收到了A发送的一个序号为501、长度为200字节的报文段,那么B期望收到的下一个数据序号是701,于是B在发送给A的确认报文段中把确认号置为701。

2024-08-23 21:14:32 593

原创 嵌入式学习----网络通信之TCP协议通信

通过函数创建的socket首先会用bind进行绑定,然后通过listen转化为一种特殊的socket,这种socket具体监听的作用,当监听的socket遇到其他客户端发来的通信链接请求时,会产生一个等待连接的队列,随后accep函数将从队列中第一个等待连接请求开始产生一个用于通信的socket,然后通过accept产生的socket完成客户端和服务器端的通信过程。套接字文件描述符默认是阻塞的,即如果没有客户端请求连接的时候,此时accept会阻塞,直到有客户端连接;

2024-08-22 22:10:25 1275

原创 嵌入式学习---进程间通信及网络通信

const struct sockaddr *dest_addr, //表示 要发送到的 地址 (网络地址 ip+端口号 )htons --- h(host) to n(network) s (short) //16位的数据。htonl --- h(host) to n(network) l (long) //32位的数据。网络层 //tcp/ip 协议 栈 (网络协议栈)端口号: 16位数值(unsigned short ) //0~65535 (65536个数)

2024-08-21 22:15:19 815

原创 嵌入式学习--管道通信与信号

有名管道是Linux系统中一种特殊的文件类型,它允许不相关的进程之间进行通信。有名管道在文件系统中具有具体的路径和名称,因此可以被多个进程共同访问。类似文件操作:进程可以使用open(), read(), write(), 和close()等函数对有名管道进行操作。返回值:前一个信号处理函数的地址,或在设置新的处理函数时返回SIG_ERR。open():用于打开一个文件或管道,并返回一个文件描述符,以便后续操作。mkfifo():用于创建一个有名管道,需要指定管道的路径和访问权限。

2024-08-18 21:48:28 149

原创 嵌入式学习--线程之间的资源竞争

有名管道,或称为FIFO(First In First Out),是一种持久的管道,它们在文件系统中表现为特殊文件,因此可以被任何有权访问的进程使用,而不局限于具有亲缘关系的进程。有名管道可以跨越进程的创建和销毁,即使创建它们的进程终止后,这些管道仍然存在,直到被系统或管理员明确删除。无名管道在文件系统中没有对应的文件名,因此它们是匿名的,只在创建它们的进程之间可见。管道是一种在Unix和类Unix操作系统中用于进程间通信(IPC)的机制,它允许数据从一个进程(或线程)流向另一个进程(或线程)。

2024-08-16 21:26:10 330

原创 嵌入式学习---与线程有关的操作

1.pthread_join //需要自己回收 ---线程的属性 (可结合性) --- 一般是子线程 在较短时间内运行完。2.pthread_detach //可分离属性 ---子线程运行很久才结束 --- 设置分离属性。@retval //退出状态值 //传的是,退出状态值 对应的地址。//NULL 默认属性 --- 普通锁。@mutex //就是要初始化的 互斥锁变量。

2024-08-15 22:42:39 936

原创 嵌入式学习---进程借宿函数wait/waitpid,以及线程相关

非阻塞:父进程会查看子进程状态,当子进程没有状态改变时,父进程会执行自己的任务,等待下一次再来查看(故使用非阻塞时要写入循环)@retval //退出状态值 //传的是,退出状态值 对应的地址。@start_routine -- 线程执行函数 (线程回调函数)//注: 线程回调函数 --完成线程任务功能的函数。//在那个线程中调用,获得的就是那个线程的tid。@retval --- 用来保存,退出状态值,所在空间的地址。options//选项有两种,默认是填0,表示默认,会造成阻塞效果。

2024-08-14 21:51:16 368

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

execle和execvpe,“e”表示环境变量environ,可以调用extern char **environ作环境变量,在传参的最后要加环境变量environ;int execl(const char *path, const char *arg, ...) —— execl(“路径”,“程序名”,“参数”,NULL);这意味着执行这些函数后,当前进程的代码和数据将被新程序的代码和数据取代,旧的程序不再执行。exec函数族的目的是为了让子程序去执行指定的程序,而不是父进程的副本。

2024-08-13 22:26:54 203

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

进程(Process):是动态的,是程序在内存中的一次执行过程,当程序被加载到内存并由。程序(Program):是静态的,它是一组指令的集合,这些指令被存储硬盘上,,程序本身。不占用CPU或内存资源,直到它被加载到内存中执行。R:就绪状态,在就绪队列中等待CPU调度。Z:僵尸状态,进程已终止但未被父进程回收。功能:获得调用该函数进程的父进程pid号。T:停止状态,收到停止信号或正在被跟踪。S:可中断睡眠状态,等待某个事件完成。功能:获得调用该函数进程的pid。返回值:进程的pid号。

2024-08-12 21:40:39 217

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

vim编辑器 gcc 编译器 gdb 调试器 make。根据用户id到/etc/passwd文件下解析获得。根据用户名到/etc/passwd文件下解析获得。根据gid到/etc/group文件中解析组信息。创建一个链接向oldpath文件的新符号链接文件。oldpath:被链接向的文件的路径。newpath:创建的新硬链接文件。makefile 工程管理工具。pathname:删除文件的路径。timep:保存时间空间的地址。

2024-08-08 21:54:40 927

原创 嵌入式学习第二十一天——与目录操作相关的函数

返回值:包含文件信息的结构体,出错或者读到目录流末尾返回NULL。返回值:成功返回包含路径空间的字符串首地址,失败返回NULL。返回值:成功返回目录流指针,失败返回NULL。参数:opendir的返回结果中目录流对象。|文件 | |设置| |文件权限 |返回值:成功 0,失败 -1;功能:关闭之前已经打开的目录流对象。返回值:成功返回0,失败返回-1。buf:保存工作路径空间的首地址。返回值:成功返回0,失败返回-1。pathname:目录文件的名字。返回值:成功返回0,失败返回-1。

2024-08-07 21:04:15 335

原创 嵌入式学习第二十天——标准io与文件io函数

它的参数 stream 是目标文件流对象,offset 是要偏移的字节距离,whence 决定偏移的起始位置,如 SEEK_SET(文件开头)、SEEK_CUR(文件当前位置)、SEEK_END(文件末尾)。需要注意的是,它不支持设备文件,一般用于普通文件。通过文件描述符从文件中读取数据,参数 fd 是文件描述符,buf 是存放数据空间的首地址,count 是要读取的数据个数。通过文件描述符向文件中写入数据,参数 fd 是文件描述符,buf 是要写入的字符串首地址,count 是要写入的字符个数。

2024-08-06 22:03:19 378

原创 嵌入式学习第十九天——文件操作

标准输入输出库,位置在/usr/include/stdio.hstdio.h-->stdio.c-->libc.so (so动态库文件/usr/lib)FILE 结构定义的对象 FILE * 称之为流对象,也叫文件流指针mode:这是一个指向字符串的指针,表示打开文件的模式。"r":以只读方式打开文件。文件必须存在。"r+":以读写方式打开文件。文件必须存在。"w":以写入方式打开文件。如果文件不存在则创建文件,如果文件存在则清空文件内容。"w+":以读写方式打开文件。

2024-08-05 21:52:44 318

原创 嵌入式学习第十八天---linux系统编程

注意until循环语句与其他循环不同,until循环的循环条件是指定条件为真时停止,为假时则会一直执行。为脚本添加可执行权限:chmod + x xxx.sh 或者 chmod + 777 xxx.sh。shell命令的集合,做操作系统相关的配置。bash 是Linux上具体的命令解释器。写脚本时备注语句用#而不是//和/*创建一个脚本:vi xxx.sh。ash是unix上的命令解释器。shell是命令解释器的统称。shell脚本边编译边运行。反引号``:用于执行命令。

2024-08-04 20:23:36 305

原创 嵌入式学习第十七天

共用体(Union)是C语言中的一种特殊数据类型,它允许在同一内存位置存储不同的数据类型。共用体的定义使用union关键字,并且可以包含多个成员,但在任何时刻,共用体的成员中只有一个可以含有值,其余成员则共享同一内存空间。要使用共用体,首先需要定义共用体类型,然后可以声明共用体变量并通过成员访问运算符(.)来访问其成员。共用体变量的地址与其成员的地址相同,因此修改共用体变量的任何成员都会影响其他成员的值。枚举类型的定义使用enum关键字,后跟枚举类型的名称和一组用大括号{}括起来的枚举常量。

2024-08-02 20:32:09 169

原创 嵌入式学习第十六天

(4)用预处理命令#pragma pack(n) 可以强制编译器按照指定的n来对齐,合法的n的数值分别是1、2、4、8、16。还可以用省略结构体标识符的方式来定义,此时定义的结构体只能使用此前定义时的变量名,不能在下面的程序中再定义其他变量名。(2)结构体成员按照结构体成员声明先后次序依次存放,并且每个成员的首字节放置的位置必须能够整除成员的字节数;(3)如果结构体某个成员的字节数大于CPU的字节数,则最长按照CPU的字节数对齐;使用有头链表可以避免指针的指针使用,降低复杂度。链表分为有头链表和无头链表。

2024-08-01 19:39:34 284

原创 嵌入式学习第十五天

表示定义一个指向函数的指针变量p,他不是固定指向哪一个函数的,只是表示定义了这样一个类型的变量,它是专门用来存放函数的入口地址的。一个函数在编译时被分配给一个入口地址,这个函数的入口地址就称为函数的指针。指针数组是一个数组,其每个元素是一个指针。如果一个指针变量存放的又是另一个指针变量的地址,则称这个变量为指向指针的指针变量或指向指针的指针。指向函数的指针变量的一般定义形式为:数据类型(*指针变量名)(函数参数 表列)。//指针地址为&p1 如果是*p1就是&p。//指针地址为&p 如果是p就是a的地址。

2024-07-31 19:53:19 204

原创 嵌入式学习第十四天

malloc:用于分配指定大小的内存空间,并返回指向该空间的指针。如果分配失败,则返回NULL。free:用于释放由malloc、calloc或realloc分配的内存空间。2.防止野指针:释放内存后,应将指针设置为NULL,以防止野指针的出现。动态内存分配:动态内存分配是指在程序运行时根据需要请求分配内存空间的过程。realloc:用于调整已分配内存的大小,可以增加或减少内存块的大小。3.注意内存越界:在操作动态分配的内存时,不得超出分配的范围。1.避免内存泄漏:确保每次分配的内存在不再需要时都被释放。

2024-07-30 22:38:05 130

原创 嵌入式学习第十三天

指针是用来穿地址的变量,即指针变量,是一种数据类型指针运算符是二级运算符,结合方向自右向左。

2024-07-29 19:50:34 313

原创 嵌入式学习第十二天

C语言中提供#include命令,双引号表示在当前的main.c所在的目录下,尖括号包起来表在/usr/include/目录下找。局部作用域:在花括号里的就是局部作用域,所定义的东西只能在自己所处的局部作用域生效(称为局部变量)(栈区)全局作用域:不在任何花括号里的就是全局作用域《所定义的变量称为全局变量(全局区),能够代替函数实现参数传递。注意:宏与函数的区别:宏在程序中直接展开,效率高;函数需要保护现场、恢复现场,效率不高,复用性强。标识符能够生效的范围是作用域,作用域分为全局作用域跟局部作用域。

2024-07-28 20:17:57 236

原创 嵌入式学习记录第十一天

3.二阶数组在封装函数时,行数不能通过sizeof(a)/ sizeof(a(0))算出来,只能由主调函数来提供,即需要在形参中定义一个变量,eg :int libary(int a[ ][ 4],int rows)数组传递的是a[0]的地址,即指针传参,所以可以在被调函数中修改主函数的值(数组传参不是拷贝数组,而是传递数组首元素地址,传递效率高于值传递)将数组作为函数参数传递,并没有将a的所有元素传过来,只是把a的首元素地址传过来(高效)需要传递两个参数:数组名(指针,首元素地址) 数组元素个数。

2024-07-26 20:19:08 222

原创 嵌入式学习记录第十天

(1)实参向形参的数据传递是“值传递”,单向传递,只能有实参传给形参。递归是循环的第五种表达形式,(无条件)的递归会导致栈区空间消耗殆尽造成程序崩溃。直接递归: f(1)-->f(2)-->f(2)-->f(1)递归调用会消耗大量内存空间(禁止对单片机使用递归作为循环表达)(2)堆区(向操作系统申请,用完归还,手动申请和销毁)(3)字符串常量区(开辟独立的内存空间装载字符串常量)(1)栈区(定义指针标量,指向堆区)间接递归:f(1)--> f(1)先进后出,后进先出(FILO)(4)静态区(全局区)

2024-07-25 20:18:37 179

原创 嵌入式学习记录第九天

返回值通常可以是任何基本数据类型(如整数、浮点数、字符等)返回值的类型在函数定义时指定。数组名代表着数组中的第一个元素的地址,即a和a[0]都代表着a[0][0]的地址,这三者的地址是一样的。函数调用时,实参的数量必须与函数定义中的形参数量一致,类型匹配。形参(形式参数):函数定义中的参数,用于接收调用函数时传入的实际值。这意味着函数接收到的是实参的副本,而不是实参本身。C语言中的函数是代码组织和重用的基本单元。实参(实际参数):调用函数时传递给函数的值或变量。实参的值会传递给对应的形参。

2024-07-24 20:36:59 323

原创 嵌入式学习记录第八天

字符串是以字符数组的形式表示,并且以空字符。注意使用gets时要注意字符数组定义的空间大小,以免造成越界访问。和右边界 end,一般为数组的起始和结束位置,即 begin。形参包括三部分,地址,要放入的字符数组大小,stdin。,则目标元素在右半部分,将左边界beign调整为。3.计算中间位置:计算当前查找范围的中间位置。,则目标元素在左半部分,将右边界end调整为。dest 指的是目标数组,src表示源数组。比较中间元素:将中间位置的元素。若s1 > s2,返回值大于0。,则找到了目标元素,返回。

2024-07-23 20:34:02 392

原创 嵌入式学习记录第七天

(4)在对全部数组元素赋初值时,由于数据的个数已经确定,因此可以不指定数组长度。(3)数组中元素在计算机中存放是连续的。定义时"[ ]"为类型说明符,引用时"[ ]"为下标运算符。(2)数组中元素存放是从下标小到下标大。(1)数组元素所占字节数相等,(1)在定义数组时对数组元素赋予初值,用花括号。"[n]"中n应大于等于0,但等于0时无意义。数组的数组名代表数组的首元素地址。2 .一维数组中元素的引用。(2)可以只给一部分元素赋值。数组越界访问会造成重大错误。4.求数组中最大值,次大值。

2024-07-22 21:30:01 192

原创 嵌入式学习记录第六天

是一个循环断路语句,从当前循环中跳出提前结束当前语句。与 while的区别:do while 对循环体至少会执行一次。使用while语句时,while(表达式)后没有分号。for循环嵌套时,内层循环比外层循环执行速度快。(3)有使循环趋于结束的条件。循环短路语句,意为终止本次循环,进入下一循环。使用do while 时,后面的分号不能丢。break只能跳出自己的循环,不能单独使用。(2)循环的执行条件。while(表达式)表达式3是使循环趋于结束的条件。(1)循环变量初始化语句。}while(表达式);

2024-07-21 22:45:12 215

原创 嵌入式学习记录第五天

(2)if语句1 else语句2。else if 语句n。else if 语句2。else if 语句3。C语言中关系运算符结果的数据类型为int型,结果非零即1。注意:在“&&”和“||”中存在一种表达式截断的情况。switch case 使用注意。(1)switch表达式中必须是整型或者与整型兼容。(2) case 后面必须是常量。c与c++里唯一的三目运算符:?三种形式:(1)if表达式语句。switch(表达式)1.关系运算符与关系表达式。2.逻辑运算符与逻辑表达式。

2024-07-19 21:04:15 274

原创 嵌入式学习记录

5.输入数据时遇到空格,回车,tab,或达到指定宽度,以及遇到非法输入,会认为该数据结束。3.当使用%d时无影响,但使用%c时,空格会作为字符输出(ASCII)其中括号内前半部分作用为格式说明,作用是将输出数据转换为指定的格式输出,后半部分则是要输出的变量数据。scanf 无法通过取地址来获得该变量所占字节数,默认地址空间为四字节,返回值是正确输入的个数。2." " 中不加其他东西,eg,"%d\n",会导致结果出错。向arm中写入数据-----输入。从arm中取出数据----输出。

2024-07-18 20:09:32 315

原创 嵌入式学习记录

const :用于将一个变量设置为只读变量,编译器内无法进行修改。int = unsigned short 只补零。(其中short为正数,补零;short为负数,补1)判断左右值的方法:用取地址&short = int 高位截断。int = short 符号位扩展。转换结果为临时变量,不对原操作数进行修改。一. 所有匿名变量(临时变量)都为右值。左值:通常指的变量,可进行自增自减操作。强制类型转换运算符( )“显式转换”右值:一般是常量,不能进行自增自减。

2024-07-17 19:50:01 182

原创 嵌入式学习记录

signed long int 长整形 字节数:8 范围:[-2^63 , 2^63 - 1]signed long long int 长长整型 字节数:8 范围 :[-2^63 , 2^63 - 1]signed short int 短整型 字节数:2 范围:[-2^15 , 2^15-1]\\ 代表一个反斜杠字符。\' 代表一个单引号。

2024-07-16 18:22:47 348 1

空空如也

空空如也

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

TA关注的人

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