硬汉嵌入式论坛

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

[ZLG EasyARM-RT1052] 求教前辈们,怎么才能将所有ROM内的代码全部copy到SDRAM中运行?

[复制链接]

1

主题

4

回帖

7

积分

新手上路

积分
7
发表于 2019-5-3 16:11:04 | 显示全部楼层 |阅读模式
板子是:1052+nor Flash/IS25LP064A-JBLE+ SDRAM/IS42S16160J-7TLI,目的是实现能够擦除读写Flash的数据(类似与LPC那种IAP的功能)。
我的思路:把运行在nor flash中的 RO、code统统在启动后拷贝到SDRAM中运行,我改了分散加载文件,指定了这些程序的运行域,
但是不知道为什么?读写flash,擦除flash扇区的函数都会导致程序跑飞或者重启,
读写,擦除flash的函数应该是正确的,因为如果我把加载域改在debug中,一切都是那么的对。
想问下各位前辈,是不是我的思路有问题?还是我遗漏了什么内容呢?
下面是我的分散加载文件

#define m_flash_config_start           0x60000000
#define m_flash_config_size            0x00001000

#define m_ivt_start                    0x60001000
#define m_ivt_size                     0x00001000

#define m_interrupts_start             0x60002000
#define m_interrupts_size              0x00000400

#define m_text_start                   0x60002400
#define m_text_size                    0x03FFDC00

#define m_data_start                   0x20000000
#define m_data_size                    0x00020000

#define m_data2_start                  0x00000000
#define m_data2_size                   0x00020000

#define m_sdram_start                   0x80000000
#define m_sdram_size                    0x01E00000

#define m_ncache_start                 0x81E00000
#define m_ncache_size                  0x00200000
/* Sizes */
#if (defined(__stack_size__))
  #define Stack_Size                   __stack_size__
#else
  #define Stack_Size                   0x0400
#endif

#if (defined(__heap_size__))
  #define Heap_Size                    __heap_size__
#else
  #define Heap_Size                    0x0400
#endif

LR_m_rom_config m_flash_config_start m_flash_config_size {   ; load region size_region
        RW_m_config_text m_flash_config_start m_flash_config_size { ; load address = execution address
        * (.boot_hdr.conf, +FIRST)
        }
}

LR_m_rom_ivt m_ivt_start m_ivt_size {   ; load region size_region
        RW_m_ivt_text m_ivt_start m_ivt_size { ; load address = execution address
        * (.boot_hdr.ivt, +FIRST)
        * (.boot_hdr.boot_data)
        * (.boot_hdr.dcd_data)
        }
}

LR_m_text m_interrupts_start m_text_start+m_text_size-m_interrupts_size {   ; load region size_region
  VECTOR_ROM m_interrupts_start m_interrupts_size { ; load address = execution address
    * (RESET,+FIRST)
  }
  ER_m_text m_text_start m_text_size { ; load address = execution address
    * (InRoot$$Sections)
        startup_MIMXRT1052.o
        system_MIMXRT1052.o
;        .ANY (+RO)
  }
  RW_m_data m_sdram_start m_sdram_size-Stack_Size-Heap_Size { ; RW data
        .ANY (+RO)
    .ANY (+RW +ZI)
        *(m_usb_dma_init_data)
    *(m_usb_dma_noninit_data)
  }
  RW_m_boot m_data_start m_data_size { ;Ram Flashloader data
        * (.ram_flashloader)
  }
  
  ARM_LIB_HEAP +0 EMPTY Heap_Size {    ; Heap region growing up
  }
  ARM_LIB_STACK m_data_start+m_data_size EMPTY -Stack_Size { ; Stack region growing down
  }
  RW_m_ncache m_ncache_start m_ncache_size { ; ncache RW data
    * (NonCacheable.init)
    * (NonCacheable)
  }
}


回复

使用道具 举报

1

主题

4

回帖

7

积分

新手上路

积分
7
 楼主| 发表于 2019-5-3 16:12:41 | 显示全部楼层
