
. 函数调用栈main函数中调用foo, foo中调用bar.遵循后进先出,栈向下生长,RBP指向当前栈帧的底部(高地址),RBP会随着函数栈的切换变化2. 野指针/悬垂的成因与预防空指针指针值明确等于NULL野指针指针存随机垃圾地址悬垂指针指针存曾经有效、但对象已经销毁的旧地址。2.1 野指针成因:未初始化预防:指针定义时立刻初始化不知道指向哪里就赋值NULL2.2 悬垂指针成因:指针本身保存曾经合法的地址但是这个地址对应的内存对象已经被销毁生命周期结束例如:场景 1返回局部栈变量的地址场景 2free()堆内存之后指针没有置 NULL场景 3结构体 / 数组对象销毁外部还保存它的成员地址预防:禁止返回局部栈变量的地址。需要返回用 malloc 堆或者 static 变量。free(p)之后立刻手动赋值p NULL;把悬垂转为安全空指针3. 串口丢失数据情况问题本质生产速度 消费速度数据溢出丢失数据过载生产者ISR 中断硬件源源不断产生数据串口收到字节、DMA 收到数据产生数据很快。消费者main 主循环做协议解析、运算、打印处理慢。如果没有 RingBufferISR 里面直接做解析处理。一旦处理慢新的数据又来了就会覆盖寄存器丢失数据还会拉长 ISR 执行时间破坏系统实时性。原因:中断来不及处理 → 中断丢失 / 覆盖硬件层面UART 收到一个字节硬件把字节放到 DR 寄存器同时触发 RXNE 中断。 如果你 ISR 执行太慢还没读完 DR下一个字节又来了新字节直接覆盖 DR 寄存器旧字节 →硬件丢字节。解决思路ISR 只干一件事把字节搬走存到内存缓冲区立刻退出 ISR。硬件寄存器尽快腾空不让新来的数据把它覆盖。这就是 RingBuffer 干的活。解决方案DMA 硬件缓冲区 软件 RingBuffer工程最常用DMA 把数据填到硬件接收 buffer半满 / 满触发一次中断。ISR 中把 DMA 这一批字节批量拷贝进软件 RingBuffer立刻退出 ISR。main 循环从 RingBuffer 取出字节做协议解析业务。DMA减少中断次数免除 CPU 单字节搬运。RingBuffer做流量削峰抵抗瞬时突发数据。就算 DMA依然需要软件环形缓冲区做二级缓冲。DMA 的硬件缓冲区一般不大不能当长期缓存。4. 链表相关理解每个节点是使用malloc分配的内存并获得其指针通常是使用这个指针来进行操作。链表头指针通常会遇到临界条件需要单独考虑。节点的构成vlaue 指向下块节点的指针。