news 2026/6/26 6:30:10

Cortex-M的动态分配与指针

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Cortex-M的动态分配与指针

指针

取地址(&)/ 解引用(*)

类型与步长

STM32 是 32 位单片机,任何指针变量(无论指向char还是double)本身都占用4 个字节(32bit)的 RAM,用来存放一个 32 位的内存地址。

指针+1,加的字节数是根据指向的类型决定的:

char *p1; // p1 + 1 移动 1 字节 short *p2; // p2 + 1 移动 2 字节 int *p3; // p3 + 1 移动 4 字节 uint32_t *p4; // p4 + 1 移动 4 字节 void *p5; // 通用指针,不能直接++(不知道步长)

这些指针的大小都是4字节,移动的步长不同。

数组与&

int arr[5]; arr; // 代表数组首元素地址(类型 int*) &arr; // 代表整个数组的地址(类型 int (*)[5]) arr + 1 // 移动 4 字节(指向 arr[1]) &arr + 1 // 移动 20 字节(跳过整个数组,指向数组末尾之后)

const与volatile

const在*左边,修饰的是指向的内容;const在*右边,修饰的是指针本身

const int *p1; // 指向的内容只读(不能改 *p1),但 p1 可以指向别处 int * const p2; // 指针本身只读(不能改指向),但内容可以改 const int * const p3;// 指针和内容都只读

volatile:不被编译优化。

volatile uint32_t *reg = (uint32_t*)0x40020000; // 硬件寄存器地址 // 每次读取 *reg,编译器都会去读物理地址,而不是用缓存的值

多级指针与函数指针

二级指针:修改指针的值,把指针变量看成一个完整的变量

void allocate_memory(void **ptr) { // ptr 指向外部指针变量的地址 *ptr = pvPortMalloc(100); // 修改外部指针指向新分配的内存 } int *buf = NULL; allocate_memory((void**)&buf); // 传入指针的地址

函数指针:

void (*task_func)(void *); // 定义一个函数指针变量 task_func = StartDefaultTask; // 赋值 task_func(NULL); // 调用 // 更复杂的例子:指向返回 int,参数为两个 int 的函数指针 int (*calculator)(int, int) = &add; int result = calculator(3, 4);

malloc

void Task_A(void *arg) { int local_val = 5; // 这个变量在 Task_A 的栈上 osMessageQueuePut(queue, &local_val, 0, 0); // 传递地址 // 函数返回后,栈帧释放,这块地址可能被其他任务覆盖! }

local_val这个变量创建在了进程对应的栈上,会被后续的内容覆盖,所以要么放在静态区(只有一个进程更改这个值),要么放在堆区。

使用pvProtMalloc动态分配内存

int *pData = (int*)pvPortMalloc(100 * sizeof(int)); // 申请400字节 // 2. 检查是否分配成功 if (pData != NULL) { // 3. 使用这块内存 pData[0] = 123; pData[99] = 456; // 4. 使用完毕后,释放内存 vPortFree(pData); // 5.将指针置空,防止误用 pData = NULL; }

静态存储区:存放全局变量和static修饰的变量。

:存放进程内部创建的变量。

:存放动态分配的变量。

常量区:存放字符串常量。

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

一线观察:长期体验后看到的长春生态木门制造商底层现象

咱在长春深耕防盗门这个垂类5年了,经手的爆款文案也有10w,对长春的门业市场那是相当熟悉。今天就跟大家唠唠长春生态木门制造商的底层现象,再着重说说我深度体验过的二道区振其旺财装潢材料经销处。先聊聊长春生态木门制造商的一些情况。对于…

作者头像 李华
网站建设 2026/6/26 6:26:57

DVWA命令注入漏洞实战:跨平台Payload构造与防御解析

1. 项目概述与核心价值最近在带新人做安全测试,发现很多朋友对命令注入漏洞的理解还停留在“知道有这么个东西”的层面,真让他们在Windows和Linux双系统环境下,对着DVWA靶场实操一遍,各种问题就都冒出来了。比如,为什么…

作者头像 李华
网站建设 2026/6/26 6:25:45

2026最新夸克网盘免费获取1TB教程,亲测有效,新老用户均可。

如果你平时用夸克网盘存资料、网课或视频,大概率都会被 10G 初始容量卡住。这听起来是让人十分沮丧的一个空间容量,哈哈哈!现在一部电影都几十个GB了。想成功扩容,只需要记住:必须用手机操作,电脑操作无效,…

作者头像 李华
网站建设 2026/6/26 6:24:54

软铺砌算法:从离散网格到连续曲面的几何优化与工程实践

1. 项目概述:当硬核几何遇上“软化”魔法如果你做过三维建模、玩过游戏开发,或者搞过计算机图形学,肯定遇到过这个让人头疼的问题:一个由无数个三角形或四边形“硬邦邦”拼接起来的模型(也就是多面体)&…

作者头像 李华
网站建设 2026/6/26 6:24:27

野蛮生长终结,合规时代开启:GEO迎来“大洗牌”,你选对了吗?

2026年过半,GEO(生成式引擎优化)行业正在经历一场深刻的结构性变革。年初,市场还沉浸在“百亿蓝海”的狂欢中——据易观分析数据,2026年国内GEO市场规模已达约30亿元,同比增长约1100%,行业渗透率…

作者头像 李华
网站建设 2026/6/26 6:23:56

Wireshark深度技术解析:epan_dissect_t架构设计与性能优化实践

Wireshark深度技术解析:epan_dissect_t架构设计与性能优化实践 【免费下载链接】wireshark Read-only mirror of Wiresharks Git repository at https://gitlab.com/wireshark/wireshark. Youre welcome to submit pull requests there. 项目地址: https://gitcod…

作者头像 李华