这是编译产生的map文件
==============================================================================

Memory Map of the image

  Image Entry point : 0x60002401

  Load Region LR_m_rom_config (Base: 0x60000000, Size: 0x00000200, Max: 0x00001000, ABSOLUTE)

    Execution Region RW_m_config_text (Base: 0x60000000, Size: 0x00000200, Max: 0x00001000, ABSOLUTE)

    Base Addr    Size         Type   Attr      Idx    E Section Name        Object

    0x60000000   0x00000200   Data   RO         1515    .boot_hdr.conf      evkbimxrt1050_flexspi_nor_config.o



  Load Region LR_m_rom_ivt (Base: 0x60001000, Size: 0x00000460, Max: 0x00001000, ABSOLUTE)

    Execution Region RW_m_ivt_text (Base: 0x60001000, Size: 0x00000460, Max: 0x00001000, ABSOLUTE)

    Base Addr    Size         Type   Attr      Idx    E Section Name        Object

    0x60001000   0x00000020   Data   RO         1490    .boot_hdr.ivt       fsl_flexspi_nor_boot.o
    0x60001020   0x00000010   Data   RO         1489    .boot_hdr.boot_data  fsl_flexspi_nor_boot.o
    0x60001030   0x00000430   Data   RO         1536    .boot_hdr.dcd_data  evkbimxrt1050_sdram_ini_dcd.o



  Load Region LR_m_text (Base: 0x60002000, Size: 0x00004088, Max: 0x63fffc00, ABSOLUTE, COMPRESSED[0x00003f2c])

    Execution Region RW_m_boot (Base: 0x20000000, Size: 0x00000ec8, Max: 0x00020000, ABSOLUTE, COMPRESSED[0x00000d6c])

    Base Addr    Size         Type   Attr      Idx    E Section Name        Object

    0x20000000   0x00000ec8   Data   RW          217    .ram_flashloader    ram_flashloadero3.o


    Execution Region ARM_LIB_HEAP (Base: 0x20000ec8, Size: 0x00000400, Max: 0x00000400, ABSOLUTE)

    Base Addr    Size         Type   Attr      Idx    E Section Name        Object

    0x20000ec8   0x00000400   Zero   RW            1    ARM_LIB_HEAP.bss    anon$$obj.o


    Execution Region ARM_LIB_STACK (Base: 0x2001fc00, Size: 0x00000400, Max: 0x00000400, ABSOLUTE)

    Base Addr    Size         Type   Attr      Idx    E Section Name        Object

    0x2001fc00   0x00000400   Zero   RW            2    ARM_LIB_STACK.bss   anon$$obj.o


    Execution Region VECTOR_ROM (Base: 0x60002000, Size: 0x00000400, Max: 0x00000400, ABSOLUTE)

    Base Addr    Size         Type   Attr      Idx    E Section Name        Object

    0x60002000   0x00000400   Data   RO         1186    RESET               startup_mimxrt1052.o


    Execution Region ER_m_text (Base: 0x60002400, Size: 0x00000438, Max: 0x03ffdc00, ABSOLUTE)

    Base Addr    Size         Type   Attr      Idx    E Section Name        Object

    0x60002400   0x00000000   Code   RO         1548  * .ARM.Collect$$$$00000000  mc_w.l(entry.o)
    0x60002400   0x00000004   Code   RO         1591    .ARM.Collect$$$$00000003  mc_w.l(entry4.o)
    0x60002404   0x00000004   Code   RO         1594    .ARM.Collect$$$$00000004  mc_w.l(entry5.o)
    0x60002408   0x00000000   Code   RO         1596    .ARM.Collect$$$$00000008  mc_w.l(entry7b.o)
    0x60002408   0x00000000   Code   RO         1598    .ARM.Collect$$$$0000000A  mc_w.l(entry8b.o)
    0x60002408   0x00000008   Code   RO         1599    .ARM.Collect$$$$0000000B  mc_w.l(entry9a.o)
    0x60002410   0x00000000   Code   RO         1601    .ARM.Collect$$$$0000000D  mc_w.l(entry10a.o)
    0x60002410   0x00000000   Code   RO         1603    .ARM.Collect$$$$0000000F  mc_w.l(entry11a.o)
    0x60002410   0x00000004   Code   RO         1592    .ARM.Collect$$$$00002714  mc_w.l(entry4.o)
    0x60002414   0x000001bc   Code   RO         1187    .text               startup_mimxrt1052.o
    0x600025d0   0x00000024   Code   RO         1611    .text               mc_w.l(init.o)
    0x600025f4   0x0000009c   Code   RO         1133    i.SCB_EnableDCache  system_mimxrt1052.o
    0x60002690   0x0000007c   Code   RO         1134    i.SCB_EnableICache  system_mimxrt1052.o
    0x6000270c   0x000000cc   Code   RO         1136    i.SystemInit        system_mimxrt1052.o
    0x600027d8   0x00000002   Code   RO         1137    i.SystemInitHook    system_mimxrt1052.o
    0x600027da   0x0000000e   Code   RO         1615    i.__scatterload_copy  mc_w.l(handlers.o)
    0x600027e8   0x00000002   Code   RO         1616    i.__scatterload_null  mc_w.l(handlers.o)
    0x600027ea   0x0000000e   Code   RO         1617    i.__scatterload_zeroinit  mc_w.l(handlers.o)
    0x600027f8   0x00000040   Data   RO         1613    Region$$Table       anon$$obj.o


    Execution Region RW_m_data (Base: 0x80000000, Size: 0x00002bac, Max: 0x01dff800, ABSOLUTE)

    Base Addr    Size         Type   Attr      Idx    E Section Name        Object

    0x80000000   0x00000062   Code   RO         1551    .text               mc_w.l(uldiv.o)
    0x80000062   0x00000024   Code   RO         1553    .text               mc_w.l(memcpya.o)
    0x80000086   0x00000024   Code   RO         1555    .text               mc_w.l(memseta.o)
    0x800000aa   0x0000000e   Code   RO         1557    .text               mc_w.l(strlen.o)
    0x800000b8   0x0000001a   Code   RO         1559    .text               mc_w.l(memcmp.o)
    0x800000d2   0x0000001e   Code   RO         1605    .text               mc_w.l(llshl.o)
    0x800000f0   0x00000020   Code   RO         1607    .text               mc_w.l(llushr.o)
    0x80000110   0x0000005e   Code   RO         1621    .text               mc_w.l(__dclz77c.o)
    0x8000016e   0x00000002   PAD
    0x80000170   0x000002f4   Code   RO          364    i.BOARD_BootClockRUN  clock_config.o
    0x80000464   0x000001b4   Code   RO          293    i.BOARD_ConfigMPU   board.o
    0x80000618   0x00000078   Code   RO          294    i.BOARD_DebugConsoleSrcFreq  board.o
    0x80000690   0x0000001c   Code   RO          295    i.BOARD_InitDebugConsole  board.o
    0x800006ac   0x000000a8   Code   RO          239    i.BOARD_InitPins    pin_mux.o
    0x80000754   0x00000088   Code   RO          240    i.CLOCK_ControlGate  pin_mux.o
    0x800007dc   0x00000088   Code   RO          678    i.CLOCK_ControlGate  fsl_lpuart.o
    0x80000864   0x00000020   Code   RO          296    i.CLOCK_GetDiv      board.o
    0x80000884   0x00000020   Code   RO          433    i.CLOCK_GetOscFreq  fsl_clock.o
    0x800008a4   0x0000022c   Code   RO          435    i.CLOCK_GetPllFreq  fsl_clock.o
    0x80000ad0   0x00000058   Code   RO          438    i.CLOCK_InitArmPll  fsl_clock.o
    0x80000b28   0x00000058   Code   RO          444    i.CLOCK_InitSysPll  fsl_clock.o
    0x80000b80   0x00000038   Code   RO          445    i.CLOCK_InitUsb1Pfd  fsl_clock.o
    0x80000bb8   0x00000058   Code   RO          446    i.CLOCK_InitUsb1Pll  fsl_clock.o
    0x80000c10   0x00000070   Code   RO            6    i.CLOCK_SetDiv      gpio_led_output.o
    0x80000c80   0x000000c4   Code   RO          366    i.CLOCK_SetDiv      clock_config.o
    0x80000d44   0x000000c4   Code   RO            7    i.CLOCK_SetMux      gpio_led_output.o
    0x80000e08   0x000000c4   Code   RO          367    i.CLOCK_SetMux      clock_config.o
    0x80000ecc   0x000000a8   Code   RO         1318    i.ConvertRadixNumToString  fsl_str.o
    0x80000f74   0x0000005c   Code   RO         1377    i.DbgConsole_Init   fsl_debug_console.o
    0x80000fd0   0x00000040   Code   RO         1378    i.DbgConsole_Printf  fsl_debug_console.o
    0x80001010   0x0000003e   Code   RO         1380    i.DbgConsole_RelocateLog  fsl_debug_console.o
    0x8000104e   0x00000002   PAD
    0x80001050   0x000000ac   Code   RO          982    i.FLEXSPI_CheckAndClearError  fsl_flexspi.o
    0x800010fc   0x00000018   Code   RO          985    i.FLEXSPI_DriverIRQHandler  fsl_flexspi.o
    0x80001114   0x0000001e   Code   RO          987    i.FLEXSPI_GetBusIdleStatus  fsl_flexspi.o
    0x80001132   0x000000d6   Code   RO          991    i.FLEXSPI_ReadBlocking  fsl_flexspi.o
    0x80001208   0x0000006c   Code   RO          994    i.FLEXSPI_TransferAbort  fsl_flexspi.o
    0x80001274   0x000000d2   Code   RO          995    i.FLEXSPI_TransferBlocking  fsl_flexspi.o
    0x80001346   0x0000016a   Code   RO          998    i.FLEXSPI_TransferHandleIRQ  fsl_flexspi.o
    0x800014b0   0x000000a8   Code   RO         1000    i.FLEXSPI_UpdateLUT  fsl_flexspi.o
    0x80001558   0x00000096   Code   RO         1001    i.FLEXSPI_WriteBlocking  fsl_flexspi.o
    0x800015ee   0x0000000c   Code   RO          241    i.IOMUXC_SetPinConfig  pin_mux.o
    0x800015fa   0x0000001a   Code   RO          242    i.IOMUXC_SetPinMux  pin_mux.o
    0x80001614   0x000000d0   Code   RO         1195    i.IO_Init           fsl_io.o
    0x800016e4   0x00000044   Code   RO         1196    i.IO_Transfer       fsl_io.o
    0x80001728   0x00000024   Code   RO         1248    i.LOG_Init          fsl_log.o
    0x8000174c   0x00000022   Code   RO         1249    i.LOG_Pop           fsl_log.o
    0x8000176e   0x00000002   PAD
    0x80001770   0x0000006c   Code   RO         1250    i.LOG_Push          fsl_log.o
    0x800017dc   0x0000001c   Code   RO          679    i.LPUART1_DriverIRQHandler  fsl_lpuart.o
    0x800017f8   0x0000001c   Code   RO          680    i.LPUART2_DriverIRQHandler  fsl_lpuart.o
    0x80001814   0x0000001c   Code   RO          681    i.LPUART3_DriverIRQHandler  fsl_lpuart.o
    0x80001830   0x0000001c   Code   RO          682    i.LPUART4_DriverIRQHandler  fsl_lpuart.o
    0x8000184c   0x0000001c   Code   RO          683    i.LPUART5_DriverIRQHandler  fsl_lpuart.o
    0x80001868   0x0000001c   Code   RO          684    i.LPUART6_DriverIRQHandler  fsl_lpuart.o
    0x80001884   0x0000001c   Code   RO          685    i.LPUART7_DriverIRQHandler  fsl_lpuart.o
    0x800018a0   0x0000001c   Code   RO          686    i.LPUART8_DriverIRQHandler  fsl_lpuart.o
    0x800018bc   0x00000058   Code   RO          687    i.LPUART_ClearStatusFlags  fsl_lpuart.o
    0x80001914   0x00000080   Code   RO          691    i.LPUART_GetDefaultConfig  fsl_lpuart.o
    0x80001994   0x00000098   Code   RO          693    i.LPUART_GetInstance  fsl_lpuart.o
    0x80001a2c   0x00000010   Code   RO          694    i.LPUART_GetStatusFlags  fsl_lpuart.o
    0x80001a3c   0x00000308   Code   RO          695    i.LPUART_Init       fsl_lpuart.o
    0x80001d44   0x00000110   Code   RO          696    i.LPUART_ReadBlocking  fsl_lpuart.o
    0x80001e54   0x0000007c   Code   RO          712    i.LPUART_WriteBlocking  fsl_lpuart.o
    0x80001ed0   0x000000a0   Code   RO          297    i.SCB_DisableDCache  board.o
    0x80001f70   0x0000009c   Code   RO          298    i.SCB_EnableDCache  board.o
    0x8000200c   0x0000007c   Code   RO          299    i.SCB_EnableICache  board.o
    0x80002088   0x0000022e   Code   RO         1320    i.StrFormatPrintf   fsl_str.o
    0x800022b6   0x00000002   PAD
    0x800022b8   0x00000044   Code   RO         1465    i.__aeabi_assert    fsl_assert.o
    0x800022fc   0x0000005a   Code   RO            8    i.flexspi_nor_enable_quad_mode  gpio_led_output.o
    0x80002356   0x00000064   Code   RO            9    i.flexspi_nor_flash_erase_sector  gpio_led_output.o
    0x800023ba   0x0000005c   Code   RO           10    i.flexspi_nor_flash_page_program  gpio_led_output.o
    0x80002416   0x0000003e   Code   RO           11    i.flexspi_nor_get_vendor_id  gpio_led_output.o
    0x80002454   0x00000052   Code   RO           12    i.flexspi_nor_wait_bus_busy  gpio_led_output.o
    0x800024a6   0x0000002e   Code   RO           13    i.flexspi_nor_write_enable  gpio_led_output.o
    0x800024d4   0x000002f0   Code   RO           14    i.main              gpio_led_output.o
    0x800027c4   0x000000f0   Data   RO           16    .constdata          gpio_led_output.o
    0x800028b4   0x0000001a   Data   RO          368    .constdata          clock_config.o
    0x800028ce   0x00000002   PAD
    0x800028d0   0x00000010   Data   RO          450    .constdata          fsl_clock.o
    0x800028e0   0x00000048   Data   RO          715    .constdata          fsl_lpuart.o
    0x80002928   0x00000043   Data   RO         1384    .conststring        fsl_debug_console.o
    0x8000296b   0x00000001   PAD
    0x8000296c   0x00000008   Data   RW          451    .data               fsl_clock.o
    0x80002974   0x00000004   Data   RW          716    .data               fsl_lpuart.o
    0x80002978   0x00000004   Data   RW         1003    .data               fsl_flexspi.o
    0x8000297c   0x00000004   Data   RW         1138    .data               system_mimxrt1052.o
    0x80002980   0x00000008   Data   RW         1198    .data               fsl_io.o
    0x80002988   0x00000200   Zero   RW           15    .bss                gpio_led_output.o
    0x80002b88   0x00000024   Zero   RW          714    .bss                fsl_lpuart.o


    Execution Region RW_m_ncache (Base: 0x81e00000, Size: 0x00000000, Max: 0x00200000, ABSOLUTE)

    **** No section assigned to this execution region ****


