您的位置:網(wǎng)站首頁(yè) > 電器維修資料網(wǎng) > 正文 >
分享:在晶心平臺(tái)實(shí)作ROM patch
來(lái)源: 日期:2013-11-14 15:27:23 人氣:標(biāo)簽:
筆者曾協(xié)助多家公司工程師,在andescore™上發(fā)展firmware。我們發(fā)現(xiàn),當(dāng)客戶開(kāi)發(fā)non-os的程序代碼, 常遇到的問(wèn)題在于開(kāi)發(fā)者不知如何撰寫(xiě)linker script。網(wǎng)絡(luò)上有g(shù)nu ld的使用文件,但是linker script的范例太少,尤其開(kāi)發(fā)者需要撰寫(xiě)進(jìn)階的linker script,常常不知如何下手。
本篇文章我們分享如何實(shí)作rom patch。使用晶心cpu建構(gòu)的embedded system,一般具有cpu、外圍ip及ram、rom。部份客戶使用rom code開(kāi)機(jī),程序代碼放在rom內(nèi),data section放在sram里。rom code的特性是成本低,跟著ic光罩一起生產(chǎn),當(dāng)ic制作完成即不可修改,若有制作上的錯(cuò)誤或是程序代碼邏輯上的錯(cuò)誤,只能用rom patch的方式修補(bǔ)。也就是將需要修補(bǔ)的程序代碼放到小容量的flash里。這就是我們今天要分享的技術(shù)。
1. 主程序架構(gòu)
首先介紹主程序的架構(gòu)。ic的memory layout如下圖。
圖表1 主程序的memory layout圖
紅色框線的部份,為主程序編譯的范圍。主程序main會(huì)呼叫到func1、func2和func3這3個(gè)function。
在上圖中,黃色區(qū)域是ic的rom,這部份的程序是ic制作出來(lái)即不可以改變。綠色部份是flash。在圖中,flash分成2區(qū),一個(gè)是jump_table,存放func1~func3的地址。剩余的空間func_patch,預(yù)留給patch使用。
為了要修補(bǔ)rom內(nèi)的function,所以規(guī)劃出jump_table區(qū)域,原本都是指向rom的function。如果rom里的部份function損壞或是需要改寫(xiě),就把jump_table改為指向func_patch里新建的function。
1.1 源代碼
主程序的程序代碼如下:(main.c)
#include <stdio.h>
#include <stdlib.h>
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;
}
int func2(int x){
return x*num2;
}
int func3(int x){
return x*num3;
}
- 1
- 2
- 3
- 下一頁(yè)
【看看這篇文章在百度的收錄情況】
相關(guān)文章
- 上一篇: 網(wǎng)絡(luò)速率參數(shù)的含義
- 下一篇: VA型液晶面板