制作一个网站都需要学什么,网站建设电话邀约话术,关键词优化推广策略,如何给别人做网站赚钱前言
嘿#xff0c;朋友们#xff01;今天咱们来聊聊STM32的内存五区和堆栈空间大小设置。这可是嵌入式开发里的“必修课”#xff0c;要是没整明白#xff0c;程序说不定就“翻车”了。别担心#xff0c;我这就带你一步步搞懂这事儿#xff0c;让你轻松上手#xff0c…前言
嘿朋友们今天咱们来聊聊STM32的内存五区和堆栈空间大小设置。这可是嵌入式开发里的“必修课”要是没整明白程序说不定就“翻车”了。别担心我这就带你一步步搞懂这事儿让你轻松上手稳稳地写出靠谱的代码准备好了吗Lets go 一. 内存五区的概念
在嵌入式系统中堆Heap和栈Stack是两种不同的内存区域它们在程序运行中扮演着重要的角色。除此之外还有其他几个关键的内存区域包括全局区/静态区、常量区和代码区内存五区。 1.1 栈Stack
栈是由编译器自动管理的内存区域用于存储函数调用时的参数、局部变量等。栈的大小在系统启动时确定如果栈空间过小可能会导致栈溢出进而引发程序崩溃所以选定合适的栈空间是的很有必要的。栈的特点是后进先出LIFO即最后进入的元素最先被移除。
#include stdio.h//在C语言中栈内存用于存储函数调用时的局部变量
void StackExample()
{int localArray[10]; // 在栈上分配一个大小为10的数组int size 10;// 使用栈上的内存for (int i 0; i size; i) {localArray[i] i * i; // 栈内存存储平方值}// 打印栈上的内存内容for (int i 0; i size; i) {printf(localArray[%d] %d\n, i, localArray[i]);}
}
1.2 堆Heap
堆用于动态内存分配由程序员自主通过malloc和free函数管理分配。堆的大小通常是动态的由剩余的可用内存决定。堆的特点是灵活可以动态分配和释放内存但如果不正确管理可能会导致内存泄漏。 注用户不能通过malloc指定地址去申请内存可能会导致内存碎片化或其他问题能指定申请内存的大小 #include stdio.h
#include stdlib.h//堆内存通常用于自主动态分配内存
void HeapExample()
{int *array;// 定义一个指向整数的指针用于存储动态分配的数组int size 10; // 需要分配的数组大小// 从堆中分配内存,分配的总字节数为40字节array得到的是一个指向分配内存的指针array (int *)malloc(size * sizeof(int));//检查malloc是否成功分配内存。如果分配失败malloc会返回NULL。if (array NULL) {printf(Memory allocation failed!\n);return;}// 使用分配的内存for (int i 0; i size; i) {array[i] i * i; // 示例存储平方值}// 打印分配的内存内容for (int i 0; i size; i) {printf(array[%d] %d\n, i, array[i]);}// 释放分配的内存free(array);printf(Memory freed.\n);
}
1.3 全局区/静态区
全局区/静态区用于存储全局变量和静态变量。它分为两个部分 .bss段用于存储未初始化或初始化为0的全局变量和静态变量。它不占用可执行文件的空间。 .data段用于存储经过初始化且初始化值非0的全局变量和静态变量。
#include stdio.h// 全局变量
int globalVar 42;void StaticExample()
{// 静态变量static int staticVar 0;// 每次调用函数时静态变量的值会保留不会像局部变量一样消失staticVar;printf(Global Variable: %d\n, globalVar);printf(Static Variable: %d\n, staticVar);
}
1.4 常量区
常量区用于存储字符串常量和其他不可修改的数据。这些数据在程序运行期间是只读的。
const char *message Hello, World!;
1.5 代码区
代码区用于存储程序的执行代码包括函数和中断向量表等。 Flash存储器用于存储程序代码和常量数据而RAM用于存储变量全局变量、静态变量和局部变量和堆栈等运行时数据。 存储器类型地址范围用途Flash存储器0x08000000 - 0x080FFFFF程序代码、中断向量表、常量数据RAM存储器0x20000000 - 0x2000FFFF全局变量、静态变量、堆栈、堆 二. 设置堆栈大小的方法
在使用STM32编程时一般情况下我们编写程序很少出现栈溢出所以不会关注堆栈空间的大小而在STM32的启动文件中已经帮我们预先设置好了堆栈空间的大小。如下图所示的启动代码中Stack栈的大小为0x4001024ByteHeap堆的大小为0x200512Byte。 在STM32工程中有两种主要方法可以设置堆栈大小
方法1直接在启动文件中修改
启动文件通常是startup_stm32xxxxx.s中包含了堆栈大小的设置。可以直接修改这些值来调整堆栈大小 方法2可以通过图形界面配置堆栈大小
打开启动文件点击下方Configuration Wizard点expand all展开可在value栏框中设置堆栈空间的大小。 总结
今天的内容就到这里啦咱们一起把STM32的内存五区和堆栈空间大小设置给“拿下”了。内存五区就像是程序的“小家”每个区域都有自己的“职责”把它们安排得明明白白程序才能跑得顺顺当当。至于堆栈空间大小设置那更是关键中的关键要是堆栈给少了程序一“激动”就容易“爆仓”要是给多了又有点浪费。所以根据自己的需求合理地在启动文件里调整一下就能让程序舒舒服服地运行啦。
希望今天的分享对你有帮助哦要是还有啥疑问或者想继续唠唠嵌入式开发那些事儿随时来找我哈。下次见啦拜拜