Andes Workshop
http://forum.andestech.com/

把某些text放到SRAM上執行的example
http://forum.andestech.com/viewtopic.php?f=16&t=601
Page 1 of 1

Author:  cindy [ Tue Jul 31, 2012 4:00 pm ]
Post subject:  把某些text放到SRAM上執行的example

下面有一小段code,

Code:
int main(void) {

    int result;

   result=add(1,2);
   result=mul(3,4);
   return EXIT_SUCCESS;
}


其中add()這個function我要放到flash上,
在執行前要搬到copy到ram裡,
使得add()在ram上執行。

步驟:
(1) 在linker script裡,要定義add的text在特定區域裡執行。
Code:
  .text2 : {
        PROVIDE (_begin_text2 = . );
      add.o (.text)
        PROVIDE (_end_text2 = .);
   }>SDRAM AT>FLASH

其中>SDRAM AT>FLASH表示放在flash裡,(lma在flash裡)
執行時在SDRAM裡。(vma在SDRAM裡)

我們從elf檔可知,text2的VMA在0x8000,LMA在0x40。

Code:
Sections:
Idx Name          Size      VMA       LMA       File off  Algn
  0 .nds32_init   00000040  00000000  00000000  00001000  2**3
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
  1 .text2        00000034  00008000  00000040  00002000  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
  2 .text         0000014c  00000074  00000074  00002074  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, CODE




(2)在執行add()之前,必須要先將code從flash copy到ram裡。
如果覺得執行速度太慢,也有人用硬體實作搬移的工作。
Code:
int copy_text2(void) {

    int size;
    int text2_vma_begin, text2_vma_end, text2_lma_begin;

    text2_vma_begin=(unsigned int)&_begin_text2;
    text2_vma_end=(unsigned int)&_end_text2;
    text2_lma_begin=(unsigned int)&_lma_text2;

    size=text2_vma_end-text2_vma_begin;

    /* copy mul from lma to vma */

   volatile unsigned int *src = (volatile unsigned int *)text2_lma_begin;
   volatile unsigned int *dest = (volatile unsigned int *)text2_vma_begin;

   while (size > 0) {
      *dest++ = *src++;
      size = size - 4;
   }
   return 0;
}


之後main呼叫時,就和一般的程式相同。


完整的example:
Attachment:
text_n8.zip [89.41 KiB]
Downloaded 1314 times

Page 1 of 1 All times are UTC + 8 hours [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/