- 博客(43)
- 收藏
- 关注
原创 MCU内存分配与管理
C语言内存分配一、内存分配1、内存分配的类型:在C/C++中内存分为5个区,分别为栈区、堆区、数据段(初始化数据区/静态数据区、未初始化数据区;或者是只读数据段Ro-data即常量数据,已经初始化读写数据段(RW-data),未初始化数据段即BBS(ZI-data))、代码区。静态内存分配:编译时分配。包括:全局、静态全局、静态局部三种变量。动态内存分配:运行时分配。包括:栈(stack): 局部变量。堆(heap): c语言中用到的变量被动态的分配在内存中。(malloc或.
2021-05-14 17:25:19
5563
1
原创 异常、崩溃、复位过程详解
本文阐述了嵌入式系统崩溃与复位的处理机制。崩溃流程始于硬件检测异常(如空指针操作),通过中断向量表执行处理函数,可选择打印信息、软件复位或等待看门狗复位。崩溃通常由硬件PMP单元检测非法访问触发。异常发生时,硬件自动保存上下文并跳转执行处理函数。复位分为软件复位(写特定值触发)和硬件复位(看门狗超时触发),两者最终都会重置寄存器并使PC指向复位地址重新启动。文章还指出HardFault等关键中断无法完全屏蔽。
2026-01-22 12:43:31
52
原创 【Linux】一文看懂linux进程
本文全面解析了Linux进程管理的核心概念和机制。首先介绍了进程的基本概念,将其定义为程序执行的动态实例,并对比了进程与程序的区别。详细阐述了进程的五大特征:动态性、并发性、独立性、异步性和结构性。重点讲解了进程控制块(PCB)的结构与作用,以及进程状态模型和切换机制。文章深入剖析了进程管理的核心系统调用,包括fork()创建进程、wait()/waitpid()等待子进程、exit()/_exit()终止进程、exec()替换进程等函数的使用和原理。此外,还分析了特殊进程如僵尸进程和孤儿进程的产生原因及处
2025-10-16 18:07:21
671
原创 核间通信机制
本文阐述了嵌入式多核系统中核间通信(ICC)的核心原理与实现机制。系统采用"共享内存+中断通知+通道管理"三层模型实现多核间数据交换。物理层通过共享内存区域实现零拷贝传输,并采用环形缓冲区和状态标志区避免竞态。驱动层利用中断机制实现核间握手,并通过Mailbox/IPC Notify和RPMsg协议实现不同粒度的数据传输。其中RPMsg协议将共享内存划分为环形缓冲区,使用vring描述符记录数据信息,为应用层提供字符设备接口。此外,专利方案采用虚拟通道技术实现无锁通信,提高系统效率。
2025-10-14 11:48:04
404
原创 Linux内存布局解析:虚拟内存和物理内存
本文深入解析Linux进程内存管理机制,从虚拟内存原理到实际内存布局。主要内容包括: 虚拟内存机制:每个进程拥有独立的4GB虚拟地址空间,通过MMU和页表实现虚拟到物理地址的转换。首次访问时触发缺页中断才真正分配物理内存。 内存布局结构:进程内存分为代码段、数据段、堆区(动态扩张)、栈区(函数调用)和共享内存区。堆通过brk/mmap系统调用扩张,栈随函数调用增长。 内存管理实践:malloc等函数先分配虚拟地址,实际访问时才分配物理页。介绍了VSZ、RSS等内存指标的含义,以及内存泄漏检测工具valgri
2025-10-13 12:01:27
912
原创 L2CAP、HFP与AVCTP详解
摘要:本文详细分析了蓝牙协议栈中HFP与AVCTP的协议层级关系。HFP基于RFCOMM协议实现通话控制和音频传输,而AVCTP用于音视频控制指令传输,两者同属应用层但使用独立信道。物理层ACL链路通过L2CAP协议被切分为多条逻辑信道,实现协议复用。L2CAP具有分段重组、差错控制等功能,支持面向连接、无连接和信令三种信道类型,确保不同协议数据在物理链路上并行传输而不互相干扰。文章还阐述了L2CAP的数据格式和处理流程,解释了HFP语音通话与AVCTP媒体控制能同时工作的底层机制。
2025-08-05 12:33:05
739
原创 IIC协议详解与项目注意事项
当一个主设备发送高电平(释放总线)而另一个发送低电平(拉低总线)时,发送高电平的主设备会检测到SDA线与自己发送的电平不符,便会知道总线上存在冲突,并立即放弃对总线的控制,从而保证了数据传输的完整性。一般来说,速率越高,总线电容越大,上拉电阻就需要越小。
2025-07-25 20:41:25
1068
原创 ELF文件详解
ELF 文件不仅仅是一个格式,它是 Linux 世界中程序的"灵魂容器",承载着程序从编译到执行的整个生命周期。ELF 文件不仅仅是一个格式,它是 Linux 世界中程序的"灵魂容器",承载着程序从编译到执行的整个生命周期。
2025-05-13 19:55:45
1451
原创 HID接口配置以及hid报表描述符示例
USAGE(1, 0x13), /* Usage (Vendor defined) 解绑配置:0:默认,未设置,1:解绑,2:绑定*/USAGE(1, 0x02), /* Usage (Vendor defined) MUTE状态,0:非静音状态,1:静音*/USAGE(1, 0x01), /* Usage (Vendor defined) 连接状态,0:断开,1:连接*/USAGE(1, 0x03), /* Usage (Vendor defined) 丢包率(0~100)*/*不会去卸载USB驱动。
2025-03-07 16:39:00
911
原创 网络编程知识点随笔
1、在嵌入式系统中,一个TCP客户端不能共用同一个端口号来建立两个不同的连接。TCP连接是由四元组(源IP地址、源端口号、目标IP地址、目标端口号)来唯一标识的。如果调用相关接口进行连接,会返回地址已被使用的错误。
2024-12-10 09:35:14
165
原创 经典蓝牙(BT/EDR)蓝牙配对与连接
当ACL 链路连接建立后,主设备会发起channel的连接请求,即L2CAP的连接,建立L2CAP的连接之后,主设备采用SDP去查询从设备的免提服务,从中得到rfcomm的通道号,然后主设备会发起rfcomm的连接请求建立rfcomm的连接。然后就建立了应用的连接。但是,对于低功耗蓝牙技术,低功耗的特性是需要特别考虑的,而且在实际的应用当中,不需要在每次connInterval都产生连接事件,因此引入了参数Lantancy,可以有效的减少连接事件的产生,connSlaveLatency= Latency。
2024-12-06 17:03:23
3191
3
原创 MQTT知识点随笔
如果同一个客户端使用不同的Client ID建立多个连接,broker会将它们视为不同的客户端。如果使用相同的Client ID,根据MQTT规范,broker应该关闭旧的连接以避免冲突。2.)状态管理:MQTT协议支持会话状态管理,包括消息的持久化和服务质量(QoS)保证。多个连接可能会导致状态管理变得复杂。4.)连接管理:多个连接可能会导致连接管理变得复杂,尤其是在需要维护连接的可靠性和一致性时。1. )资源消耗:每个连接都需要消耗客户端和broker的资源,包括内存和网络带宽。
2024-11-20 09:00:08
561
原创 TCP三次握手和四次挥手
第四次挥手后,客户端不会马上关闭。会再等待两个最大的报文段存活周期,防止服务端没有收到,服务端会重发,客户端会再次发送确认报文。
2024-10-31 09:02:47
285
原创 FreeRTOS队列分析
中断中做队列插入操作,如果队列上锁了,发送队列计数加1,如果没有上锁,不用对队列计数操作,把等待接收队列的任务放到就绪链表。//发送队列上锁,初始化为0,主要是针对退出临界区后,当前的队列发送未执行完,中断中发送队列,队列处理的同步。//队列解锁,根据pxQueue->cTxLock判断中断是否有发送队列,如果有,把等待接收队列消息的任务,插入到就绪列表。1、插入到队列中,数据拷贝时,都会进入临界区,关闭中断,不需要上锁,关闭中断后,不会发生任务调度,只有系统管理不到的中断优先级有可能执行程序;
2024-10-29 20:01:25
921
原创 嵌入式知识点
1、IIC的SCL SDA是开漏模式,标准模式波特率小于100K,快速模式波特率小于400K,快速模式的占空比,有1/2(高电平是1,低电平是2)和9/16。- 如果两个主设备同时尝试驱动数据线,其中一个设备将驱动为低电平,而另一个设备则会被开漏模式的开漏输出所隔离,从而避免了电流冲突。- 在某些情况下,使用开漏模式可以简化电路设计,因为不需要为每个I2C设备添加单独的上拉电阻。总的来说,开漏模式提供了一种灵活且可靠的方式,以支持I2C总线上的多设备通信和复杂的系统设计需求。知识点记录,持续更新!
2024-06-19 08:40:19
714
原创 FTP协议标准命令
然而,大多数 FTP 控制帧是简单的 ASCII 文本,可以分为 FTP 命令或 FTP 消息。FTP 消息是对 FTP 命令的响应,它由带有解释文本的应答代码构成。FTP 使用 TCP 生成一个虚拟连接用于控制信息,然后再生成一个单独的 TCP 连接用于数据传输。数据类型(A=ASCII,E=EBCDIC,I=binary)如果是文件名列出文件信息,如果是目录则列出文件列表。传输模式(S=流模式,B=块模式,C=压缩模式)数据结构(F=文件,R=记录,P=页面)从服务器上找回(复制)文件。
2024-06-16 21:04:59
1033
原创 USB知识点随笔
hid和uac等调用发送接口,都是先放到DMA,等主机的IN事物过来,就从DMA拿数据发出去。hid的中断间隔可配置,中断不需要等数据发送完成。3、hid传输,接收不一定按照枚举,端点初始化和报表描述符配置的中断来,发送一般都是按照中断来。不同的上位机,行为可能不一样。所以回调接口的处理要注意,可以使用同一个接口,或者两个接口都要同步处理。SPK_FEATURE_UNIT_ID:一般是声音等控制,但是这个音量和hid控制音量是没有关系的。SPK_SELECTOR_UNIT_ID:输入源选择。
2024-06-07 15:53:19
892
原创 SSL/TLS加密
SSL握手的场景很多,比如最常见的HTTPS,访问https://www.baidu.com 时,在进行HTTPS的应用数据传递之前,需要建立SSL的连接!1、服务端的公钥和私钥是一对,客户端会生成随机数,作为解密,公钥加密。由于访问的是https://www.baidu.com/,所以需要传输Subject是baidu.com的公钥证书,以供客户端认证服务端的身份。2、服务端的数字证书是权威的CA认证,可防止被恶意拦截,数字证书通过MD5验证,通过才可以进行数据交互。
2023-12-26 19:48:41
1289
1
原创 Bus hound使用
选择对应的endpoint发送数据,下图是hid发送命令窗口,发送命令要选择out,然后配置长度以及发送的数据。点击RUN和STOP,开始和停止数据抓取。根据设置的抓取字节数,数据量达到设置的字节数,就会停止抓取。连续相同的数据,后缀会计数,不会重复显示。这里勾选设备,选择要抓取数据的设备。双击设备名,可打开命令发送窗口。例如,双击USB Input Device,会弹出HID的命令发送窗口。可配置数据抓取的最大字节数,达到最大字节数,会停止数据抓取。如果没有破解,可配置最大值为512字节。
2023-06-28 18:36:08
4090
1
原创 nandflash和norflash的区别
nor flash 的传输效率很高,在1~4MB的小容量时具有很高的成本效益,但是很低的写入和擦除速度大大影响了它的性能。应用nand flash 的困难在于flash 的管理和需要的特殊接口。在NOR器件上运行代码不需要任何的软件支持,在NAND器件上进行同样操作时,通常需要驱动程序,也就是内存技术驱动程序(MTD),NAND和NOR器件在进行写入和擦除操作时都需要MTD。当讨论软件支持的时候,应该区别基本的读/写/擦操作和高一级的用于磁盘仿真和闪存管理算法的软件,包括性能优化。
2023-06-01 18:56:31
1618
原创 结构体字节对齐
结构体字节对齐 在用sizeof运算符求算某结构体所占空间时,并不是简单地将结构体中所有元素各自占的空间相加,这里涉及到内存字节对齐的问题。从理论上讲,对于任何变量的访问都可以从任何地址开始访问,但是事实上不是如此,实际上访问特定类型的变量只能在特定的地址访问,这就需要各个变量在空间上按一定的规则排列,而不是简单地顺序排列,这就是内存对齐。 内存对齐的原因: 1)某些平台只能在特定的地址处访问特定类型的数据; 2)提高存取数据的速度。比如有的平台每......
2022-07-16 15:32:29
1365
原创 Flash烧录
硕飞Flash编程器上位机软件FlyPRO V4.46】链接:https://pan.baidu.com/s/1aRxJ5n2FEDB00lut1vXJZA 提取码:jdp0【硕飞Flash编程器上位机软件使用手册】链接:https://pan.baidu.com/s/1O712RNGtj2APnl1KeogUCQ 提取码:no901、将烧录器【硕飞 SP8-B】的 Micro USB接口连接到电脑,如图所示,电源指示灯(PWR)红色点亮表示供电正常,状态指示灯(STA)绿色表示...
2021-07-08 16:39:18
4399
原创 NOP指令
NOP:表示延时一个周期指令ARM:两种表示方法__ASM("MOV R0,R0"); __NOP();C51:#include<intrins.h>中声明_nop_();
2021-07-05 15:23:45
2087
原创 “堆”,“栈“,“队列“的区别
什么是“堆”,"栈","堆栈","队列",它们的区别如果你学过数据结构,就一定会遇到“堆”,"栈","堆栈","队列",而最关键的是这些到底是什么意思?最关键的是即使你去面试,这些都还会问到,所以如果你不懂对你是损失很大的。堆栈都是一种数据项按序排列的数据结构,只能在一端(称为栈顶(top))对数据项进行插入和删除。要点:堆:顺序随意 栈:后进先出(Last-In/First-Out)堆 堆:什么是堆?又该怎么理解呢?①堆通常是一个可以被看做一棵树的数组对象。...
2021-05-21 18:02:12
121
原创 可重入函数和不可重入函数
可重入函数和不可重入函数在实时系统的设计中,经常会出现多个任务调用同一个函数的情况。如果有一个函数不幸被设计成为这样:那么不同任务调用这个函数时可能修改其他任务调用这个函数的数据,从而导致不可预料的后果。这样的函数是不安全的函数,也叫不可重入函数。相反,肯定有一个安全的函数,这个安全的函数又叫可重入函数。那么什么是可重入函数呢?所谓可重入是指一个可以被多个任务调用的过程,任务在调用时不必担心数据是否会出错。一...
2021-05-17 16:42:49
375
原创 不定长数组
不定长数组数组定义时会分配内存,如果想定义不定长数组,C语言不支持不定长数组,不能用array[],虽然编译能够通过,但是可能造成内存问题。但是我们可以通过动态数组实现一个不定长度的数组。...
2021-05-13 15:17:06
914
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