新聞中心

        EEPW首頁 > 模擬技術 > 設計應用 > 如何在晶心平臺實作ROM patch

        如何在晶心平臺實作ROM patch

        作者: 時間:2012-07-27 來源:電子產品世界 收藏

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

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

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

          1. 主程序架構

          首先介紹主程序的架構。IC的Memory layout如下圖?! ?/p>

         

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

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

          為了要修補ROM內的function,所以規劃出jump_table區域,原本都是指向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 下一頁

        關鍵詞: 晶心 ROM

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 陕西省| 平定县| 新沂市| 察哈| 沾化县| 大庆市| 金沙县| 光泽县| 贵阳市| 灌云县| 安化县| 沭阳县| 翁源县| 安龙县| 崇文区| 平遥县| 萝北县| 垦利县| 翁源县| 五莲县| 汶上县| 肇东市| 吉林省| 大宁县| 丰台区| 南木林县| 罗甸县| 天门市| 东海县| 喀喇| 洪江市| 澜沧| 蕉岭县| 阜宁县| 南澳县| 井陉县| 肥城市| 翁源县| 香格里拉县| 聊城市| 资兴市|