• <li id="00i08"><input id="00i08"></input></li>
  • <sup id="00i08"><tbody id="00i08"></tbody></sup>
    <abbr id="00i08"></abbr>
  • 新聞中心

    EEPW首頁 > 模擬技術(shù) > 設(shè)計(jì)應(yīng)用 > 如何在晶心平臺(tái)實(shí)作ROM patch

    如何在晶心平臺(tái)實(shí)作ROM patch

    作者: 時(shí)間:2012-07-27 來源:電子產(chǎn)品世界 收藏

      (2) patch在編譯之前,先匯入主程序的symbol table。(將export.txt檔案放在一起編譯)。Patch的linker script要匯入主程序的symbol,寫法如下面紅色字體。

    本文引用地址:http://www.czjhyjcfj.com/article/135126.htm

      ENTRY(_start)
      /* Do we need any of these for elf?
      __DYNAMIC = 0; */
      INCLUDE "..export.txt"
      SECTIONS
      {

      (3) patch的程序代碼里如下,沒有main function,也不要加入startup files。改寫func2。func2放在flash的FUNC_PATCH section。并且將jump_table里的func2,改成指向新的func2。

      #include
      #include
      extern int func1(int);
      extern int func3(int);
      int func2(int) __attribute__ ((section ("FUNC_PATCH")));
      extern int num2;

      typedef struct strfunptr {
      int (*func_a)(int);
      int (*func_b)(int);
      int (*func_c)(int);
      }sfptr;

      sfptr jump_table __attribute__ ((section ("FUNC_TABLE")))= {func1, func2, func3};

      int func2(int x){
      return x*num2*100;
      }

      (4) patch的linker script,加入FUNC_PATH在jump_table之后。

      FUNC_PATCH 0x510020 :
      {
      *(.FUNC_PATCH)
      }

      3. 如何除錯(cuò)

      首先,將程序代碼存放在IC的及flash里。(本文為了示范,我們的做法是在AndeShape™ ADP-XC5的FPGA板上,用RAM模擬及flash,分別將主程序和patch的bin文件restore到板子上。)

      當(dāng)gdb debug時(shí),載入patch 的symbol。以下節(jié)錄gdb指令。

      core0(gdb) file mainprog.adx
      core0(gdb) add-symbol-file patch.adx 0x500000 -s FUNC_TABLE 0x510000 -s FUNC_PATCH 0x510020
      core0(gdb) set $pc=0x500000
      core0(gdb) b main
      Breakpoint 1 at 0x50010c: file ../main.c, line 20.
      core0(gdb) c
      Breakpoint 1, main () at ../main.c:20
      20 printf("func1(30)=%dn",jump_table.func_a(30));
      core0(gdb) s
      func1 (x=30) at ../main.c:28
      28 return x*num1;
      core0(gdb) n
      29 }
      core0(gdb) s
      main () at ../main.c:21
      21 printf("func2(30)=%dn",jump_table.func_b(30));
      core0(gdb) s
      func2 (x=30) at ../patchprog.c:24
      24 return x*num2*100;
      core0(gdb)

      上面過程中,先加載main的symbol,再加載patch的symbol及debug information。"add-symbol-file patch.adx 0x500000 -s FUNC_TABLE 0x510000 -s FUNC_PATCH 0x510020"是將patch section的symbol及debug information也載入gdb以debug。讀者可以在gdb里,打"help add-symbol-file"查閱add-symbol-file的用法。

      3.1 主程序patch后的執(zhí)行結(jié)果

      func1(30)=30
      func2(30)=6000
      func3(30)=90

      4. 結(jié)語

      目前科技使用GNU的toolchain,其功能非常強(qiáng)大。讀者可多動(dòng)手試試不同的linker script寫法,使得開發(fā)firmware更有彈性及效率。


    上一頁 1 2 3 下一頁

    關(guān)鍵詞: 晶心 ROM

    評(píng)論


    相關(guān)推薦

    技術(shù)專區(qū)

    關(guān)閉
    主站蜘蛛池模板: 阿城市| 吉安县| 迁安市| 甘德县| 云和县| 云浮市| 无极县| 独山县| 密山市| 乐昌市| 宜都市| 左贡县| 吴堡县| 巴彦县| 睢宁县| 逊克县| 香港| 旬邑县| 井陉县| 仪陇县| 樟树市| 通道| 无锡市| 云龙县| 新巴尔虎右旗| 银川市| 望城县| 顺平县| 凤山市| 盘山县| 舟曲县| 镇安县| 东乡族自治县| 九寨沟县| 嘉定区| 读书| 长垣县| 苗栗市| 威信县| 保德县| 仙游县|