查看: 1789|回复: 8

[已解决] 【求助】在MKL05上,如何将代码拷贝到内存运行?(已解决)

[复制链接]

该用户从未签到

196

主题

495

帖子

0

金牌会员

Rank: 6Rank: 6

积分
1482
最后登录
2020-12-3
发表于 2014-11-18 10:56:18 | 显示全部楼层 |阅读模式
本帖最后由 FSL_TICS_Robin 于 2014-11-24 09:59 编辑

在MKL05上,如何将代码拷贝到内存运行?谁能给个成功运行的例子?
我知道答案 目前已有8人回答
回复

使用道具 举报

  • TA的每日心情
    开心
    2018-7-2 06:04
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    59

    主题

    2888

    帖子

    10

    金牌会员

    Rank: 6Rank: 6

    积分
    6020
    最后登录
    2020-9-28
    发表于 2014-11-18 17:45:30 | 显示全部楼层
    楼主你好
    请问你是参考【经验分享】CW for kinetis 如何将flash代码copy到ram运行后遇到的问题吗?
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    196

    主题

    495

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1482
    最后登录
    2020-12-3
     楼主| 发表于 2014-11-19 12:23:52 | 显示全部楼层
    FSL_TICS_Robin 发表于 2014-11-18 17:45
    楼主你好
    请问你是参考【经验分享】CW for kinetis 如何将flash代码copy到ram运行后遇到的问题吗?
    ...

    没有。我看了那个太麻烦了。我自己写的。我把程序copy到一个数组中。然后把pc指针跳转到数组。跳转前程序取指令都是按2字节取的,跳转后,就变成4字节取指令了。所以,程序总是无法运行。如何让跳转后也按照4字节取指令呢?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    16

    主题

    705

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1745
    最后登录
    1970-1-1
    发表于 2014-11-19 13:44:50 | 显示全部楼层
    teclimber 发表于 2014-11-19 12:23
    没有。我看了那个太麻烦了。我自己写的。我把程序copy到一个数组中。然后把pc指针跳转到数组。跳转前程序 ...

    你是在什么IDE环境下拷贝到RAM中的呢?
    其实CW的方法一点都不麻烦。
    你可以参照那个代码,或者官方K60代码中的common_startup()函数,那个函数是将中断向量表复制到RAM中。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    196

    主题

    495

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1482
    最后登录
    2020-12-3
     楼主| 发表于 2014-11-19 14:23:25 | 显示全部楼层
    xinyinzhou 发表于 2014-11-19 13:44
    你是在什么IDE环境下拷贝到RAM中的呢?
    其实CW的方法一点都不麻烦。
    你可以参照那个代码,或者官方K60代 ...

    我用的cw10.6.
    按照上面的工程,我复制到我的工程,编译总是过不去。
    提示:
    ../Sources/main.c:83:0: warning: ignoring #pragma define_section mySectionInRAM [-Wunknown-pragmas]
    ../Sources/main.c:85:20: error: expected ')' before string constant

    附件是我的工程。

    kl05z32vlf_ramcode.rar

    422.27 KB, 下载次数: 1, 下载积分: 威望 1

    回复 支持 反对

    使用道具 举报

    该用户从未签到

    196

    主题

    495

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1482
    最后登录
    2020-12-3
     楼主| 发表于 2014-11-19 15:24:02 | 显示全部楼层
    FSL_TICS_Robin 发表于 2014-11-18 17:45
    楼主你好
    请问你是参考【经验分享】CW for kinetis 如何将flash代码copy到ram运行后遇到的问题吗?
    ...

    你好,我参照上面的程序,现在程序是运行起来了。但是有一个疑问。
    在上面的例子中的Ld文件增加了如下内容,
    ___MYRAMCodeStart   =  ___ROM_AT + SIZEOF(.app_data) +  SIZEOF(.romp) ;

    .copyToRAM : AT(___MYRAMCodeStart)
    {
        . = ALIGN (0x4);
        ___MYRAMStart = .;
        *(.myCodeInRAM)
        ___MYRAMEnd = .;
        . = ALIGN (0x4);
    } > myram

    ___MYRAMCodeSize = ___MYRAMEnd - ___MYRAMStart;

    我copy到我的工程的ld文件中。结果编译错误,我就改为了
    ___MYRAMCodeStart   =  ___ROM_AT  +  SIZEOF(.romp) ;

    .copyToRAM : AT(___MYRAMCodeStart)
    {
        . = ALIGN (0x4);
        ___MYRAMStart = .;
        *(.myCodeInRAM)
        ___MYRAMEnd = .;
        . = ALIGN (0x4);
    } > myram

    ___MYRAMCodeSize = ___MYRAMEnd - ___MYRAMStart;

    然后,就可以通过,并运行了。
    我的问题就是___MYRAMCodeStart   =  ___ROM_AT  +  SIZEOF(.romp) ; 要怎样写?随便写都可以吗?有什么规则?


    下面是我的整个ld文件:
    /*
    *****************************************************************************
    **
    **  File        : KL05Z32M4_flash.ld
    **
    **  Default linker command file for Flash targets
    **
    *****************************************************************************
    */
    /* Entry Point */
    ENTRY(__thumb_startup)

    /* Highest address of the user mode stack */
    _estack = 0x20000C00;    /* end of SRAM */
    __SP_INIT = _estack;

    /* Generate a link error if heap and stack don't fit into RAM */
    __heap_size = 0x100;                /* required amount of heap  */
    __stack_size = 0x100;                 /* required amount of stack */

    /* Specify the memory areas */
    MEMORY
    {
      m_interrupts    (rx) : ORIGIN = 0x00000000, LENGTH = 0xC0
      m_cfmprotrom     (rx) : ORIGIN = 0x00000400, LENGTH = 0x10
      m_text         (rx) : ORIGIN = 0x00000800, LENGTH = 32K - 0x800
      m_data        (rwx) : ORIGIN = 0x1FFFFC00, LENGTH = 3K            /* SRAM */
      myram        (rwx) : ORIGIN = 0x20000800, LENGTH = 1K            /* SRAM */
      
    }

            
    /* Define output sections */
    SECTIONS
    {
      /* The startup code goes first into Flash */
      .interrupts :
      {
        __vector_table = .;
        . = ALIGN(4);
        KEEP(*(.vectortable)) /* Startup code */
        . = ALIGN(4);
      } > m_interrupts
      
      .cfmprotect :
      {
        . = ALIGN(4);
        KEEP(*(.cfmconfig))    /* Flash Configuration Field (FCF) */
        . = ALIGN(4);
      } > m_cfmprotrom

      /* The program code and other data goes into Flash */
      .text :
      {
        . = ALIGN(4);
        *(.text)           /* .text sections (code) */
        *(.text*)          /* .text* sections (code) */
        *(.rodata)         /* .rodata sections (constants, strings, etc.) */
        *(.rodata*)        /* .rodata* sections (constants, strings, etc.) */
        *(.glue_7)         /* glue arm to thumb code */
        *(.glue_7t)        /* glue thumb to arm code */
        *(.eh_frame)

        KEEP (*(.init))
        KEEP (*(.fini))

        . = ALIGN(4);
        _etext = .;        /* define a global symbols at end of code */
      } > m_text

      .ARM.extab   : { *(.ARM.extab* .gnu.linkonce.armextab.*) } > m_text
      .ARM : {
        __exidx_start = .;
          *(.ARM.exidx*)
          __exidx_end = .;
      } > m_text
      
      .ctors :
      {
        __CTOR_LIST__ = .;
        /* gcc uses crtbegin.o to find the start of
           the constructors, so we make sure it is
           first.  Because this is a wildcard, it
           doesn't matter if the user does not
           actually link against crtbegin.o; the
           linker won't look for a file to match a
           wildcard.  The wildcard also means that it
           doesn't matter which directory crtbegin.o
           is in.  */
        KEEP (*crtbegin.o(.ctors))
        /* We don't want to include the .ctor section from
           from the crtend.o file until after the sorted ctors.
           The .ctor section from the crtend file contains the
           end of ctors marker and it must be last */
        KEEP (*(EXCLUDE_FILE (*crtend.o ) .ctors))
        KEEP (*(SORT(.ctors.*)))
        KEEP (*(.ctors))
        __CTOR_END__ = .;
      } > m_text  
      .dtors :
      {
        __DTOR_LIST__ = .;
        KEEP (*crtbegin.o(.dtors))
        KEEP (*(EXCLUDE_FILE (*crtend.o ) .dtors))
        KEEP (*(SORT(.dtors.*)))
        KEEP (*(.dtors))
        __DTOR_END__ = .;
      } > m_text  

      .preinit_array :
      {
        PROVIDE_HIDDEN (__preinit_array_start = .);
        KEEP (*(.preinit_array*))
        PROVIDE_HIDDEN (__preinit_array_end = .);
      } > m_text
      .init_array :
      {
        PROVIDE_HIDDEN (__init_array_start = .);
        KEEP (*(SORT(.init_array.*)))
        KEEP (*(.init_array*))
        PROVIDE_HIDDEN (__init_array_end = .);
      } > m_text
      .fini_array :
      {
        PROVIDE_HIDDEN (__fini_array_start = .);
        KEEP (*(SORT(.fini_array.*)))
        KEEP (*(.fini_array*))
        PROVIDE_HIDDEN (__fini_array_end = .);
       
        ___ROM_AT = .;
      } > m_text
      
      /* reserve MTB memory at the beginning of m_data */
      .mtb : /* MTB buffer address as defined by the hardware */
      {
        . = ALIGN(8);
        _mtb_start = .;
        KEEP(*(.mtb_buf)) /* need to KEEP Micro Trace Buffer as not referenced by application */
        . = ALIGN(8);
        _mtb_end = .;
      } > m_data  


      



      /* Initialized data sections goes into RAM, load LMA copy after code */
      .data : AT(___ROM_AT)
      {
        . = ALIGN(4);
        _sdata = .;        /* create a global symbol at data start */
        *(.data)           /* .data sections */
        *(.data*)          /* .data* sections */

        . = ALIGN(4);
        _edata = .;        /* define a global symbol at data end */
      } > m_data
      
      ___data_size = _edata - _sdata;
      
      /* Uninitialized data section */
      . = ALIGN(4);
      .bss :
      {
        /* This is used by the startup in order to initialize the .bss section */
        __START_BSS = .;
        PROVIDE ( __bss_start__ = __START_BSS );
        *(.bss)
        *(.bss*)
        *(COMMON)

        . = ALIGN(4);
        __END_BSS = .;
        PROVIDE ( __bss_end__ = __END_BSS );
      } > m_data

      _romp_at = ___ROM_AT + SIZEOF(.data);
      .romp : AT(_romp_at)
      {
        __S_romp = _romp_at;
        LONG(___ROM_AT);
        LONG(_sdata);
        LONG(___data_size);
        LONG(0);
        LONG(0);
        LONG(0);
      } > m_data
      
        /* User_heap_stack section, used to check that there is enough RAM left */
      ._user_heap_stack :
      {
        . = ALIGN(4);
        PROVIDE ( end = . );
        PROVIDE ( _end = . );
        __heap_addr = .;
        . = . + __heap_size;
        . = . + __stack_size;
        . = ALIGN(4);
      } > m_data

    ___MYRAMCodeStart   =  ___ROM_AT  +  SIZEOF(.romp) ;

    .copyToRAM : AT(___MYRAMCodeStart)
    {
        . = ALIGN (0x4);
        ___MYRAMStart = .;
        *(.myCodeInRAM)
        ___MYRAMEnd = .;
        . = ALIGN (0x4);
    } > myram

    ___MYRAMCodeSize = ___MYRAMEnd - ___MYRAMStart;

      .ARM.attributes 0 : { *(.ARM.attributes) }
    }



    回复 支持 反对

    使用道具 举报

    该用户从未签到

    16

    主题

    705

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1745
    最后登录
    1970-1-1
    发表于 2014-11-19 16:40:21 | 显示全部楼层
    teclimber 发表于 2014-11-19 15:24
    你好,我参照上面的程序,现在程序是运行起来了。但是有一个疑问。
    在上面的例子中的Ld文件增加了如下内 ...

    关于___MYRAMCodeStart   =  ___ROM_AT  +  SIZEOF(.romp)的写法,在文档中讲了,你可以看看:
    https://www.nxpic.org.cn/module/ ... yNTc1Nnw1NjkxNTM%3D

    具体的意思都讲的比较清楚。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    196

    主题

    495

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1482
    最后登录
    2020-12-3
     楼主| 发表于 2014-11-20 10:47:54 | 显示全部楼层
    xinyinzhou 发表于 2014-11-19 16:40
    关于___MYRAMCodeStart   =  ___ROM_AT  +  SIZEOF(.romp)的写法,在文档中讲了,你可以看看:
    http://ww ...

    谢谢你的回复,文档确实讲的很详细。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    16

    主题

    705

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1745
    最后登录
    1970-1-1
    发表于 2014-11-20 14:09:20 | 显示全部楼层
    teclimber 发表于 2014-11-20 10:47
    谢谢你的回复,文档确实讲的很详细。

    不客气,有问题,大家一起讨论。
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-7-21 16:42 , Processed in 0.107405 second(s), 30 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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