OpenEdv-开源电子网

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

STM32H750VBT6 调用MALLOC函数后编译报错

[复制链接]

37

主题

143

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
346
金钱
346
注册时间
2016-7-3
在线时间
88 小时
发表于 2020-9-8 13:50:52 | 显示全部楼层 |阅读模式
20金钱
STM32H750VBT6  调用MALLOC函数后编译报错 。内存地址冲突,工程我看了没有定义很大的内寸,不加MALLOC  ZI-DATA 才12K。加上后ZI-data 512K,这个都正常。当调用内存初始化函数my_mem_init();时就会报错,地址冲突,如下报错:..\OBJ\Template.axf: Error: L6971E: system_stm32h7xx.o(.data) type RW incompatible with malloc.o(.ARM.__AT_0x20019000) type ZI in er RW_IRAM1.
下面是我定义的内存分配大小://mem1内存参数设定.mem1是H7内部的AXI内存.#define MEM1_BLOCK_SIZE                        64                                                            //内存块大小为64字节
#define MEM1_MAX_SIZE                  448*1024                                                  //最大管理内存 448K,H7的AXI内存总共512KB
#define MEM1_ALLOC_TABLE_SIZE        MEM1_MAX_SIZE/MEM1_BLOCK_SIZE         //内存表大小



只有把448改成338就可以正常编译,无缘无故100K内存不能用,好郁闷。因为后面要播放视频,所以这个内存要分配大些,到底是什么地方占用了100K空间,我没搞明白。求大神指点迷津!

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

使用道具 举报

0

主题

24

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
401
金钱
401
注册时间
2019-5-5
在线时间
150 小时
发表于 2020-9-8 14:16:57 | 显示全部楼层
可以看一下编译出来的map文件
回复

使用道具 举报

37

主题

143

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
346
金钱
346
注册时间
2016-7-3
在线时间
88 小时
 楼主| 发表于 2020-9-8 15:04:33 | 显示全部楼层
石头君 发表于 2020-9-8 14:16
可以看一下编译出来的map文件

    __initial_sp                             0x2405fac8   Data           0  startup_stm32h750xx.o(STACK)
    .ARM.__AT_0x30000000                     0x30000000   Section    245760  malloc.o(.ARM.__AT_0x30000000)
这是MAP文件  占用内存是24000000-2405fac8  还有几百K的空间呀。这个是把内存分配设置为348K 编译的结果,理论上还有几百K的RAM,我分配448K也没问题呀,实际上分配448K就报如题错误。
回复

使用道具 举报

3

主题

312

帖子

0

精华

高级会员

Rank: 4

积分
907
金钱
907
注册时间
2011-10-19
在线时间
196 小时
发表于 2020-9-8 15:23:05 | 显示全部楼层
..\OBJ\Template.axf: Error: L6971E: system_stm32h7xx.o(.data) type RW incompatible with malloc.o(.ARM.__AT_0x20019000) type ZI in er RW_IRAM1.
这条错误指的是RW_IRAM1即DTCMRAM区域(128KB)区域有地址不配置。

.ARM.__AT_0x30000000                     0x30000000   Section    245760  malloc.o(.ARM.__AT_0x30000000)
地址0x30000000位于RAM_D2区域,其大小为288K。

综上,估计是你的链接脚本有问题。
回复

使用道具 举报

37

主题

143

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
346
金钱
346
注册时间
2016-7-3
在线时间
88 小时
 楼主| 发表于 2020-9-8 15:29:49 | 显示全部楼层