==============================================================================
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117512
QQ
发表于 2019-5-5 00:37:20 | 显示全部楼层
帮顶。
回复

使用道具 举报

4

主题

148

回帖

160

积分

初级会员

积分
160
发表于 2019-5-5 13:16:18 | 显示全部楼层
试一下官方的SDK,他们的flexspi工程就是将整个.o文件拷贝到RAM中运行的。
回复

使用道具 举报

1

主题

4

回帖

7

积分

新手上路

积分
7
 楼主| 发表于 2019-5-6 07:55:14 | 显示全部楼层
zl1215 发表于 2019-5-5 13:16
试一下官方的SDK,他们的flexspi工程就是将整个.o文件拷贝到RAM中运行的。

那个FlexSpi工程我试过,它是加载在0x00000000地址的,只能debug调试,但是我希望能加载到flash中用
回复

使用道具 举报

4

主题

148

回帖

160

积分

初级会员

积分
160
发表于 2019-5-6 08:55:01 | 显示全部楼层
wx_N19bfK1H 发表于 2019-5-6 07:55
那个FlexSpi工程我试过,它是加载在0x00000000地址的,只能debug调试,但是我希望能加载到flash中用

你target选的不对,选那个flexspi_nor_debug,这个target下只有操作flexspi的文件被link到ram,其他的都是在flash里面运行,包括main函数
回复

