I/O多路转接 什么是I/O多路转接?对大量的文件描述符进行I/O事件监控。IO事件包括:可读事件、可写事件、异常事件函数selectint select( int nfds, fd_set *readfds, fd_set *writefds,fd_set *exceptfds, struct timeval *timeout );参数nfds:在下面3个文件描述符集中找到最大的文件描述符,然后+1。参数readfds和writefds和exceptfds:描述符集的指针,可以将它看成是一个数组。这3
getline getlinegetline源码,根据源码编写自己的getline函数,只保留核心功能,。#define GETDELIM_GROWBY 64/** * @brief 读取一行数据 * * @param lineptr 数据存放缓冲区 * @param n lineptr的大小 * @param stream * @return ssize_t 成功返回读取到的数量,失败返回-1 */ssize_t mygetline( char **lineptr, size_t *n, FIL
文件IO缓冲 文件I/O缓冲系统I/O调用和C语言库I/O函数在操作磁盘文件时会对数据进行缓冲介绍read() 和 write() 调用在操作磁盘文件时不会直接发起磁盘访问,而是仅仅在用户空间缓冲区和内核缓冲区高速缓存之间复制数据。在后续某个时刻,内核会将其缓冲区的数据刷新到磁盘。当把缓冲区中的数据取完,这时内核会将文件的下一段内容读入缓冲区。采用这一设计,使 read() 和 write() 调用的操作更为快捷。Linux 内核对缓冲区的大小没有固定上限。受限于:物理内存总量处于其他目的对物理内存的需求
Linux内存映射 内存映射按文件分:文件映射:将一个文件的一部分直接映射到调用进程的虚拟内存中匿名映射:没有对应文件,被映射的分页会初始化为0按权限分:私有映射:写时复制,变更不会再底层文件进行共享映射:变更发生在底层文件将上面两两组合:私有文件映射:使用一个文件的内容来初始化一块内存区域私有匿名映射:为一个进程分配新的内存共享文件映射:代替 read() 和 write() 、IPC共享匿名映射:实现相关进程实现类似于共享内存进程执行 exec() 时映射会丢失,但通过 fork()
System V 共享内存 System V 共享内存fork() 创建的子进程会继承其父进程附加的共享内存段API 函数创建或打开共享内存#include <sys/types.h>#include <sys/shm.h>int shmget( key_t key, size_t, int shmflg );参数 key:由 IPC_PRIVATE 或 ftok() 生成的键参数 size:表示需分配共享内存的字节数内核是以系统分页大小的整数被来分配共享内存的,所以会 size 会被提
System V 信号量 System V 信号量API 函数创建或打开一个信号量集#include <sys/types.h>#include <sys/sem.h>int semget( key_t key, int nsems, int semflg );成功返回信号集的标识符参数 key:由 IPC_PRIVATE 或 ftok() 返回的键参数 nsems:创建信号集时:nsems 指定信号量的数量,必须大于0获取信号集时:nsems 必须小于等于集合的大小参数 s
ELF目标文件分析 ELF目标文件分析源代码#include <stdio.h>int printf( const char* format, ... );int global_init_var = 84;int global_unint_var;void func1( int i ){ printf( "%d", i );}int main( void ){ static int static_var = 85; static int static_var2
System V 消息队列 消息队列创建消息队列#include <sys/types.h>#include <sys/msg.h>int msgget( key_t key, int msgflg )成功返回消息队列的标识符,它是消息队列的句柄。失败返回-1和设置error参数 key 是一个键,用于生成唯一的标识符。可由 IPC_PRIVATE或 ftok() 生成。参数 msgflg 是权限位和下面这些位组成:IPC_CREAT:没有于指定 key 对应的消息队列,则新建一个I
Keil的编译器优化级别和调试视图 Keil的编译器优化级别和调试视图Compiler User Guide: Compiler optimization levels and the debug view编译器执行的精确优化取决于选择的优化级别,以及您是针对性能还是代码大小进行优化。编译器支持以下优化级别:0最小优化。 关闭大多数优化。 启用调试时,此选项可提供最佳调试视图,因为生成的代码的结构直接对应于源代码。 所有干扰调试视图的优化都被禁用。 特别是:断点可以设置在任何可到达的点上,包括死代码。变量的值在其范围内的任何地
vTaskNotifyGiveFromISR源码分析 以STM32平台为例,在STM32中数值优先级越低,逻辑优先级越高。 void vTaskNotifyGiveFromISR( TaskHandle_t xTaskToNotify, BaseType_t *pxHigherPriorityTaskWoken ) { TCB_t * pxTCB; uint8_t ucOriginalNotifyState; UBaseType_t uxSavedInterruptStatus; configASSERT( xTaskToNotify ); (
FLASH预取 FLASH预取在stm32中,我们的代码都是放在flash中的,内核是M3,内核要读flash中的code,它是一条一条读一条一条执行的。读完第一条,还没读第二条代码时,内核先会把将要读的读的第二条代码先取好,放好等待它去读,这个过程称为预取指。Cortex处理器采用的是三级流水线的哈佛结构,一条指令的执行分为:取指阶段(Fetch stage)、译码阶段(Decode stage)、执行阶段(Execute stage)。CPU 通常需要 4 个周期( 72Mhz下, 2 个等待周期)读取 64
3. 无重复字符的最长子串 滑动窗口解题思路left 和 right 都处于最左边指向right 不断向右遍历直到末尾(在遍历期间遇到了重复的元素 right 就停下来,然后 left 开始向右遍历直到删除重复的元素,然后 right 继续向右遍历)在遍历期间不断更新最长子串的长度代码class Solution {public: int lengthOfLongestSubstring(string s) { int ret = 0; int left = 0;
LVGL v7移植到ARM平台 本次移植的是LVGL v7.110硬件平台:野火IMX6ULL参考博客:实践分享 | 基于framebuffer的lvgl的移植使用_嵌入式大杂烩-CSDN博客⭐建立一个lvgl项目 — 百问网LVGL系列教程 1.0 文档 (gitee.io)1 下载所需要的仓库git clone git://github.com/lvgl/lvgl.git -b v7.11.0 #官方图形库git clone git://github.com/lvgl/lv_drivers.git -b v7.11..
freetype显示中英文 freetype显示中英文参考博客:04.freetype显示中文_//查无此人的博客-CSDN博客_freetype 中文freetype的安装与使用_explore_world的博客-CSDN博客_freetype安装 使用freetype来显示中文汉字和英文字符_mlove编程-CSDN博客3.数码相框-通过freetype库实现矢量显示 - 诺谦 - 博客园 (cnblogs.com)1 安装freetypefreetype-2.10.0.tar.gz链接:https://pan.b
modbus-tk学习笔记 对于modbus ASCII 模式,使用的是高位字节在前,低位字节在后。使用LRC校验。对于modbus rtu 模式,使用的是低位字节在前,高位字节在后。使用CRC校验。参考博客:modbus 入门篇,不冗长,很好理解!MODBUS学习笔记——modbus tk modbus TCP主机实现_物联网 IoT 经验分享-CSDN博客_modbus_tkmodbus协议中的寄存器理解0.前言modbus是一种古老但是高效的应用层协议。在嵌入式和PC机领域有多种方法实现modbus协议栈,mo.
模拟IIC(HAL库) 有关IIC的详细教程请看博主的另一篇文章本文只展示HAL库代码 /** * @brief 初始化IO * @param 无 * @retval 无 */void IIC_GPIO_Config(void){ GPIO_InitTypeDef GPIO_InitStruct; IIC_GPIO_CLK_ENABLE(); GPIO_InitStruct.Pin = IIC_SCL_PIN | IIC_SDA_PIN;