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

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

    如何在晶心平臺實作ROM patch

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

      筆者曾協(xié)助多家公司工程師,在AndesCore™上發(fā)展firmware。我們發(fā)現(xiàn),當(dāng)客戶開發(fā)Non-OS的程序代碼,最常遇到的問題在于開發(fā)者不知如何撰寫linker script。網(wǎng)絡(luò)上有GNU ld的使用文件,但是linker script的范例太少,尤其開發(fā)者需要撰寫進(jìn)階的linker script,常常不知如何下手。

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

      本篇文章我們分享如何實作 patch。使用CPU建構(gòu)的embedded system,一般具有CPU、外圍IP及RAM、。部份客戶使用 code開機(jī),程序代碼放在ROM內(nèi),data section放在SRAM里。ROM code的特性是成本低,跟著IC光罩一起生產(chǎn),當(dāng)IC制作完成即不可修改,若有制作上的錯誤或是程序代碼邏輯上的錯誤,只能用ROM patch的方式修補(bǔ)。也就是將需要修補(bǔ)的程序代碼放到小容量的flash里。這就是我們今天要分享的技術(shù)。

      1. 主程序架構(gòu)

      首先介紹主程序的架構(gòu)。IC的Memory layout如下圖。  

     

      紅色框線的部份,為主程序編譯的范圍。主程序main會呼叫到func1、func2和func3這3個function。

      在上圖中,黃色區(qū)域是IC的ROM,這部份的程序是IC制作出來即不可以改變。綠色部份是flash。在圖中,flash分成2區(qū),一個是jump_table,存放func1~func3的地址。剩余的空間FUNC_PATCH,預(yù)留給patch使用。

      為了要修補(bǔ)ROM內(nèi)的function,所以規(guī)劃出jump_table區(qū)域,原本都是指向ROM的function。如果ROM里的部份function損壞或是需要改寫,就把jump_table改為指向FUNC_PATCH里新建的function。

      1.1 源代碼

      主程序的程序代碼如下:(main.c)

      #include
      #include
      int func1(int);
      int func2(int);
      int func3(int);
      int num1=1;
      int num2=2;
      int num3=3;

      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 main(void) {

      printf("func1(30)=%dn",jump_table.func_a(30));
      printf("func2(30)=%dn",jump_table.func_b(30));
      printf("func3(30)=%dn",jump_table.func_c(30));

      return EXIT_SUCCESS;

      }

      int func1(int x){
      return x*num1;

      }


    上一頁 1 2 3 下一頁

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

    評論


    相關(guān)推薦

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

    關(guān)閉
    主站蜘蛛池模板: 腾冲县| 麻城市| 莎车县| 澜沧| 习水县| 加查县| 白城市| 合江县| 黄龙县| 庆云县| 安图县| 饶河县| 西丰县| 策勒县| 清徐县| 信丰县| 和龙市| 凌源市| 信宜市| 绥德县| 哈尔滨市| 东兰县| 泰来县| 吉安县| 那曲县| 西藏| 常山县| 岱山县| 广水市| 华容县| 漯河市| 齐河县| 鄄城县| 永胜县| 民县| 普定县| 讷河市| 洞口县| 许昌市| 灯塔市| 桂林市|