其他
【MCU】一种单片机节省内存的方法(补充)
1、聊一聊
以前听这首曲子内心会变得格外平静,然而现在却五味陈杂!
今天主要跟大家分享一个MCU省内存的办法,同时也欢迎大家在文末问答留言讨论。
2、读前必备
对于MCU节省内存办法大合集bug菌在很早之前就总结分享给大家了,如果还没来得及阅读的小伙伴点击下方链接先学习一波。
3、本文补充省内存办法
1
const的使用参考demo:
1#include "led.h"
2#include "delay.h"
3#include "usart.h"
4
5#define DEV_NUM_MAX (3)
6#define DEV_PARAM_MAX (2)
7
8typedef struct _tag_DevParam
9{
10 char* Name; //设备名称
11 uint32_t Param[DEV_PARAM_MAX]; //设备参数
12}sDevParam;
13
14
15 const sDevParam stDevParam[DEV_NUM_MAX] = {
16 {"Uart1",57600,0},
17 {"Uart2",57600,1},
18 {"CAN",1000000,0},
19 };
20/***************************************
21 * Fuction:const内存分配测试
22 * Author :bug菌
23 **************************************/
24 int main(void)
25 {
26 uint8_t t = 0;
27 uint8_t devCnt = 0;
28
29 delay_init(); //延时函数初始化
30 uart_init(115200); //串口初始化
31
32 printf("\n*******************const Test*******************\r\n");
33
34 for(devCnt = 0 ;devCnt < DEV_NUM_MAX;devCnt++)
35 {
36 printf("DevName = %s,Param1 = %d,Param2 = %d\r\n",stDevParam[devCnt].Name,\
37 stDevParam[devCnt].Param[0],\
38 stDevParam[devCnt].Param[1]);
39 }
40 printf("stDevParam Size : %d \r\n",sizeof(stDevParam));
41 printf("stDevParam Addr : 0x%X \r\n",stDevParam);
42 printf("\n***********欢迎关注公众号:最后一个bug************\n");
43 while(1)
44 {
45 delay_ms(10);
46 if(++t > 150){LED0=0;}else{LED0=1;}
47 }
48 }
运行结果:
分析一下:
对于stm32的所有存储映像都在对应工程所编译生成的.map文件中,对.map文件(其文件在工程目录中)的熟悉度就在一定程度上彰显你对stm32单片机的熟练程度。
程序编译成功以后,就可以直接在map文件中查找const修饰的数组名,从而得到如下结果:
从上图我们了解到其stDevParam变量位置0x080016b8数据区且位于(.contdata段--只读数据段)并占用了36个字节,与我们串口输出结果是相符合的。
2
const数据的存储3
const数据使用上图来源于ST官网
4、最后小结
那单片机使用const节省内存先为大家讲到这里,如果大家还有什么好的方法欢迎在文末的问答区分享留言。
好了,这里是公众号:“最后一个bug”,一个为大家打造的技术知识提升基地。
推荐好文 点击蓝色字体即可跳转
☞【收藏】get这些技巧,HardFault_Handler排查只需要几分钟