自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 内存池实现

【代码】内存池实现。

2025-11-10 03:17:32 94 1

原创 tftp详细

​:提供友好的命令行界面​。

2025-09-24 01:40:16 312

原创 tftp实现

作为新入职的嵌入式软件工程师,我的导师指派了学习C++并实现时间触发协议(TTP)传输功能的任务,要求能够可视化传输进度。TTP协议是一种高可靠性的通信协议,特别适用于安全至上的硬实时嵌入式系统,如航空电子、汽车控制系统和工业自动化8。•​现代C++特性​:智能指针()、lambda表达式、移动语义1•​面向对象编程​:类的设计、继承、多态和封装技术•​内存管理​:RAII原则应用,避免内存泄漏1•​多线程编程​:使用std::mutex实现线程安全通信5。

2025-09-24 01:34:46 342

原创 线程池111

这个实现涵盖了线程池的核心机制,通过详细的注释和类比解释,你应该能够理解每个组件的作用和线程池的工作原理。线程池就是这样的"快递员管理系统",预先创建一组线程,有任务时分配给空闲线程执行。

2025-08-10 22:44:31 499

原创 线程锁-互斥、自旋、读写、原子操作、线程池

1.自旋锁2.互斥锁原子操作线程池。

2025-08-03 22:30:50 1136

原创 cmake入门学习

要实现单一 CMakeLists 文件支持多种编译器架构,同时保持项目结构和代码不变,需要使用 CMake 的。带有头文件cmake编译。

2025-07-27 19:18:52 342

原创 C++第8章:IO库

特性C语言 (stdio.h)基本函数cin, cout类型安全❌ (格式字符串易错)✅ (自动类型推导)扩展性❌ (无法扩展)✅ (支持自定义类型)面向对象❌✅错误处理errno流状态位cpp复制int stock;public:// 重载输出操作符// 保持对齐格式return os;// 重载输入操作符std::cout << "请输入产品信息 (名称 价格 库存): ";// 成功读取} else {// 失败处理。

2025-07-20 21:10:45 647

原创 C++ primer知识点总结

根据你提供的《C++ Primer》目录和你的需求(C语言背景转C++,侧重网络编程),我将为你制定一个全面的学习计划,包含知识点详解、C/C++对比、实战案例和分阶段项目练习。

2025-07-20 20:42:23 1151

原创 系统移植基础部分

以下是复位后20008000数据置1了,20008000读取数据成功 代表600000地址上的数据写入成功。地址范围 20000000-30000000。nand读取数据到对应地址。

2025-07-04 22:00:32 263

原创 nfs挂载

执行一:setenv bootargs 'console=ttySAC0,115200 root=/dev/nfs nfsroot=192.168.1.200:/home/linux/nfs/rootfs rw ip=192.168.1.17 init=/linuxrc'在uboot编辑界面修改nfs挂载ip。执行二:saveenv。

2025-05-11 15:38:08 196

原创 TFTP服务调试

2.检查tftp服务是否正常 在minicom中调试ping pc机的ip地址。在tftpboot目录下进行sudo minicom 启动内核时。原因:tftp协议的问题 、或者网卡配置的问题。解决:1.检查网线是否插好 多试几次。问题:程序启动卡在Loading阶段。2.进入boot调试。

2025-04-23 22:49:44 238

原创 IIC子系统驱动开发

应用层iic.c===》到dev.c驱动层===》核心层core.c===》总线驱动层s3c2410.c===》从机设备。IOCTL函数 通过IIC_SLAVE命令去匹配,匹配后将设备地址传入client结构体中,指定设备地址。open函数从应用层到驱动层dev.c 中获取设备号、适配器,确定哪个适配器adapter。.config文件中存放menuconfig配置好的结果。Kconfig创建menuconfig中的选项。

2025-03-28 17:22:58 571

原创 s3c2440启动流程

设置网卡后重新开关或者复位开发板,程序自动下载。下载Uboot程序 .bin。

2025-03-13 11:46:19 214

原创 静态库、动态库生成-使用

ltest1 是-l + test1(test1是libtest1.a的关键部分 前缀lib系统会自动加上,后缀.a也会自动加上,在gcc编译使用静态库时 只需要-ltest1 库名就行)./lib 是libtest1.a静态库所在路径(绝对路径和相对路径都可以)在gcc编译这行代码中 ./include 是head.h所在路径(绝对路径和相对路径都可以)3.gcc编译 -I路径 -L静态库路径 -ltest。2. ar rcs工具打包。

