打印
[技术问答]

NUC505 程序如何定位到 SRAM?

[复制链接]
3357|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zhang..yb|  楼主 | 2015-7-14 16:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
/* Code that will impact SPIM DMM is placed in the spimcode section,
   which will be located at RAM instead of SPIROM at execution time. */
#if defined ( __CC_ARM )
//#pragma arm section code="spimcode"
//#pragma arm section
void SPIMCode_DelayMicroSec(uint32_t u32Delay) __attribute__((section("spimcode")));
void SPIMCode_SetBusClock(uint32_t u32SysClk, uint32_t u32SClk) __attribute__((section("spimcode")));
uint32_t SPIMCode_GetBusClock(void) __attribute__((section("spimcode")));
void SPIMCode_ConfigDMMMode(uint32_t u32SysClk, uint32_t u32SClk, uint32_t u32RdCmdCode) __attribute__((section("spimcode")));
#elif defined (__ICCARM__)
void SPIMCode_DelayMicroSec(uint32_t u32Delay) @ "spimcode";
void SPIMCode_SetBusClock(uint32_t u32SysClk, uint32_t u32SClk) @ "spimcode";
uint32_t SPIMCode_GetBusClock(void) @ "spimcode";
void SPIMCode_ConfigDMMMode(uint32_t u32SysClk, uint32_t u32SClk, uint32_t u32RdCmdCode) @ "spimcode";
#endif
上述程序怎么理解?芯片起动后 FLASH 拷贝到 RAM 是由哪个程序完成的?
沙发
gaoyang9992006| | 2015-7-14 21:01 | 只看该作者
这不是由程序完成的搬移吧,应该是硬件完成的。

使用特权

评论回复
板凳
玛尼玛尼哄| | 2015-7-14 21:07 | 只看该作者
#if defined ( __CC_ARM )
//#pragma arm section code="spimcode"
//#pragma arm section
这几句预编译实现的吧。

使用特权

评论回复
地板
春风的暖暖| | 2015-7-14 21:07 | 只看该作者
硬件自己动作的吧,和软件没有关系的

使用特权

评论回复
5
玛尼玛尼哄| | 2015-7-14 21:08 | 只看该作者
听了上面大侠的见解,我觉得也应该是硬件实现了搬移,比如总线,一般好像就是总线进行各个模块数据通信的。

使用特权

评论回复
6
zhang..yb|  楼主 | 2015-7-15 09:32 | 只看该作者
硬件实现不大可能,C 编译器实现在起动代码中实现搬移倒有可能,新唐该出个文档说明下。

使用特权

评论回复
7
小狗爱吃骨头| | 2015-7-15 10:11 | 只看该作者
对呀,新唐应该着重讲述一下这方面

使用特权

评论回复
8
xinba0625| | 2015-10-29 17:17 | 只看该作者
点击链接加入群【Nuvoton NUC505】:http://jq.qq.com/?_wv=1027&k=aBPl1W

使用特权