使用道具 举报

1

主题

4

回帖

7

积分

新手上路

积分
7
 楼主| 发表于 2019-5-6 10:54:01 | 显示全部楼层
zl1215 发表于 2019-5-6 08:55
你target选的不对,选那个flexspi_nor_debug,这个target下只有操作flexspi的文件被link到ram,其他的都 ...

target里没有flexspi_nor_debug,这个例程是直接把flash当成一个普通外设来读写的
target.PNG
回复

使用道具 举报

4

主题

148

回帖

160

积分

初级会员

积分
160
发表于 2019-5-6 13:57:47 | 显示全部楼层
wx_N19bfK1H 发表于 2019-5-6 10:54
target里没有flexspi_nor_debug,这个例程是直接把flash当成一个普通外设来读写的

我建议你下一个官方的SDK,里面比较详细,看明白了移植到目前这个工程应该也方便的。
不过我图上看确实没有nor运行的target,官方SDK里面是有的。
这个思路就是把FlexSPI当成一个芯片的一个IP来用,也可以映射到内部的AHB总线上直接取指针方式操作。
回复

使用道具 举报

1

主题

4

回帖

7

积分

新手上路

积分
7
 楼主| 发表于 2019-5-7 10:34:48 | 显示全部楼层
zl1215 发表于 2019-5-6 13:57
我建议你下一个官方的SDK,里面比较详细,看明白了移植到目前这个工程应该也方便的。
不过我图上看确实 ...

很感谢你的回复,我找到这个例程了,我的思路正确,只需要多一个操作就行
使用__attribute__((section("NonCacheable")))将FlexSPI读写的函数插入SDRAM(奇怪的是看map文件时这些函数明明都已经映射到SDRAM,为什么还要多此一举?)。中断向量表貌似也要映射多一份到RAM(这里不是很明白怎么做到的,保留意见)
回复

使用道具 举报

10

主题

38

回帖

68

积分

初级会员

积分
68
发表于 2019-5-21 19:02:53 | 显示全部楼层
wx_N19bfK1H 发表于 2019-5-7 10:34
很感谢你的回复,我找到这个例程了,我的思路正确,只需要多一个操作就行

你好,你的方法能共享一下吗 ?我目前也是这种情况。
回复

使用道具 举报

0

主题

5

回帖

5

积分

新手上路

积分
5
发表于 2019-7-4 06:24:32 | 显示全部楼层
linker文件只是初始化定义,正确执行还需要在程序里面定义函数的执行位置。仿真的时时候不定义_attribute__((section("NonCacheable")))可行?估计也会出问题吧
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-8-12 02:47 , Processed in 0.046741 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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