news 2026/2/15 7:58:47

嵌入式面试问题:STM32中指针和数组的本质区别是什么,常用数组存储什么数据?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
嵌入式面试问题:STM32中指针和数组的本质区别是什么,常用数组存储什么数据?

STM32中指针和数组的本质区别

核心本质区别

1.定义与内存分配

// 数组 - 静态分配,大小固定 uint8_t array[100]; // 编译器分配100字节连续内存 // array本身是内存地址的标识符,不是变量 // 指针 - 动态或静态,大小可变 uint8_t *ptr; // 只分配4/8字节存储地址 ptr = array; // 指向已存在内存 ptr = (uint8_t*)malloc(100); // 动态分配

2.类型特性

// sizeof行为不同 sizeof(array); // 返回整个数组大小 (100*sizeof(type)) sizeof(ptr); // 返回指针本身大小 (4或8字节) // 地址操作不同 &array; // 得到数组首地址,类型是uint8_t(*)[100] &ptr; // 得到指针变量的地址 // 自增操作不同 ptr++; // 指针移动sizeof(uint8_t)字节 array++; // 错误!数组名不是左值

3.内存布局差异

数组: ┌─────────────────┐ │ 数据直接存储 │ ← array标识符直接引用此内存 │ (连续100字节) │ └─────────────────┘ 指针: ┌─────────┐ ┌─────────────────┐ │ 地址值 │ → │ 实际数据 │ │ (4字节) │ │ (动态分配内存) │ └─────────┘ └─────────────────┘

STM32中常用数组存储的数据类型

1.外设数据缓冲区

// DMA传输缓冲区 uint8_t uart_rx_buffer[256]; // UART接收缓冲区 uint32_t adc_buffer[128]; // ADC采样数据 // 通信协议数据 uint8_t can_frame[8]; // CAN报文数据场 uint8_t spi_tx_data[64]; // SPI发送数据

2.信号处理数据

// 传感器数据缓存 int16_t imu_raw[6]; // 六轴IMU原始数据 float temperature_history[60]; // 温度历史记录 // 数字信号处理 float fft_input[1024]; // FFT输入数据 int32_t fir_filter_buffer[32]; // FIR滤波器缓存

3.系统状态与配置

// 系统状态数组 uint32_t task_stack[128]; // 任务堆栈空间 system_state_t states[10]; // 状态机状态 // 配置参数表 const uint32_t pwm_lookup[256] = { /* PWM占空比表 */ }; const float calibration_table[20]; // 校准系数

4.显示与界面数据

// 显示缓冲区 uint16_t lcd_frame_buffer[320*240]; // LCD显存 uint8_t led_matrix[8][8]; // LED点阵数据 // 字符与图形 const char menu_items[5][20]; // 菜单项文本 uint8_t bitmap_data[1024]; // 位图数据

5.实时控制系统数据

// 控制算法数据 float pid_error[3]; // PID误差记录 motor_position_t trajectory[100]; // 运动轨迹 // 采样与滤波 uint32_t encoder_counts[4]; // 编码器计数值 float current_samples[100]; // 电流采样

STM32中的特殊考虑

1.内存分段放置

// 指定数组存放位置 (链接脚本中定义) uint8_t __attribute__((section(".ccmram"))) fast_buffer[512]; // CCM RAM const uint8_t __attribute__((section(".rodata"))) lookup_table[256]; // 只读段

2.对齐要求

// DMA通常需要字对齐 uint32_t __attribute__((aligned(4))) dma_buffer[128]; // 缓存行对齐优化性能 uint8_t __attribute__((aligned(32))) cache_aligned_data[1024];

3.静态分配优势

无动态内存管理开销 - 适合实时系统
编译时确定大小 - 可预测的内存使用
更少的运行时错误 - 无内存泄漏/碎片化

选择建议

使用数组的场景:

  • 数据大小在编译时已知且固定

  • 需要频繁访问的缓冲区

  • 实时性要求高的中断服务程序

  • 避免动态内存管理的系统

使用指针的场景:

  • 数据大小在运行时确定

  • 需要灵活的内存管理

  • 传递数据到不同函数(避免大数组拷贝)

  • 动态数据结构(链表、树等)

STM32最佳实践:

// 优先使用静态数组 #define BUFFER_SIZE 256 static uint8_t local_buffer[BUFFER_SIZE]; // 文件内使用 // 需要传递时使用指针参数 void process_data(uint8_t *data, uint32_t length); // 大数组放置在合适的内存区域 __attribute__((section(".dtcm"))) uint32_t critical_buffer[1024]; // TCM内存

性能影响

  • 数组访问:编译时可计算偏移,通常更快

  • 指针访问:需要间接寻址,可能有额外开销

  • 缓存友好性:数组的连续内存更利于缓存预取

在STM32嵌入式开发中,由于内存有限且实时性要求高,大多数情况下推荐使用静态数组,除非确实需要动态内存分配。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/8 21:34:31

设计模式:一个实例用全创建型模式

1.概要这里结合多种模式完成需求,为了体现各模式的使用价值,在对比中对某种模式的特点有一个相对形象的认识。还是一坦克大战作为需求原型,因为需求简单,易于理解,不会在需求本身上消耗太多精力,更容易专注…

作者头像 李华
网站建设 2026/2/5 5:17:29

上市公司元宇宙技术专利数据说明(1990—2025)

数据简介CNPaperData元宇宙技术专利是推动元宇宙产业发展的关键创新领域,涵盖了从硬件设备到软件应用的广泛技术,在构建虚拟世界、实现虚实交互以及提升用户体验等方面发挥着重要作用,是元宇宙行业蓬勃发展的核心技术支撑。其中,与…

作者头像 李华
网站建设 2026/2/8 6:14:08

3.3 实战项目升级:为智能数据库查询工具添加多数据库支持

3.3 实战项目升级:为智能数据库查询工具添加多数据库支持 在前几周的学习中,我们已经构建了一个基础的智能数据库查询工具,它能够将自然语言转换为SQL查询并执行。现在,我们将对这个项目进行升级,添加对多种数据库系统的支持,包括MySQL、PostgreSQL、SQLite和MongoDB。这…

作者头像 李华
网站建设 2026/2/14 2:22:57

LobeChat能否对接CRM系统?客户关系管理一体化

LobeChat 与 CRM 系统的深度融合:打造智能化客户关系管理新范式 在企业服务日益追求“以客户为中心”的今天,客户关系管理(CRM)系统早已不再是简单的联系人数据库。它承载着销售线索、服务记录、交互历史乃至客户情绪的完整画像。…

作者头像 李华
网站建设 2026/2/5 13:25:40

4.1 AI代码研究方法论:快速掌握大型开源项目核心原理

4.1 AI代码研究方法论:快速掌握大型开源项目核心原理 在前面的章节中,我们学习了AI编程工具的使用和项目开发实践。从本章开始,我们将探讨如何利用AI工具快速理解和掌握大型开源项目的代码库。本节课将介绍一套系统性的AI代码研究方法论,帮助开发者高效地解构和理解复杂的…

作者头像 李华
网站建设 2026/2/6 2:14:40

4.3 AI驱动的可视化生成:将代码和描述转换为图表

4.3 AI驱动的可视化生成:将代码和描述转换为图表 在技术文档和系统设计中,可视化图表是传达复杂信息的有力工具。传统的图表制作过程往往耗时且需要专业技能。本节将介绍如何利用AI工具将代码和自然语言描述自动转换为各种类型的图表,包括流程图、架构图、时序图等。 可视…

作者头像 李华