评论回复
9
sw8sw8| | 2015-10-29 21:34 | 只看该作者
Memory Map of the image

  Image Entry point : 0x00000179

  Load Region LR_ROM (Base: 0x00000000, Size: 0x000015a4, Max: 0x00200000, ABSOLUTE)

    Execution Region ER_CODE1_CONSTDATA1 (Base: 0x00000000, Size: 0x00000b80, Max: 0xffffffff, ABSOLUTE)

    Base Addr    Size         Type   Attr      Idx    E Section Name        Object

    0x00000000   0x000000bc   Data   RO            4    RESET               startup_nuc505series.o
    0x000000bc   0x00000008   Code   RO          946  * !!!main             c_w.l(__main.o)
    0x000000c4   0x00000034   Code   RO         1098    !!!scatter          c_w.l(__scatter.o)
    0x000000f8   0x0000001a   Code   RO         1100    !!handler_copy      c_w.l(__scatter_copy.o)
    0x00000112   0x00000002   PAD
    0x00000114   0x0000001c   Code   RO         1102    !!handler_zi        c_w.l(__scatter_zi.o)
    0x00000130   0x00000006   Code   RO          975    .ARM.Collect$$libinit$$00000000  c_w.l(libinit.o)
    0x00000136   0x00000000   Code   RO          983    .ARM.Collect$$libinit$$00000006  c_w.l(libinit2.o)
    0x00000136   0x00000000   Code   RO          985    .ARM.Collect$$libinit$$00000008  c_w.l(libinit2.o)
    0x00000136   0x00000000   Code   RO          987    .ARM.Collect$$libinit$$0000000A  c_w.l(libinit2.o)
    0x00000136   0x00000000   Code   RO          990    .ARM.Collect$$libinit$$0000000D  c_w.l(libinit2.o)
    0x00000136   0x00000000   Code   RO          992    .ARM.Collect$$libinit$$0000000F  c_w.l(libinit2.o)
    0x00000136   0x00000000   Code   RO          994    .ARM.Collect$$libinit$$00000011  c_w.l(libinit2.o)
    0x00000136   0x00000000   Code   RO          996    .ARM.Collect$$libinit$$00000013  c_w.l(libinit2.o)
    0x00000136   0x00000000   Code   RO          998    .ARM.Collect$$libinit$$00000015  c_w.l(libinit2.o)
    0x00000136   0x00000000   Code   RO         1000    .ARM.Collect$$libinit$$00000017  c_w.l(libinit2.o)
    0x00000136   0x00000000   Code   RO         1002    .ARM.Collect$$libinit$$00000019  c_w.l(libinit2.o)
    0x00000136   0x00000000   Code   RO         1004    .ARM.Collect$$libinit$$0000001B  c_w.l(libinit2.o)
    0x00000136   0x00000000   Code   RO         1006    .ARM.Collect$$libinit$$0000001D  c_w.l(libinit2.o)
    0x00000136   0x00000000   Code   RO         1008    .ARM.Collect$$libinit$$0000001F  c_w.l(libinit2.o)
    0x00000136   0x00000000   Code   RO         1010    .ARM.Collect$$libinit$$00000021  c_w.l(libinit2.o)
    0x00000136   0x00000000   Code   RO         1014    .ARM.Collect$$libinit$$00000028  c_w.l(libinit2.o)
    0x00000136   0x00000000   Code   RO         1016    .ARM.Collect$$libinit$$0000002A  c_w.l(libinit2.o)
    0x00000136   0x00000000   Code   RO         1018    .ARM.Collect$$libinit$$0000002C  c_w.l(libinit2.o)
    0x00000136   0x00000000   Code   RO         1020    .ARM.Collect$$libinit$$0000002E  c_w.l(libinit2.o)
    0x00000136   0x00000002   Code   RO         1021    .ARM.Collect$$libinit$$0000002F  c_w.l(libinit2.o)
    0x00000138   0x00000002   Code   RO         1041    .ARM.Collect$$libshutdown$$00000000  c_w.l(libshutdown.o)
    0x0000013a   0x00000000   Code   RO         1055    .ARM.Collect$$libshutdown$$00000003  c_w.l(libshutdown2.o)
    0x0000013a   0x00000000   Code   RO         1058    .ARM.Collect$$libshutdown$$00000006  c_w.l(libshutdown2.o)
    0x0000013a   0x00000000   Code   RO         1061    .ARM.Collect$$libshutdown$$00000009  c_w.l(libshutdown2.o)
    0x0000013a   0x00000000   Code   RO         1063    .ARM.Collect$$libshutdown$$0000000B  c_w.l(libshutdown2.o)
    0x0000013a   0x00000000   Code   RO         1066    .ARM.Collect$$libshutdown$$0000000E  c_w.l(libshutdown2.o)
    0x0000013a   0x00000002   Code   RO         1067    .ARM.Collect$$libshutdown$$0000000F  c_w.l(libshutdown2.o)
    0x0000013c   0x00000000   Code   RO          948    .ARM.Collect$$rtentry$$00000000  c_w.l(rtentry.o)
    0x0000013c   0x00000000   Code   RO          952    .ARM.Collect$$rtentry$$00000002  c_w.l(rtentry2.o)
    0x0000013c   0x00000006   Code   RO          964    .ARM.Collect$$rtentry$$00000004  c_w.l(rtentry4.o)
    0x00000142   0x00000000   Code   RO          954    .ARM.Collect$$rtentry$$00000009  c_w.l(rtentry2.o)
    0x00000142   0x00000004   Code   RO          955    .ARM.Collect$$rtentry$$0000000A  c_w.l(rtentry2.o)
    0x00000146   0x00000000   Code   RO          957    .ARM.Collect$$rtentry$$0000000C  c_w.l(rtentry2.o)
    0x00000146   0x00000008   Code   RO          958    .ARM.Collect$$rtentry$$0000000D  c_w.l(rtentry2.o)
    0x0000014e   0x00000002   Code   RO          979    .ARM.Collect$$rtexit$$00000000  c_w.l(rtexit.o)
    0x00000150   0x00000000   Code   RO         1025    .ARM.Collect$$rtexit$$00000002  c_w.l(rtexit2.o)
    0x00000150   0x00000004   Code   RO         1026    .ARM.Collect$$rtexit$$00000003  c_w.l(rtexit2.o)
    0x00000154   0x00000006   Code   RO         1027    .ARM.Collect$$rtexit$$00000004  c_w.l(rtexit2.o)
    0x0000015a   0x00000002   PAD
    0x0000015c   0x0000001c   Code   RO          686    .emb_text           retarget.o
    0x00000178   0x00000040   Code   RO            5  * .text               startup_nuc505series.o
    0x000001b8   0x0000008a   Code   RO          942    .text               c_w.l(rt_memcpy_v6.o)
    0x00000242   0x00000006   Code   RO          944    .text               c_w.l(heapauxi.o)
    0x00000248   0x00000064   Code   RO          949    .text               c_w.l(rt_memcpy_w.o)
    0x000002ac   0x0000004a   Code   RO          966    .text               c_w.l(sys_stackheap_outer.o)
    0x000002f6   0x0000000c   Code   RO          968    .text               c_w.l(exit.o)
    0x00000302   0x00000002   PAD
    0x00000304   0x00000008   Code   RO          976    .text               c_w.l(libspace.o)
    0x0000030c   0x0000000c   Code   RO         1033    .text               c_w.l(sys_exit.o)
    0x00000318   0x00000002   Code   RO         1044    .text               c_w.l(use_no_semi.o)
    0x0000031a   0x00000000   Code   RO         1046    .text               c_w.l(indicate_semi.o)
    0x0000031a   0x0000000a   Ven    RO         1104    Veneer$$Code        anon$$obj.o
    0x00000324   0x0000001e   Code   RO          122    i.CLK_EnableModuleClock  clk.o
    0x00000342   0x00000002   PAD
    0x00000344   0x00000050   Code   RO          124    i.CLK_GetAPLLClockFreq  clk.o
    0x00000394   0x00000014   Code   RO          127    i.CLK_GetHXTFreq    clk.o
    0x000003a8   0x00000034   Code   RO          129    i.CLK_GetPLLClockFreq  clk.o
    0x000003dc   0x000000b0   Code   RO          132    i.CLK_SetCoreClock  clk.o
    0x0000048c   0x00000074   Code   RO          134    i.CLK_SetModuleClock  clk.o
    0x00000500   0x00000002   Code   RO          688    i.Hard_Fault_Handler  retarget.o
    0x00000502   0x00000008   Code   RO          578    i.I2S_EnableInt     i2s.o
    0x0000050a   0x0000004a   Code   RO          579    i.I2S_EnableMCLK    i2s.o
    0x00000554   0x0000004c   Code   RO          580    i.I2S_GetSourceClockFreq  i2s.o
    0x000005a0   0x0000006c   Code   RO          776    i.I2S_Init          main.o
    0x0000060c   0x000000c8   Code   RO          581    i.I2S_Open          i2s.o
    0x000006d4   0x00000018   Code   RO          843    i.I2S_SET_INTERNAL_CODEC  codes_audio.o
    0x000006ec   0x000000b0   Code   RO          137    i.PLL_calculate     clk.o
    0x0000079c   0x00000044   Code   RO          777    i.SYS_Init          main.o
    0x000007e0   0x0000001a   Code   RO          257    i.SYS_ResetModule   sys.o
    0x000007fa   0x00000002   PAD
    0x000007fc   0x00000048   Code   RO           13    i.SystemCoreClockUpdate  system_nuc505series.o
    0x00000844   0x00000010   Code   RO           14    i.SystemInit        system_nuc505series.o
    0x00000854   0x00000090   Code   RO          845    i.demo_MIC0         codes_audio.o
    0x000008e4   0x00000098   Code   RO          779    i.main              main.o
    0x0000097c   0x0000000a   Code   RO         1022    x$fpl$fpinit        fz_wm.l(fpinit.o)
    0x00000986   0x00000002   PAD
    0x00000988   0x000001c8   Data   RO          138    .constdata          clk.o
    0x00000b50   0x00000030   Data   RO         1096    Region$$Table       anon$$obj.o


    Execution Region ER_VECTOR2 (Base: 0x1ff00000, Size: 0x00000400, Max: 0x00000400, ABSOLUTE, UNINIT)

    Base Addr    Size         Type   Attr      Idx    E Section Name        Object

    0x1ff00000   0x00000400   Zero   RW            1    ER_VECTOR2.bss      anon$$obj.o


    Execution Region ER_CODE2_CONSTDATA2 (Base: 0x1ff00400, Size: 0x0001e688, Max: 0x0001fc00, ABSOLUTE)

    Base Addr    Size         Type   Attr      Idx    E Section Name        Object

    0x1ff00400   0x00000678   Code   RO          910    .emb_text           audio_irq.o
    0x1ff00a78   0x00000050   Code   RO          911    i.I2S_IRQHandler    audio_irq.o
    0x1ff00ac8   0x00000002   Code   RO          912    i.SW                audio_irq.o
    0x1ff00aca   0x00000002   PAD
    0x1ff00acc   0x00000010   Data   RW           15    .data               system_nuc505series.o
    0x1ff00adc   0x00000348   Data   RW          914    .data               audio_irq.o
    0x1ff00e24   0x0001daf8   Zero   RW          913    .bss                audio_irq.o
    0x1ff1e91c   0x00000060   Zero   RW          977    .bss                c_w.l(libspace.o)
    0x1ff1e97c   0x00000004   PAD
    0x1ff1e980   0x00000008   Zero   RW            3    HEAP                startup_nuc505series.o
    0x1ff1e988   0x00000100   Zero   RW            2    STACK               startup_nuc505series.o



