<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[xufenglinger的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/xufenglinger</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; xufenglinger]]></copyright><item><title><![CDATA[嵌入式学习---驱动开发基础]]></title><link>https://blog.youkuaiyun.com/xufenglinger/article/details/142343770</link><guid>https://blog.youkuaiyun.com/xufenglinger/article/details/142343770</guid><author>xufenglinger</author><pubDate>Wed, 18 Sep 2024 21:21:52 +0800</pubDate><description><![CDATA[（2）超级用户模式（Supervisor）：也称为管理模式，通常用于操作系统内核，具有更高的权限，可以访问所有资源和硬件。（7）未定义模式（Undefined）：当处理器遇到未定义的指令时，进入此模式，用于处理未定义的行为。（6）异常模式（Abort）：当出现内存访问错误等异常时，处理器进入此模式，用于处理这些异常。（3）中断模式（IRQ）：当外部中断发生时，处理器进入此模式，允许处理器快速响应中断请求。（4）快速中断模式（FIQ）：用于处理更高优先级的中断，响应速度比IRQ模式更快。]]></description><category></category></item><item><title><![CDATA[嵌入式学习--linux系统提供的显示接口”framebuffer“]]></title><link>https://blog.youkuaiyun.com/xufenglinger/article/details/142152231</link><guid>https://blog.youkuaiyun.com/xufenglinger/article/details/142152231</guid><author>xufenglinger</author><pubDate>Wed, 11 Sep 2024 22:50:11 +0800</pubDate><description><![CDATA[2.利用framebuffer实现输出一个字。1.利用framebuffer绘制图像。]]></description><category></category></item><item><title><![CDATA[嵌入式学习---Linux中的画面显示]]></title><link>https://blog.youkuaiyun.com/xufenglinger/article/details/142124345</link><guid>https://blog.youkuaiyun.com/xufenglinger/article/details/142124345</guid><author>xufenglinger</author><pubDate>Wed, 11 Sep 2024 09:11:56 +0800</pubDate><description><![CDATA[显示屏：800*600（横向有800个像素点，纵向有600个像素点）RGB颜色模式：（8个bitR，8个bitG，8个bitB）Linux内核为显示提供的一套应用程序接口（驱动内核支持）2.获取显示设备相关参数（分辨率、位深度）通过内存映射技术，向显存空间写入RGB值。1.打开显示设备（/dev/fb0）显卡（显存（保存像素点的值））4.写入RGB颜色值。]]></description><category></category></item><item><title><![CDATA[嵌入式学习---哈希表]]></title><link>https://blog.youkuaiyun.com/xufenglinger/article/details/142068555</link><guid>https://blog.youkuaiyun.com/xufenglinger/article/details/142068555</guid><author>xufenglinger</author><pubDate>Mon, 09 Sep 2024 20:41:43 +0800</pubDate><description><![CDATA[哈希表的基本工作原理是将关键字（Key）通过哈希函数转换为一个整型数字（哈希值），然后将该数字对数组长度进行取余操作，取余结果作为数组的下标，将对应的值（Value）存储在该下标对应的数组空间中。由于哈希函数的输出范围有限，而输入范围可能很大，因此不同的关键字可能会映射到相同的索引位置，即发生冲突。例如，当哈希表的负载因子（已填充元素与总容量的比例）较低时，哈希表中可能会存在大量的空闲空间。然而，找到一个完美的哈希函数是非常困难的，因为不同的应用场景对哈希函数的要求也不同。]]></description><category></category></item><item><title><![CDATA[嵌入式学习---栈，队列]]></title><link>https://blog.youkuaiyun.com/xufenglinger/article/details/141969196</link><guid>https://blog.youkuaiyun.com/xufenglinger/article/details/141969196</guid><author>xufenglinger</author><pubDate>Fri, 06 Sep 2024 21:17:24 +0800</pubDate><description><![CDATA[在使用数组实现的队列中，如果队列的尾部已经到达数组的末尾，但数组的前部仍有空闲空间，此时队列将无法继续入队，产生假溢出。：特别是在使用数组实现的队列中，如果队列的长度远小于数组的长度，那么数组的大部分空间将被浪费。虽然队列的遍历通常比栈更简单（因为不需要额外的空间来保存遍历过程中的元素），但在某些情况下（如需要频繁遍历队列），队列的遍历效率可能不是最优的。栈的底层是由数组实现的。栈的遍历通常需要额外的空间来保存遍历过程中的元素，因为栈的后进先出特性使得遍历过程与元素的自然顺序相反。入栈：在栈顶插入元素。]]></description><category></category></item><item><title><![CDATA[嵌入式学习---内核链表]]></title><link>https://blog.youkuaiyun.com/xufenglinger/article/details/141942593</link><guid>https://blog.youkuaiyun.com/xufenglinger/article/details/141942593</guid><author>xufenglinger</author><pubDate>Thu, 05 Sep 2024 22:48:12 +0800</pubDate><description><![CDATA[因为对每一种不同的数据，所构建出来的链表都是跟这些数据相关的，所有的操作函数也都是数据密切相关的，换一种数据节点，则所有的操作函数都需要一一重新编写，这种缺陷对于一个具有成千上万种数据节点的工程来说是灾难性的。在某些实现中，还可能包含一个指向数据本身的指针，但在Linux内核的链表中，节点本身并不直接存储用户数据，而是将用户数据保存在包含链表节点的结构体中。在双向链表中，链表头还可能包含指向链表最后一个节点的指针，以及一个指向链表第一个节点的指针。②针对标准节点，设计由标准节点构成的标准链表的所有操作。]]></description><category></category></item><item><title><![CDATA[嵌入式学习----双向链表]]></title><link>https://blog.youkuaiyun.com/xufenglinger/article/details/141905652</link><guid>https://blog.youkuaiyun.com/xufenglinger/article/details/141905652</guid><author>xufenglinger</author><pubDate>Wed, 04 Sep 2024 22:32:30 +0800</pubDate><description><![CDATA[双向链表（Doubly Linked List）是一种常见的数据结构，它由一系列节点组成，每个节点包含数据和两个指针，分别指向其直接前驱和直接后继的节点。单向链表：若要删除一个节点或在某个节点后插入一个新节点，你需要访问该节点的前一个节点，这在没有头节点的情况下可能需要从头遍历链表。双向链表：由于可以双向遍历，删除节点或在节点后插入新节点时，可以直接访问到前一个节点，这使得插入和删除操作更加灵活和高效。双向链表：每个节点包含两个指针，一个指向前一个节点，一个指向后一个节点，因此可以双向遍历。]]></description><category></category></item><item><title><![CDATA[嵌入式学习----数据结构]]></title><link>https://blog.youkuaiyun.com/xufenglinger/article/details/141872706</link><guid>https://blog.youkuaiyun.com/xufenglinger/article/details/141872706</guid><author>xufenglinger</author><pubDate>Tue, 03 Sep 2024 21:50:50 +0800</pubDate><description><![CDATA[这意味着，它存储的是数组首元素的地址，但与普通指针不同的是，通过它可以知道数组的大小（如果指针类型明确指定了数组的长度）。然而，在C语言中，直接声明一个“指向数组的指针”的语法并不直接支持指定数组的长度，但可以通过指针的运算或类型定义来间接实现。这些指针可以指向相同类型的数据，也可以指向不同类型的数据（但在大多数情况下，为了类型安全，它们会指向相同类型的数据）。单道连续分配只有内部碎片。程序的设计：将现实中大量而复杂的问题以特定的数据类型和特定的存储结构存储在内存中，并在此基础上实现某个特定的功能的操作；]]></description><category></category></item><item><title><![CDATA[嵌入式学习----IO多路复用]]></title><link>https://blog.youkuaiyun.com/xufenglinger/article/details/141646929</link><guid>https://blog.youkuaiyun.com/xufenglinger/article/details/141646929</guid><author>xufenglinger</author><pubDate>Wed, 28 Aug 2024 18:32:13 +0800</pubDate><description><![CDATA[例如如果有客户端进行连接，则，再调用accept()函数与4号socket进行连接，连接后返回一个新的socket号，且需要监听读事件，则再通过epoll_ctl()将新的socket号以及对应的事件（如read读事件）写入fd中，epoll_wait()进行监听。如网卡想通过IO来向系统传输一个数据，就通过中断获取CPU时间片，将该数据放置就绪事件序列中，等待CPU下一次进行epoll_wait()即可获取到对应数据，无需再通过往fd中注册socket号对应的事件等等。EPOLLOUT ： 写事件。]]></description><category></category></item><item><title><![CDATA[嵌入式学习----基于TCP连接的并发式网络服务器]]></title><link>https://blog.youkuaiyun.com/xufenglinger/article/details/141614341</link><guid>https://blog.youkuaiyun.com/xufenglinger/article/details/141614341</guid><author>xufenglinger</author><pubDate>Tue, 27 Aug 2024 22:44:40 +0800</pubDate><description><![CDATA[多进程流程：socket()---bind(）---listen()---accept() ---fork(）阻塞IO：fgets,scanf,read,recv,getchar（用来实现多个IO同步的效果）TCP实际上是单循环的服务器，只能建立一对一连接，其他人不能再与其建立连接，之前只有一个套接字。信号驱动IO：实现：（当终端有输入的时候应该会触发，发射信号，才会执行）非阻塞IO：非阻塞就是访问内核，有数据带着数据返回，没有数据也带着返回。特点：     1、异步通知io的方式，节省CPU。]]></description><category></category></item><item><title><![CDATA[嵌入式学习----TCP和UDP通信的内核实现]]></title><link>https://blog.youkuaiyun.com/xufenglinger/article/details/141474500</link><guid>https://blog.youkuaiyun.com/xufenglinger/article/details/141474500</guid><author>xufenglinger</author><pubDate>Fri, 23 Aug 2024 21:14:32 +0800</pubDate><description><![CDATA[具体来说，当发送方连续发送多个数据包时，由于TCP的缓冲机制，这些数据包可能会被合并成一个大的数据包发送给接收方，或者在接收方由于接收缓冲区的原因，多个数据包被合并在一起处理，这就是粘包现象。数据头中存储了数据体的大小等信息，接收方在接收到数据后，先解析数据头，根据数据头中的信息来提取数据体，从而避免粘包问题。例如，如果B正确收到了A发送的一个序号为501、长度为200字节的报文段，那么B期望收到的下一个数据序号是701，于是B在发送给A的确认报文段中把确认号置为701。]]></description><category></category></item><item><title><![CDATA[嵌入式学习----网络通信之TCP协议通信]]></title><link>https://blog.youkuaiyun.com/xufenglinger/article/details/141438552</link><guid>https://blog.youkuaiyun.com/xufenglinger/article/details/141438552</guid><author>xufenglinger</author><pubDate>Thu, 22 Aug 2024 22:10:25 +0800</pubDate><description><![CDATA[通过函数创建的socket首先会用bind进行绑定，然后通过listen转化为一种特殊的socket，这种socket具体监听的作用，当监听的socket遇到其他客户端发来的通信链接请求时，会产生一个等待连接的队列，随后accep函数将从队列中第一个等待连接请求开始产生一个用于通信的socket，然后通过accept产生的socket完成客户端和服务器端的通信过程。套接字文件描述符默认是阻塞的，即如果没有客户端请求连接的时候，此时accept会阻塞，直到有客户端连接；]]></description><category></category></item><item><title><![CDATA[嵌入式学习---进程间通信及网络通信]]></title><link>https://blog.youkuaiyun.com/xufenglinger/article/details/141403716</link><guid>https://blog.youkuaiyun.com/xufenglinger/article/details/141403716</guid><author>xufenglinger</author><pubDate>Wed, 21 Aug 2024 22:15:19 +0800</pubDate><description><![CDATA[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个数)]]></description><category></category></item><item><title><![CDATA[嵌入式学习--管道通信与信号]]></title><link>https://blog.youkuaiyun.com/xufenglinger/article/details/141306122</link><guid>https://blog.youkuaiyun.com/xufenglinger/article/details/141306122</guid><author>xufenglinger</author><pubDate>Sun, 18 Aug 2024 21:48:28 +0800</pubDate><description><![CDATA[有名管道是Linux系统中一种特殊的文件类型，它允许不相关的进程之间进行通信。有名管道在文件系统中具有具体的路径和名称，因此可以被多个进程共同访问。类似文件操作：进程可以使用open(), read(), write(), 和close()等函数对有名管道进行操作。返回值：前一个信号处理函数的地址，或在设置新的处理函数时返回SIG_ERR。open()：用于打开一个文件或管道，并返回一个文件描述符，以便后续操作。mkfifo()：用于创建一个有名管道，需要指定管道的路径和访问权限。]]></description><category></category></item><item><title><![CDATA[嵌入式学习--线程之间的资源竞争]]></title><link>https://blog.youkuaiyun.com/xufenglinger/article/details/141269827</link><guid>https://blog.youkuaiyun.com/xufenglinger/article/details/141269827</guid><author>xufenglinger</author><pubDate>Fri, 16 Aug 2024 21:26:10 +0800</pubDate><description><![CDATA[有名管道，或称为FIFO（First In First Out），是一种持久的管道，它们在文件系统中表现为特殊文件，因此可以被任何有权访问的进程使用，而不局限于具有亲缘关系的进程。有名管道可以跨越进程的创建和销毁，即使创建它们的进程终止后，这些管道仍然存在，直到被系统或管理员明确删除。无名管道在文件系统中没有对应的文件名，因此它们是匿名的，只在创建它们的进程之间可见。管道是一种在Unix和类Unix操作系统中用于进程间通信（IPC）的机制，它允许数据从一个进程（或线程）流向另一个进程（或线程）。]]></description><category></category></item><item><title><![CDATA[嵌入式学习---与线程有关的操作]]></title><link>https://blog.youkuaiyun.com/xufenglinger/article/details/141233173</link><guid>https://blog.youkuaiyun.com/xufenglinger/article/details/141233173</guid><author>xufenglinger</author><pubDate>Thu, 15 Aug 2024 22:42:39 +0800</pubDate><description><![CDATA[1.pthread_join    //需要自己回收  ---线程的属性 (可结合性)  --- 一般是子线程 在较短时间内运行完。2.pthread_detach  //可分离属性    ---子线程运行很久才结束 ---  设置分离属性。@retval  //退出状态值  //传的是，退出状态值 对应的地址。//NULL 默认属性  --- 普通锁。@mutex     //就是要初始化的 互斥锁变量。]]></description><category></category></item><item><title><![CDATA[嵌入式学习---进程借宿函数wait/waitpid，以及线程相关]]></title><link>https://blog.youkuaiyun.com/xufenglinger/article/details/141200758</link><guid>https://blog.youkuaiyun.com/xufenglinger/article/details/141200758</guid><author>xufenglinger</author><pubDate>Wed, 14 Aug 2024 21:51:16 +0800</pubDate><description><![CDATA[非阻塞：父进程会查看子进程状态，当子进程没有状态改变时，父进程会执行自己的任务，等待下一次再来查看（故使用非阻塞时要写入循环）@retval  //退出状态值  //传的是，退出状态值 对应的地址。@start_routine  -- 线程执行函数 (线程回调函数)//注: 线程回调函数 --完成线程任务功能的函数。//在那个线程中调用，获得的就是那个线程的tid。@retval  --- 用来保存，退出状态值，所在空间的地址。options//选项有两种，默认是填0，表示默认，会造成阻塞效果。]]></description><category></category></item><item><title><![CDATA[嵌入式学习第二十四天]]></title><link>https://blog.youkuaiyun.com/xufenglinger/article/details/141175507</link><guid>https://blog.youkuaiyun.com/xufenglinger/article/details/141175507</guid><author>xufenglinger</author><pubDate>Tue, 13 Aug 2024 22:26:54 +0800</pubDate><description><![CDATA[execle和execvpe，“e”表示环境变量environ，可以调用extern char **environ作环境变量，在传参的最后要加环境变量environ；int execl(const char *path, const char *arg, ...) —— execl(“路径”，“程序名”，“参数”，NULL)；这意味着执行这些函数后，当前进程的代码和数据将被新程序的代码和数据取代，旧的程序不再执行。exec函数族的目的是为了让子程序去执行指定的程序，而不是父进程的副本。]]></description><category></category></item><item><title><![CDATA[嵌入式学习第二十三天]]></title><link>https://blog.youkuaiyun.com/xufenglinger/article/details/141142830</link><guid>https://blog.youkuaiyun.com/xufenglinger/article/details/141142830</guid><author>xufenglinger</author><pubDate>Mon, 12 Aug 2024 21:40:39 +0800</pubDate><description><![CDATA[进程（Process）：是动态的，是程序在内存中的一次执行过程，当程序被加载到内存并由。程序（Program）：是静态的，它是一组指令的集合，这些指令被存储硬盘上，，程序本身。不占用CPU或内存资源，直到它被加载到内存中执行。R：就绪状态，在就绪队列中等待CPU调度。Z：僵尸状态，进程已终止但未被父进程回收。功能:获得调用该函数进程的父进程pid号。T：停止状态，收到停止信号或正在被跟踪。S：可中断睡眠状态，等待某个事件完成。功能:获得调用该函数进程的pid。返回值:进程的pid号。]]></description><category></category></item><item><title><![CDATA[嵌入式学习第二十二天]]></title><link>https://blog.youkuaiyun.com/xufenglinger/article/details/141036996</link><guid>https://blog.youkuaiyun.com/xufenglinger/article/details/141036996</guid><author>xufenglinger</author><pubDate>Thu, 08 Aug 2024 21:54:40 +0800</pubDate><description><![CDATA[vim编辑器            gcc 编译器           gdb 调试器        make。根据用户id到/etc/passwd文件下解析获得。根据用户名到/etc/passwd文件下解析获得。根据gid到/etc/group文件中解析组信息。创建一个链接向oldpath文件的新符号链接文件。oldpath:被链接向的文件的路径。newpath:创建的新硬链接文件。makefile   工程管理工具。pathname:删除文件的路径。timep:保存时间空间的地址。]]></description><category></category></item></channel></rss>