2025-03-10 19:09:41 217

原创 中断底半部和内核定时器 bus_type

第三步:给timer_list定时器结构体赋值,内部有函数,可以到时间开始执行功能,需要循环就在handle函数内部再定时一个时间。创建对象-> 初始化->在中断handler中调用(可以加延时)文件存放在adc3_device.c/adc3_driver.c。思想是将使用到的设备资源和需要配置的设备功能分开。第二步:初始化定时器,挨个赋值。在中断中调用,干一些耗时的事。例如:device文件中存放。初始化workqueue。第一步:创建定时器对象。

2024-12-23 10:23:18 288

原创 C++学习(QT版)

有两个类,只需要特化一个类,另一个类是确定的。

2024-12-18 15:49:04 504

原创 wireshark抓包工具

Wireshark 是一款功能强大的网络协议分析工具,广泛应用于网络故障诊断、安全分析、性能优化和教育学习等领域。通过实时捕获和详细解析网络数据包,Wireshark 帮助用户深入了解网络行为,诊断和解决网络问题,提高网络的安全性和性能。无论是网络管理员、安全工程师还是学生研究人员,Wireshark 都是一款不可或缺的工具。

2024-12-09 00:39:11 927

原创 FreeRTOS对ESP8266进行点灯

通过以上步骤,你可以在ESP8266模块上成功烧录FreeRTOS操作系统,并实现间隔一秒点灯的功能。关键步骤包括配置FreeRTOS、编写任务代码、编译和烧录固件,以及验证和调试功能。

2024-12-07 15:15:48 984 1

原创 Valgrind 工具

Valgrind 工具的memcheck插件可以非常详细地检测内存泄漏,并确定内存泄漏的位置。它不仅能检测内存泄漏,还能检测其他多种内存错误。以下是memcheck。

2024-12-04 10:36:58 696

原创 四层/七层模型、每层常用的协议

以下是这两个模型的详细介绍以及每层常用的协议。- **ICMP(Internet Control Message Protocol)**:同四层模型中的网络层。- **SMTP(Simple Mail Transfer Protocol)**:同四层模型中的应用层。- **TCP(Transmission Control Protocol)**:同四层模型中的传输层。- **HTTP(HyperText Transfer Protocol)**:同四层模型中的应用层。

2024-11-04 10:41:31 524

原创 PWM控制蜂鸣器

通过PWM控制蜂鸣器报警,可以灵活地调节蜂鸣器的音量和频率,从而实现不同的报警效果。无论使用预设的PWM函数还是自定义驱动程序,关键在于理解和实现PWM信号的生成和调节。在实际应用中,可以通过微控制器的定时器模块来实现精确的PWM控制,并结合硬件设计实现高效稳定的报警系统。

2024-10-23 09:25:07 2786

原创 MQTT协议

协议特点轻量级:MQTT的协议头非常小,通常只有2字节,使其非常适合低带宽和高延迟的环境。发布/订阅模式:客户端无需直接与服务器通信,而是通过MQTT代理进行间接通信。QoS(服务质量)级别:MQTT提供了三种消息传递的服务质量等级,允许开发者根据需求选择消息的可靠性。QoS 0:最多一次(At most once)——没有保证,可能丢失消息。QoS 1:至少一次(At least once)——确保消息至少发送一次,但可能会重复发送。

2024-10-23 01:34:26 564

原创 IIC通信与MAX30102采集血样数据+V4L2框架

MAX30102 是一个集成的脉搏血氧仪和心率监测传感器模块,通过 I²C 接口与微控制器通信,能够采集血氧浓度(SpO2)和心率数据。以下是通过 I²C 通信使用 MAX30102 采集并计算心率和血氧浓度的流程,并详细介绍 MAX30102 的工作原理。通过使用该框架,开发者可以轻松地实现对视频设备的访问和控制,以及高效地处理从设备捕获的视频数据。:一般建议读取一段时间内的多个样本(如 4 秒的数据),以获得更稳定的心率和血氧值。此时,设备开始将捕获的视频数据填充到之前入队的缓冲区中。

2024-10-23 01:22:35 1344

原创 IOCTL

ioctl函数内部实现功能,依靠已经设置好的宏命令CMD_SET_CHENNEL,和应用层传进来的宏匹配,是对应的宏就执行对应的操作,这样的内部宏可以设置非常多种,宏也有自己的定义方式下面有说明。下面的宏就是一个宏的生成器,将自己设置的设备树,命令编号,大小,传进去就会生成一个唯一的宏,方向是选择哪儿宏,IO/IOR/IOW/IOWR 只读只写读写。