ufbycd 发表于 2020-9-8 15:23
..\OBJ\Template.axf: Error: L6971E: system_stm32h7xx.o(.data) type RW incompatible with malloc.o(.AR ...

链接脚本是什么呀
回复

使用道具 举报

37

主题

143

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
346
金钱
346
注册时间
2016-7-3
在线时间
88 小时
 楼主| 发表于 2020-9-8 15:39:02 | 显示全部楼层
以下是我定义分配348K内存,生成的map文件:
    .ARM.__AT_0x20000000                     0x20000000   Section    102400  malloc.o(.ARM.__AT_0x20000000)
    .ARM.__AT_0x20019000                     0x20019000   Section     6400  malloc.o(.ARM.__AT_0x20019000)
    .data                                    0x24000000   Section        4  system_stm32h7xx.o(.data)
    .data                                    0x24000004   Section        4  system_stm32h7xx.o(.data)
    .data                                    0x24000008   Section        8  delay.o(.data)
    fac_ms                                   0x24000008   Data           2  delay.o(.data)
    fac_us                                   0x2400000c   Data           4  delay.o(.data)
    .data                                    0x24000010   Section        4  usart.o(.data)
    .data                                    0x24000014   Section       12  stm32h7xx_hal.o(.data)
    uwTickFreq                               0x24000014   Data           1  stm32h7xx_hal.o(.data)
    uwTickPrio                               0x24000018   Data           4  stm32h7xx_hal.o(.data)
    uwTick                                   0x2400001c   Data           4  stm32h7xx_hal.o(.data)
    .data                                    0x24000020   Section        1  key.o(.data)
    key_up                                   0x24000020   Data           1  key.o(.data)
    .data                                    0x24000024   Section        8  lcd.o(.data)
    .data                                    0x2400002c   Section        4  norflash.o(.data)
    .data                                    0x24000030   Section       56  malloc.o(.data)
    .data                                    0x24000068   Section        2  w25qxx.o(.data)
    .data                                    0x2400006c   Section       60  os_core.o(.data)
    .data                                    0x240000a8   Section        4  os_core.o(.data)
    .data                                    0x240000ac   Section        4  os_core.o(.data)
    .data                                    0x240000b0   Section        4  os_cpu_c.o(.data)
    .data                                    0x240000b4   Section        2  ff.o(.data)
    Fsid                                     0x240000b4   Data           2  ff.o(.data)
    .data                                    0x240000b8   Section       12  exfuns.o(.data)
    .bss                                     0x240000c4   Section     1536  main.o(.bss)
    .bss                                     0x240006c4   Section      328  usart.o(.bss)
    .bss                                     0x2400080c   Section       90  lcd.o(.bss)
    .bss                                     0x24000868   Section       76  qspi.o(.bss)
    .bss                                     0x240008b4   Section      136  spi.o(.bss)
    .bss                                     0x2400093c   Section      160  sdmmc_sdcard.o(.bss)
    .bss                                     0x24000a00   Section    356352  malloc.o(.bss)
    .bss                                     0x24057a00   Section    22272  malloc.o(.bss)
    .bss                                     0x2405d100   Section     4096  w25qxx.o(.bss)
    .bss                                     0x2405e100   Section     3696  os_core.o(.bss)
    .bss                                     0x2405ef70   Section       80  os_core.o(.bss)
    .bss                                     0x2405efc0   Section       96  os_core.o(.bss)
    .bss                                     0x2405f020   Section      512  os_cpu_c.o(.bss)
    .bss                                     0x2405f220   Section       12  ff.o(.bss)
    FatFs                                    0x2405f220   Data          12  ff.o(.bss)
    .bss                                     0x2405f22c   Section       12  exfuns.o(.bss)
    .bss                                     0x2405f238   Section       41  fontupd.o(.bss)
    .bss                                     0x2405f264   Section       96  libspace.o(.bss)
    HEAP                                     0x2405f2c8   Section        0  startup_stm32h750xx.o(HEAP)
    STACK                                    0x2405f2c8   Section     2048  startup_stm32h750xx.o(STACK)
    Heap_Mem                                 0x2405f2c8   Data           0  startup_stm32h750xx.o(HEAP)
    Stack_Mem                                0x2405f2c8   Data        2048  startup_stm32h750xx.o(STACK)
    __initial_sp                             0x2405fac8   Data           0  startup_stm32h750xx.o(STACK)
    .ARM.__AT_0x30000000                     0x30000000   Section    245760  malloc.o(.ARM.__AT_0x30000000)
    .ARM.__AT_0x3003C000                     0x3003c000   Section    15360  malloc.o(.ARM.__AT_0x3003C000)
    .ARM.__AT_0x38000000                     0x38000000   Section    61440  malloc.o(.ARM.__AT_0x38000000)
    .ARM.__AT_0x3800F000                     0x3800f000   Section     3840  malloc.o(.ARM.__AT_0x3800F000)
回复

使用道具 举报

3

主题

312

帖子

0

精华

高级会员

Rank: 4

积分
907
金钱
907
注册时间
2011-10-19
在线时间
196 小时
发表于 2020-9-8 15:47:29 | 显示全部楼层
小萧萧 发表于 2020-9-8 15:29
链接脚本是什么呀

链接脚本 用来指明符号分配的地址。如果没有概念,应该多百度下。
回复

使用道具 举报

3

主题

312

帖子

0

精华

高级会员

Rank: 4

积分
907
金钱
907
注册时间
2011-10-19
在线时间
196 小时
发表于 2020-9-8 15:50:18 | 显示全部楼层
小萧萧 发表于 2020-9-8 15:39
以下是我定义分配348K内存,生成的map文件:
    .ARM.__AT_0x20000000                     0x20000000   ...

看看malloc所使用的堆的地址和大小是否正确
回复

使用道具 举报

3

主题

312

帖子

0

精华

高级会员

Rank: 4

积分
907
金钱
907
注册时间
2011-10-19
在线时间
196 小时
发表于 2020-9-8 15:53:22 | 显示全部楼层
如果你对链接脚本了解的话,可以在链接脚本里在AIX内存空间开辟一个段,然后在代码上定义一个数组到这个段就行了。
回复

使用道具 举报

37

主题

143

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
346
金钱
346
注册时间
2016-7-3
在线时间
88 小时
 楼主| 发表于 2020-9-8 16:12:01 | 显示全部楼层
ufbycd 发表于 2020-9-8 15:53
如果你对链接脚本了解的话,可以在链接脚本里在AIX内存空间开辟一个段,然后在代码上定义一个数组到这个段 ...

不会,正在百度,谢谢老哥的耐心讲解,
回复

使用道具 举报

37

主题

143

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
346
金钱
346
注册时间
2016-7-3
在线时间
88 小时
 楼主| 发表于 2020-9-8 16:22:52 | 显示全部楼层
ufbycd 发表于 2020-9-8 15:53
如果你对链接脚本了解的话,可以在链接脚本里在AIX内存空间开辟一个段,然后在代码上定义一个数组到这个段 ...

我把RAM定义烧录到0x38000000 区域就可以了。定义在0x2000000搞死也不行,不知道怎么回事。汇报下!希望能帮助到遇到同样问题的人。
回复

使用道具 举报

37

主题

143

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
346
金钱
346
注册时间
2016-7-3
在线时间
88 小时
 楼主| 发表于 2020-9-8 16:34:05 | 显示全部楼层
我想把0x24000000 起始地址的内存保留,全部分配出去,吧程序下载到24000000以外的内存,但是做不到,编译不过。报错如下。
..\OBJ\Template.axf: Error: L6406E: No space in execution regions with .ANY selector matching malloc.o(.bss).
..\OBJ\Template.axf: Error: L6407E: Sections of aggregate size 0x73000 bytes could not fit into .ANY selector(s).
Not enough information to list image symbols.
Not enough information to list the image map.
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-18 06:32

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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