硬汉嵌入式论坛

 找回密码
 立即注册
查看: 689|回复: 10
收起左侧

[SRAM] 定义一个全局指针变量并申请内存,为什么会被别的结构体指针变量冲掉?

[复制链接]

25

主题

68

回帖

143

积分

初级会员

积分
143
QQ
发表于 2023-7-26 11:45:31 | 显示全部楼层 |阅读模式
我在512KB AXI SRAM中申请1KB给某个全局指针变量,但我发现,某个局部结构体指针变量申请的内存地址,居然一样了。这样就导致了这个全局指针变量的内容被冲掉了。


我采用的malloc函数是某个开发板厂家重新做的。为什么会出现内存重复呢?
回复

使用道具 举报

5

主题

165

回帖

180

积分

初级会员

积分
180
发表于 2023-7-26 15:48:16 | 显示全部楼层
stack栈地址默认在内部ram的最末尾,估计自制的内存分配函数定义的区域把堆栈区给包进去了
回复

使用道具 举报

25

主题

68

回帖

143

积分

初级会员

积分
143
QQ
 楼主| 发表于 2023-7-27 11:01:08 | 显示全部楼层
DX3906 发表于 2023-7-26 15:48
stack栈地址默认在内部ram的最末尾,估计自制的内存分配函数定义的区域把堆栈区给包进去了

用的是某点原子开发板的malloc函数,既然已经在512KB AXI SRAM中申请了1KB内存给全局指针变量了,也没有释放,为什么别的结构体指针变量申请的内存地址会一样呢?这不全乱套了吗?
2023-07-27_105235.png
2023-07-27_105303.png
回复

使用道具 举报

75

主题

685

回帖

910

积分

金牌会员

积分
910
发表于 2023-7-27 12:02:19 | 显示全部楼层
pnhywyb 发表于 2023-7-27 11:01
用的是某点原子开发板的malloc函数,既然已经在512KB AXI SRAM中申请了1KB内存给全局指针变量了,也没有 ...

原子上代码看看
回复

使用道具 举报

25

主题

68

回帖

143

积分

初级会员

积分
143
QQ
 楼主| 发表于 2023-7-27 13:18:00 | 显示全部楼层
庄永 发表于 2023-7-27 12:02
原子上代码看看


isopathname是全局指针变量uint8_t *isopathname,在main函数中就申请内存了,程序运行过程中不释放它的内存:
isopathname  = mymalloc(SRAMIN, 1 * 1024);


在另外的C文件中的函数中,定义局部变量filelistx并申请内存:
_filelistbox_list * filelistx;
filelistx = (_filelistbox_list*)mymalloc(SRAMIN,sizeof(_filelistbox_list));


_filelistbox_list 是链表结构:
typedef struct
{
        void *prevlist;
        void *nextlist;
        u8 type;             
        u8 utf8_bit;     
        u8 *name;             
}_filelistbox_list;


malloc等函数都是直接抄开发板的,AXI SRAM最大只管理370KB:

//mem1内存参数设定.mem1是H7内部的AXI内存
#define MEM1_BLOCK_SIZE                        64                                                            //内存块大小为64字节
#define MEM1_MAX_SIZE                        370 * 1024                                                  //最大管理内存
#define MEM1_ALLOC_TABLE_SIZE         MEM1_MAX_SIZE / MEM1_BLOCK_SIZE         //内存表大小


我在startup_stm32h743xx.s中设置堆栈如下:

Stack_Size                EQU     0x2000

                AREA    STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem       SPACE   Stack_Size
__initial_sp


; <h> Heap Configuration
;   <o>  Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
; </h>

Heap_Size      EQU     0x0000


而且我还发现,不一定是_filelistbox_list变量会冲掉isopathname内容,其它函数例如TJpgDec中的JDEC *jpeg_dev也有可能申请到和isopathname一样的内存地址,直接冲毁isopathname内容。
回复

使用道具 举报

12

主题

178

回帖

214

积分

高级会员

积分
214
发表于 2023-7-27 17:58:22 来自手机 | 显示全部楼层
直接用安富莱教程里面关于内存管理的代码吧:基于rtx的,应该没问题的
回复

使用道具 举报

75

主题

685

回帖

910

积分

金牌会员

积分
910
发表于 2023-7-27 23:08:41 | 显示全部楼层
pnhywyb 发表于 2023-7-27 13:18
isopathname是全局指针变量uint8_t *isopathname,在main函数中就申请内存了,程序运行过程中不释放它 ...

动态内存的实现或者说动态内存区域有没有指定在AXI SRAM?你这个多半是没有指定在AXI SRAM上吧
回复

使用道具 举报

25

主题

68

回帖

143

积分

初级会员

积分
143
QQ
 楼主| 发表于 2023-7-28 08:25:13 | 显示全部楼层
庄永 发表于 2023-7-27 23:08
动态内存的实现或者说动态内存区域有没有指定在AXI SRAM?你这个多半是没有指定在AXI SRAM上吧

3楼的截图显示:2个变量申请到的内存地址都是0x24061980,都在AXI SRAM(0x24000000)区域内。
回复

使用道具 举报

25

主题

68

回帖

143

积分

初级会员

积分
143
QQ
 楼主| 发表于 2023-8-14 12:42:31 | 显示全部楼层
我没能解决这个问题,目前只能认为这个动态内存分配方案有问题。

我把isopathname变量分配到其它内存块上避免冲突,并大量使用静态内存代替原来需要申请动态内存的变量,目前系统稳定多了。
回复

使用道具 举报

13

主题

89

回帖

128

积分

初级会员

积分
128
发表于 2023-8-14 13:46:47 | 显示全部楼层
应该是你的malloc函数出现了问题,重复申请了
回复

使用道具 举报

15

主题

73

回帖

118

积分

初级会员

积分
118
发表于 2023-8-14 13:49:23 | 显示全部楼层
pnhywyb 发表于 2023-8-14 12:42
我没能解决这个问题,目前只能认为这个动态内存分配方案有问题。

我把isopathname变量分配到其它内存块 ...

看下keil的sct文件,是不是分配了AXISRAM这个区域,如果分配了这个区域,再系统编译时可能会把全局变量分配到这个AXISRAM区域,然后你又申请内存,就把系统分配的覆盖了?
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-6 10:10 , Processed in 0.367902 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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