2024-10-17 10:19:59 525

原创 字符设备驱动模块 dev和misc

其他部分与标准misc程序相同,由于按下k1这个中断是写入了内核程序,所以内核也就是操作系统一直都跑,只要按键按下,触发下降沿,就会在命令框中出现你的中断程序结果。代码部分与dev方式区别,misc_register 函数会自动添加节点,不再需要mknod /dev/led c 255 0。exit()刷新缓冲区_exit()不刷新缓冲区,printf内容存在缓冲区,程序结束才打印内容。开源协议CPL 写入后第一次向内核动态模块时,就不会提示不认识的警告。编译内核文件(静态、动态内核文件)

2024-10-10 22:07:20 419

原创 添加字符设备驱动全流程

printk不能打印浮点数,其他和printf一样。

2024-10-10 22:07:11 585

原创 UART:通用异步收发器 IIC

IICDS = data[ i ] 这一步,data先给他0x0这个内部地址,让他去0x90这个地址中的0x00地址找值;他会将100这个值返回给你;找到芯片上相关引脚(除了adc其他功能使用起来都需要配置对应引脚)温度传感器器件最高400k赫兹频率,上面50M/512大概100k。ack响应时,会拉低电平,没拉底则说明没有应答,异常结束。按照以上规则,对IIC进行初始化。添加这俩,就可以使用中断了。仲裁:谁电平低,谁先通信。mian函数中的使用。

2024-10-08 09:18:31 616

原创 驱动程序-启动内核

linux启动过程1.向ronflash中下载uboot.bin2.查看tfpt服务,并拷贝ulmage文件到tftpboot文件下tftp 192.168.1.200是进入了客户端,原本是在服务端3.安装nfs服务,并将rootfs拷贝到nfs服务目录下(拷贝压缩包,在该目录下解压)aping网络下载 uig文件启动内核新的内核地址 1.100 随便设每次启动都需要重新下载一次。

2024-10-07 17:20:48 634

原创 ARM点灯---看手册

unsigned long:无符号是因为地址都为正数,long是因为32位操作系统long为4个字节,64位操作系统,long为8个字节,如果写int 32位64位都是4字节,不同操作系统地址存放也不一样,所以为unsigned long型。一个程序可能会遇到内存泄漏问题,可能一次运行泄漏几M大小,执行几个小时才会泄漏到站崩溃,所以要查看是否有内存泄漏。0x56000010硬件地址(寄存器),与cpu中真正的寄存器不一样,那是真正的寄存器 这里只是硬件地址。0927下午 00:30。

2024-09-27 21:43:50 1167

原创 ARM架构

PC在 ARM 处理器中起到了指向当前执行指令地址的作用。PC的取指、解码、执行等过程是紧密联系在一起的,形成了处理器指令执行的基本循环。流水线设计允许指令在多个阶段并行处理,提高了处理器的效率,但也引入了冒险问题,需要通过结构设计和控制策略来解决。流水线(洗切炒)在 ARM 架构中,SP(堆栈指针)、LR(链接寄存器)和PC(程序计数器)是重要的寄存器,分别用于不同的目的。下面详细解释这些寄存器的功能和SP指向的位置。SP。

2024-09-27 09:52:27 1726

原创 进线程、framebuffer :帧缓冲

进程线程空间分布:stack中存储先进后出,从栈顶开始存储,慢慢往下压,直到超过8M ,越界进入堆区,则栈崩溃,如果往上存储的话,会越界到内核,设备崩溃。一个汉字多大字节:utf-8 编码下 1个汉字=3个字节国标gb 编码下 一个汉字=2个字节。

2024-09-24 15:34:58 427

原创 结构体对齐、函数传参、库移植

按固定位大小匹配地址,a:10+b:10=20位 <32位=4字节 20+20=40位>32位 所以a+b=20作为一个int型,int c:20 单独做4个字节(int) 10+10=20 (int)4个字节 ,20(int)4个字节,相加为8个字节。arm中需要的是用arm-linux-gcc编译的二进制可执行文件 所以在linux下nfs先用arm-linux-gcc编译好,arm中直接运行。挂载如果出现这样的错误,就先解除挂载 ,命令: umount /mnt。读一次写一次多久时间。

2024-09-21 22:16:59 433

原创 arm开发板通信