以上是我编译后的内存结果方法是编辑scatter.ld文件 。

LR_ROM 0x00000000 0x00200000 ; 2MB (SPI Flash)
{
   ; here is the SPI Flash section (code and const data) that just use once only at startup
   ER_CODE1_CONSTDATA1 +0
   {
                startup_NUC505Series.o(RESET, +First)
                startup_NUC505Series.o
                system_NUC505Series.o
                anon$$obj.o
                clk.o
                sys.o
                i2s.o
                rt_memcpy_v6.o
                heapauxi.o
                rtentry.o
                rt_memcpy_w.o
                rtentry2.o
                rtentry4.o
                sys_stackheap_outer.o
                exit.o
                libspace.o
                sys_exit.o
                use_no_semi.o
                indicate_semi.o
                retarget.o
                fpinit.o
                libinit.o
                libinit2.o
                libshutdown.o
                libshutdown2.o
                rtexit.o
                rtexit2.o
                ;i.demo_MIC0
                ;i.I2S_SET_INTERNAL_CODEC
                ;i.SYS_Init
                ;i.I2S_Init
                ;i.main  
                codes_audio.o
                main.o
                __main.o
                __scatter*.o
                ;*(+RO) ; text code and const data       
   }

   ; here are the SRAM sections moved at startup for fast accessing.
   ; Relocate vector table in SRAM for fast interrupt handling.
   ER_VECTOR2          0x1FF00000 EMPTY 0x00000400
   {
   }

   ER_CODE2_CONSTDATA2 0x1FF00400       0x0001FC00
   {
audio_irq.o

                *(+RW, +ZI) ; data and others
   }

   ;ER_DATA_ZI          0x1FF10000       0x00010000
   ;{
      ;*(+RW, +ZI) ; data and others
   ;}
}

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

103

主题

441

帖子

1

粉丝