01 编译与调试
编译与调试程序调试1.发生内存泄漏、程序等问题时,如何排查 日志 利用程序崩溃时的core dump文件进行分析 使用gdb运行core dump文件,并使用bt命令打印函数调用栈 使用valgrind等工具 2.程序崩溃的底层原理 应用程序不是自己挂了,而是OS检测到了它执行了非法操作,然会会给它发信号,如果该信号是“致命”的(进程没有捕获或无法处理),内核就会: 终止进程 可选地生成coredump 3.core dump是什么 当程序崩溃时,OS会将程序当时的内存镜像保存到一个文件中,通常名为 core 或 core.<pid>,它包含: 程序崩溃时的寄存器状态 各线程的函数调用栈 内存中的全局变量 / 局部变量 / 堆内容 代码段映射、动态库加载信息 信号(如...
00 C++面经
C/C++八股关键字static1.static的作用是什么 在函数体内 + 修饰局部变量:其访问权限在函数内,仅初始化一次,存储于静态存储区 在函数体外 + 修饰全局变量:将模块的全局变量限制在模块内部(仅供.c使用),不能跨文件共享 修饰函数:该函数仅可被本模块调用,不能作为接口暴露给其他模块 注意:static 与...
文件系统
文件系统总览定义:文件系统是负责管理和存储文件信息的软件(一般由OS提供),它会在==存储介质中建立一种特定的组织结构==(不同文件系统不同)包含操作系统引导区,inode区、目录,文件等 这样看这个概念可能比较晦涩难懂,说了跟没说一样,下面举个例子: 之前在使用W25Q64这个Flash芯片的时候,由于没有使用文件系统,它有一下这些缺点: 往里写数据、读数据的时候都得指定Flash上的具体的地址 有效数据的位置不方便记录,如果想使用存进去的数据,还得额外手记什么数据存到哪个地址里了 并且数据都是以page(256...
XV6
XV61.调试1.首先在一个终端里通过make qemu-gdb启动gdbserver 2.配置vscode的lauch.json,包括gdb路径、输入参数之类的 3.使用vscode开始调试 2.RISC-V ISAISA应该包含以下内容: 指令集 寄存器集 内存模型 异常与中断处理机制 特权级别 …(不同ISA包含的东西不一样) 参考链接 ch02-riscv-isa-introduction.pdf ch05-assemble-programming.pdf ch10-trap-exception.pdf RISC-V-中文参考手册 RISC-V ISA手册Part2 : 特权级别相关 特权级机制 - uCore-Tutorial-Guide-2024S 文档 特权等级RISCV包含4个特权等级 级别 编码 名称 0 00 用户/应用模式 (U, User/Application) 1 01 监督模式 (S, Supervisor) 2 10 H, Hypervisor 3 11 机器模式 (M,...
FreeRTOS
FreeRTOS线程管理TCB线程控制块是操作系统用于管理线程的一个数据结构,它会存放线程的一些信息,例如优先级、线程名称、线程状态等,也包含线程与线程之间连接用的链表结构,线程等待事件集合等,详细定义如下 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253typedef struct tskTaskControlBlock{ // 1. 栈指针 - 最重要的成员之一 // 当任务被切换时,它的当前上下文(寄存器值)就保存在这个栈顶。 volatile StackType_t * pxTopOfStack; // 2. 任务状态链表项 // 用于将TCB插入到不同的状态列表中(如就绪列表、阻塞列表、挂起列表)。 ListItem_t xStateListItem; // 3. 事件链表项 // 用于将TCB插入到事件列表(如队列、信号量)中,当任务因等待事件而阻塞时使用。 ...
08 STM32
STM32系统架构STM32F4系列的系统架构如图所示(来自User Manual): 可以看到内核通过3条总线连接到AHB(Advanced High-performance Bus)总线矩阵,然后与高速外设(DMA、MAC、USB…)、Flash、SRAM低速外设(通过APB总线桥接)连接 Data Sheet里面也有个比较好的架构图: ARM Cortex-M系列的CPU都包含以下3条总线: I-Bus:指令总线,负责在 0x0000_0000 – 0x1FFF_FFFF 之间的取指操作,访问的存储器对象是Flash D-Bus:数据总线,负责在 0x0000_0000 – 0x1FFF_FFFF 之间的数据访问操作,访问的存储器对象是Flash S-Bus:系统总线,负责在 0x2000_0000 – 0xDFFF_FFFF 和 0xE010_0000 – 0xFFFF_FFFF 之间的所有数据传送,取指和数据访问都算上,访问对象是SRAM和外设寄存器 不同内核实际上各个总线能访问的地址范围不一样 参考: Cortex-M3权威指南第六章 STM32...
05 FrameBuffer设备
FrameBuffer设备 帧缓冲设备的应用开发通常是对/dev/fbX这个帧缓冲设备文件进行I/O操作,在注册帧缓存设备时,会在内核中开辟一个缓冲区,可以把它看成指向显存的指针,通过修改这个缓冲区的内存,内核会同步更改显存,进而改变帧缓冲设备实际显示的内容 个人感觉这一章介绍的对于Framebuffer设备的应用开发API过于底层,实际开发应该不会用如此底层的API来开发,而是用Qt或者LVGL那样的框架进行开发,所以==这章学习的意义不是很大== 1.基本步骤对帧缓冲设备的应用开发主要包括以下几步: 1.打开/dev/fbX这个设备文件 2.通过ioctl()系统调用获得帧缓冲设备的一些重要信息:如屏幕的分辨率大小、像素格式,根据屏幕参数计算显示缓冲区的大小 3.通过存储映射 I/O 方式将屏幕的显示缓冲区映射到用户空间(mmap),之后就能像操作数组一样操作显存 4.映射成功后就可以直接读写屏幕的显示缓冲区,进行绘图或图片显示等操作了 5.完成显示后,调用 munmap()取消映射、并调用...
07 计算机网络
计算机网络网络体系结构对于网络体系结构的划分,主要有2种形式: OSI七层网络模型 看赛博二哈的八股(第115条) OSI(Open Systems Interconnection)模型由ISO提出,是一个理论分层框架,用于标准化网络通信过程。虽然实际网络并未完全采用OSI,但它对理解网络协议分层至关重要 层数 名称 功能 协议/设备示例 关键词 7 应用层 提供用户接口,实现具体应用功能(如文件传输、邮件收发) HTTP、FTP、SMTP、DNS 6 表示层 数据格式转换(加密、压缩、编码) SSL/TLS、JPEG、ASCII 5 会话层 建立、管理、终止应用程序间的会话 NetBIOS、RPC 4 传输层 提供端到端的数据传输(流量控制、错误恢复) TCP、UDP 端口号、TCP、 UDP 3 网络层 实现主机间的逻辑寻址和路由选择,跨越不同网络 IP、ICMP、路由器 IP地址、路由 器、ping通 2 数据链路层 将比特流封装成数据帧(使用MAC地址在网卡间通信) ARP、网卡、交换机、...
21 Camera驱动开发
Camera驱动开发Camera基础知识CMOS Sensor也常被简称为Sensor,它就是个光电转换器件,把光信号转换成电信号 特点: 只是一个裸芯片(die) 输出通常是 Raw Bayer 数据(RGGB/BGGR 等排列) 不含镜头、ISP、电路板等辅助模块 常见规格:分辨率(MP)、尺寸(1/2.3”)、像素尺寸、bit-depth(10/12-bit) 相机模组将Sensor、镜头、PCB、外壳等封装到一起的摄像头硬件模块,接口可以直接接主控 组成部分: CMOS Sensor → 输出 Raw 或 ISP 后的数据 镜头系统 → 聚焦光线到传感器 PCB 电路板 → 控制信号、时钟、I2C/CSI/USB 接口 ISP(可选)→ 有些模块自带 ISP,输出 NV12 / RGB / MJPEG 封装/外壳 →...
07 V4L2框架
V4L2框架简介V4L2是Linux内核中的一套驱动框架,为视频类设备(USB、CSI摄像头…)的驱动开发和应用层提供了一套统一的接口规范 V4L2将视频设备视为字符设备,例如/dev/videoX,用户可以通过标准的文件系统接口(如ioctl、open、read、write等)与之交互 在音视频开发领域,许多框架比如FFmpeg都是以V4L2作为基础开发的,所以这个框架还是比较重要的 工作流程 从流程图中可以看到,几乎对摄像头的所有操作都是通过 ioctl()来完成,搭配不同的 V4L2 指令请求不同的操作,这些指令定义在头文件 linux/videodev2.h 中 打开设备打开设备其实和别的类型的设备一样,用open()系统调用就行了 1fd = open("/dev/video0", O_RDWR); 查询属性在V4L2中,使用ioctl()封装了一个指令和结构体用于属性的查询 1234567891011ioctl(int fd, VIDIOC_QUERYCAP, struct v4l2_capability *cap);struct...







