OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4614|回复: 3

请教各位内存管理地址不变的问题

[复制链接]

25

主题

124

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
269
金钱
269
注册时间
2022-11-1
在线时间
53 小时
发表于 2023-3-22 10:18:06 | 显示全部楼层 |阅读模式
请问各位为啥内存管理这里申请内存、释放内存的时候,正常是地址会随着变,我地址不变一直固定一个值,请问这是为啥啊?我是用串口输出的
  1. if(tp!=p)    //判断申请地址是否改变
  2.                 {
  3.                         tp=p;
  4.                         sprintf((char*)paddr,"P Addr:0X%08X",(u32)tp);
  5.                        
  6.                         printf ("\r\n P Addr: 0X%X\r\n",paddr);   //申请到的内存值的地址
  7.                         if(p)
  8.                           printf ("\r\n  %s      \r\n",p);     //显示p的内容
  9.                     
  10.                 }
复制代码


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

800

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3775
金钱
3775
注册时间
2017-3-7
在线时间
1645 小时
发表于 2023-3-22 10:23:37 | 显示全部楼层
你要看你内存分配的策略了,嵌入式一般是申请一块内存,自行申请,释放,你申请大小不变,申请完就释放,再申请大概率是同一块区域
回复 支持 反对

使用道具 举报

25

主题

124

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
269
金钱
269
注册时间
2022-11-1
在线时间
53 小时
 楼主| 发表于 2023-3-22 10:44:34 | 显示全部楼层
a5820736 发表于 2023-3-22 10:23
你要看你内存分配的策略了,嵌入式一般是申请一块内存,自行申请,释放,你申请大小不变,申请完就释放,再 ...

老哥,我是按正点原子带的开发手册写的,它上面地址是可以变化的,这是主函数的代码
  1. int main(void)
  2. {         
  3.         u8 key;                 
  4.         u8 i=0;            
  5.         u8 *p=0;
  6.         u8 *tp=0;
  7.         u8 paddr[18];                        //存放P Addr:+p地址的ASCII值
  8.         u8 sramx=0;                                //默认为内部sram
  9.   
  10.         delay_init();                     //延时函数初始化          
  11.   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
  12.         uart_init(115200);                 //串口初始化为115200
  13.         LED_Init();                                          //初始化与LED连接的硬件接口
  14.         KEY_Init();                                        //初始化按键  
  15.         FSMC_SRAM_Init();                        //初始化外部SRAM  
  16.         my_mem_init(SRAMIN);                //初始化内部内存池
  17.         my_mem_init(SRAMEX);                //初始化外部内存池
  18.        

  19.         printf("\r\n  KEY0:Malloc  KEY2:Free  \r\n");
  20.         printf("\r\n  KEY_UP:SRAMx KEY1:Write       \r\n");

  21.        
  22.         printf("\r\n  SRAMIN   \r\n");
  23.         printf("\r\n  SRAMIN USED:  0 %  \r\n");
  24.         printf("\r\n  SRAMEX  USED:  0 %  \r\n");
  25.   
  26.           while(1)
  27.         {       
  28.                 key=KEY_Scan(0);                //不支持连按       
  29.                 switch(key)
  30.                 {
  31.                         case 0:                                //没有按键按下       
  32.                           break;
  33.                        
  34.                         case KEY0_PRES:                //KEY0按下
  35.                                 p=mymalloc(sramx,2048);//申请2K字节
  36.                                 if(p!=NULL)sprintf((char*)p,"Memory Malloc Test%03d",i);//向p写入一些内容
  37.                           //printf ("\r\n P Addr: %x\r\n",paddr);        //显示地址  
  38.                                 printf("\r\n SRAMIN USED: %d %%  \r\n",my_mem_perused(SRAMIN));    //显示内部内存使用率
  39.                           printf("\r\n SRAMEX USED: %d %%  \r\n",my_mem_perused(SRAMEX));    //显示外部内存使用率
  40.                                 break;
  41.                        
  42.                        
  43.                         case KEY1_PRES:                //KEY1按下          
  44.                                 if(p!=NULL)
  45.                                 {
  46.                                         sprintf((char*)p,"Memory Malloc Test%03d",i);//更新显示内容          
  47.                                         printf("\r\n  %s   \r\n",p);     //显示p的内容
  48.                                 }
  49.                                 break;
  50.                                
  51.                                
  52.                         case KEY2_PRES:                //KEY2按下          
  53.                                 myfree(sramx,p);//释放内存
  54.                                 p=0;                        //指向空地址
  55.                           //printf ("\r\n P Addr: %x\r\n",paddr);
  56.                                 printf("\r\n SRAMIN USED: %d %%  \r\n",my_mem_perused(SRAMIN));    //显示内部内存使用率
  57.                           printf("\r\n SRAMEX USED: %d %%  \r\n",my_mem_perused(SRAMEX));    //显示外部内存使用率
  58.                                 break;
  59.                        
  60.                         case WKUP_PRES:                //KEY UP按下
  61.                                 sramx=!sramx;        //切换当前malloc/free操作对象
  62.                                 if(sramx)
  63.                           printf("\r\n SRAMEX   \r\n");
  64.                                 else
  65.                           printf("\r\n  SRAMIN   \r\n");
  66.                                 break;
  67.                 }
  68.                
  69.                
  70.                 if(tp!=p)    //判断申请地址是否改变
  71.                 {
  72.                         tp=p;
  73.                         sprintf((char*)paddr,"P Addr:0X%08X",(u32)tp);
  74.                        
  75.                         printf ("\r\n P Addr: 0X%X\r\n",paddr);   //申请到的内存值的地址
  76.                         if(p)
  77.                           printf ("\r\n  %s      \r\n",p);     //显示p的内容
  78.                     
  79.                 }
  80.                 delay_ms(10);   
  81.                 i++;
  82.                 if((i%20)==0)//DS0闪烁.
  83.                 {
  84.                        
  85.                         LED1=!LED1;
  86.                 }
  87.         }          
  88. }
复制代码
回复 支持 反对

使用道具 举报

3

主题

800

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3775
金钱
3775
注册时间
2017-3-7
在线时间
1645 小时
发表于 2023-3-22 10:51:37 | 显示全部楼层
wsh15249375668 发表于 2023-3-22 10:44
老哥,我是按正点原子带的开发手册写的,它上面地址是可以变化的,这是主函数的代码

看mymalloc myfree的实现呗
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-24 13:31

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表