- C语言指针和数组的区别?
维度 指针 数组
本质 存储内存地址的变量,占用独立内存空间(32位系统4字节) 连续的内存块,存储数据本身;数组名是常量地址,不占用额外空间
sizeof结果 等于指针本身的大小(如32位系统固定为4字节) 等于数组元素个数 × 单个元素大小
可修改性 可以修改指向(如 p++ ) 数组名是常量地址,不可直接修改(如 arr++ 非法)
传参行为 传递的是地址拷贝 传参时会退化为指向数组首元素的指针
一句话总结:数组是数据的容器,指针是地址的容器。
- STM32有效优先级怎么配置?
- 核心规则:抢占优先级(Preemption Priority) > 响应优先级(Sub Priority)
- 配置步骤:
- 先配置 NVIC_PriorityGroupConfig() ,确定抢占/响应优先级的位宽(比如分组2:抢占2位,响应2位)。
- 再给每个中断设置 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority (抢占优先级)和 NVIC_IRQChannelSubPriority (响应优先级)。
- 生效逻辑:
- 抢占优先级高的中断可以打断低抢占优先级的中断。
- 抢占优先级相同时,响应优先级高的先响应,但不能打断当前正在执行的中断。
- volatile 关键字的作用是什么?
volatile 告诉编译器:该变量的值可能被硬件、中断或多线程意外修改,禁止对它做任何优化,每次访问都必须从内存中读取,而不是使用寄存器缓存的值。
- 典型使用场景:
- 硬件寄存器映射变量(如串口、定时器寄存器)。
- 中断服务函数中修改的全局标志变量。
- 多线程/多任务共享的全局变量。
- 不加 volatile 会导致的问题:编译器优化后,程序可能一直读取寄存器中的旧值,导致逻辑异常。
- FreeRTOS中任务调度的策略有哪些?
- 抢占式调度:高优先级任务就绪时,会立即抢占低优先级任务的CPU使用权,保证高优先级任务的实时性。
- 时间片轮转调度:相同优先级的任务按时间片轮流执行,时间片用完后切换到下一个任务。
- 协作式调度(旧版/可选):任务主动放弃CPU使用权才会切换,实时性较差,现代FreeRTOS默认不推荐。
- I2C和SPI的区别是什么?
特性 I2C SPI
信号线 仅2根(SDA数据线 + SCL时钟线) 4根(SCLK时钟 + MOSI主机发 + MISO主机收 + CS片选)
通信方式 半双工 全双工
拓扑结构 多设备挂同一总线,通过设备地址区分 每个设备需要独立片选线,主从一对一通信
速度 标准模式100Kbps,最高一般几Mbps 速度更高,可达几十Mbps
典型场景 低速外设(EEPROM、RTC、传感器) 高速外设(Flash、LCD、ADC)
- 什么是内存泄漏,如何避免?
- 定义:动态分配的内存(如 malloc )使用后未释放,导致系统可用内存不断减少,严重时会引发系统崩溃。
- 避免方法:
-
遵循"谁申请谁释放"原则, malloc 和 free 成对出现。
-
函数返回前检查所有分支路径,确保申请的内存都被释放。
-
使用静态分析工具(如 valgrind )检测内存泄漏。
-
嵌入式中尽量减少动态内存分配,优先使用全局/静态数组。
-
堆栈溢出的原因和解决方法?
- 栈溢出原因:
- 局部变量过大(如函数内定义大数组)。
- 函数递归调用过深。
- 中断嵌套过深,栈空间被反复占用。
- 堆溢出原因:
- 写操作越界访问了动态分配内存的相邻地址。
- 多次释放同一块内存(double free)。
- 解决方法:
- 增大栈空间配置,减少局部大变量,改用动态分配或全局变量。
- 限制递归深度,优化中断优先级和嵌套。
- 检查数组/指针操作,避免越界访问。
- 使用内存保护单元(MPU)监控内存访问。
- 常见的通信校验方法:
- 奇偶校验:在数据位后添加一位校验位,使数据中1的个数为奇数/偶数,检测单比特错误。
- 校验和(Checksum):对所有数据字节求和,结果作为校验码,简单但抗干扰性差。
- 循环冗余校验(CRC):通过多项式运算生成校验码,抗干扰性强,常用CRC8/CRC16/CRC32。
- 避免校验错误的方法:
-
通信两端约定统一的校验方式和参数。
-
增加帧头、帧尾和长度字段,辅助定位错误帧。
-
采用超时重传机制,对校验失败的帧进行重发。
-
Linux中进程和线程的区别?
维度 进程 线程
资源分配 拥有独立的地址空间和系统资源 共享所属进程的地址空间和资源
创建/切换开销 开销大,需要复制页表等资源 开销小,仅需保存少量寄存器
通信方式 需通过IPC(管道、消息队列、共享内存) 直接读写共享变量即可通信(需同步机制)
安全性 一个进程崩溃不影响其他进程 一个线程崩溃会导致整个进程退出