arm开发板通信- 直播视频-- 项目第二天下午 2024-09-20。linux和windows下操作开发板前提是开发板中已经导入系统。选择这个选项保存 然后选择Exit 退出 ,后给开发板上电。sudo minicom -s s设置minicom参数。有第二个红框(USB0)说明线链接进入Ubuntu。插入串口通信线后,设备管理器查看ch340对应的端口。查询Ubuntu版本(18.04)和内核(5.4)linux下的串口调试助手 minicom。开发板上电后 按回车即可操作了。

2024-09-20 21:44:56 695

原创 预处理、makefile、静动态库编写、nfs挂载、快捷命令

c查看预处理后的文件查看执行后的汇编代码。

2024-09-19 21:24:54 244

原创 栈、队列、树、哈希表

4. **动态扩容**:为了保持操作的效率,哈希表通常在达到一定负载因子(已存储元素数量与哈希表容量的比值)时进行扩容,这涉及到重新计算所有元素的位置并迁移到新的更大的哈希表中。2. **键值对存储**:哈希表存储数据的方式是键值对(Key-Value Pairs),其中键是通过哈希函数进行映射的,而值是存储的数据。6. **空间效率**:哈希表通常需要预分配一个足够大的内部数组来存储数据,这可能会导致空间的浪费,尤其是在负载因子较低的情况下。哈希表的存储和查找,体现的是一种思想。

2024-09-16 20:02:23 483

原创 数据结构-前三章

为了表示每个数据元素,ai与其直接后继数据元素ai+1之间的逻辑关系,对ai来说,除了存储其本身的信息外,还需要存一个指示器直接后续的信息。简单的来说,就是将原来单链表中最有一个元素的next指针指向第一个元素或头结点,链表就成了一个环,头尾相连,就成了循环链表。,线性表链式存储结构的特点是一组任意的存储单位存储线性表的数据元素,存储单元可以是连续的,也可以不连续。如果存在多个元素,第一个元素无前驱,最有一个没有后继,其他的元素只有一个前驱和一个后继。1,插入,删除元素需要移动元素o(n)

2024-09-11 21:25:24 787

原创 数据库sql

sqlite> insert into user3 (NULL,'李四',23,datetime('now'));注意:以上表的表字段,支持如下数据类型。create table 表名 (表字段 类型,表字段 类型,。//将数据库名称为xxx的数据库整体导出到脚本中。create table 表名(表字段1,表字段2,...);

2024-09-04 21:44:11 1188

原创 tcp udp

在IP数据包中,“标志(Flags)”字段是IP头部的一部分,用于控制和管理数据包的分片和重组。IP标志字段的目的是帮助处理较大的数据包,使其在网络中能够被有效地传输。标志字段中的DF标志决定了数据包是否可以被分片,而MF标志则帮助接收方知道数据包是否还有后续的分片。总的来说,TCP注重可靠性和完整性,适合需要确保数据准确传输的场景,而UDP注重速度和实时性,适合需要快速传输但可以容忍一定数据丢失的应用。假设有一个较大的数据包需要通过网络传输,由于网络中的MTU限制,它会被分成多个分片。

2024-09-03 21:12:30 965

原创 网络-多路io

用于获取文件描述符fd_r的当前状态标志。用于将fd_r的状态标志设置为非阻塞模式,确保对fd_r的读写操作不会阻塞。同样,和将标准输入(文件描述符 0)设置为非阻塞模式,使得读取标准输入的操作也是非阻塞的。通过这些设置,你可以确保读写操作在没有数据时不会导致程序阻塞,从而使程序能够在执行其他任务时保持响应。if( EEXIST!return 1;这段代码通过设置文件描述符fd_r。

2024-09-02 22:37:25 841

原创 线程(1)join、self

在清理函数中避免复杂的操作,尤其是可能阻塞的操作,以避免引入新的问题。重点:当我的程序中没有sleep时,线程是和主线程一块执行的,所以不知道子线程快还是主线程快结束,所以才需要加一个延时。tid1和tid2两个线程不知道谁先执行,程序自带一个主线程,主线程结束全部结束,所以在最后加上while死循环,void强转问题,不知道基类型是什么,无法开辟确定空间,*p可以+1,偏移一个字节,void偏移不知道多少个。,可以有效地管理线程中的资源,确保程序在多线程环境下的稳定性和可靠性。arg,清理函数的参数。

2024-08-23 09:08:51 1030

空空如也

空空如也

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

TA关注的人

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