久芯网

一个大数组是不是不能同时跨用内外部SRAM?

avatar LeoMe 提问时间: 2023-07-22 12:55:38 / 未解决
如题
STM32F407用FSMC挂外部SRAM,RAM大小512K*16bit,正好1MB
一个大数组是不是不能同时跨用内外部SRAM? [相关图片]
外部SRAM已经测试可用(循环全写后读出来做数据比对),然后在MDK中启用外部ram的设置,并且申请一个1024*1024字节的大数组,编译后在map文件中已经能够看到
Total RW  Size (RW Data + ZI Data)           1049720 (1025.12kB)
说明数组确实已经编进去了
而且MDK自动给分配了RAM
    i                                        0x20000000   Data           4  main.o(.data)
    pSRAM                                    0x20000004   Data           4  main.o(.data)
    Data                                     0x20000008   Data           1  main.o(.data)
    uwTick                                   0x20000014   Data           4  stm32f4xx_hal.o(.data)
    uwTickPrio                               0x20000018   Data           4  stm32f4xx_hal.o(.data)
    uwTickFreq                               0x2000001c   Data           1  stm32f4xx_hal.o(.data)
    SystemCoreClock                          0x20000020   Data           4  system_stm32f4xx.o(.data)
    hsram1                                   0x20000024   Data          80  fsmc.o(.bss)
    __initial_sp                             0x20000478   Data           0  startup_stm32f407xx.o(STACK)
    BigData                                  0x68000000   Data       1048576  main.o(.bss)


BIgData就是那个大数组,大小1024*1024字节
那么问题来了,只要BigData的大小超过外部SRAM大小,哪怕超1字节,编译器就会报错说内存不够了
这是不是就说明单一一个变量不能跨内外部RAM使用,只能在内部或者在外部
7个回答
  • avatar cir2way
    回答时间: 2023-07-22 13:12:18

    数组不是连续分配的么?

  • avatar xmshao
    回答时间: 2023-07-22 13:33:10

    没那么玩过。如果IDE不支持,如果说两块地址都不连续,不支持是可以理解的。如果说两块地址是连续的,你可以尝试拆分成2块来定义,指定地址定义。

  • avatar HardwareMonkey1
    回答时间: 2023-07-22 14:05:02

    这个提问挺有意思,个人觉得是不能跨段的,除非地址是连续的,但实际上是内外RAM地址是不可能连续的。

  • avatar yr
    回答时间: 2023-07-22 14:22:36

    编译器根据数组申请的个数分配存储器,不管数组放在哪里或者哪怕SRAM还有富余空间,只要数组个数超过申请的个数,编译器都报错,个人认为这跟跨区无关

  • avatar yklstudent
    回答时间: 2023-07-22 14:39:26

    内部RAM和外部RAM地址又不连续

  • avatar 废鱼
    回答时间: 2023-07-22 15:10:01

    不会跨段的。编译器会自动处理的。可以看看堆栈说明中,变量的定义规则。

  • avatar butterflyspring
    回答时间: 2023-07-22 15:40:36

    如果跨越内部外部,那么地址就不是连续的,这让编译器为难了吧。对于硬件执行起来也有难度,速度就差很远哦。

会员中心 微信客服
客服
回到顶部