第一篇:嵌入式底層開發(fā)總結
嵌入式底層開發(fā)總結
51單片機應該是大部分搞嵌入式最先接觸的,也是學生時期接觸的第一款單片機,本人是電子信息工程畢業(yè)的,接觸的第一個單片機也是51,然后是STM32.51和STM32 STM32比51 難一點,不過本質上都是單片機,STM32片上外設多很多,定時器啥的復雜多的多。STM32片上外設多,功能強大,可以說學了STM32之后基本上所有的單片機應該都能馬上上手的,雖然我也只是只接觸到51 和STM32.。大四全國電子設計大賽之后就再也沒有接觸到單片機了。后來工作就一直是ARM+linux,android。
------------------任何計算機系統(tǒng)都是軟件和硬件的結合體,如果只有硬件而沒有軟件,則硬件是沒有靈魂的軀殼;如果只有軟件沒有硬件,則軟件就是一堆無用的字符。在底層硬件的基礎上,操作系統(tǒng)覆蓋一層驅動,屏蔽底層硬件的操作,通過特定的軟件接口去操作底層硬件,用戶在用戶空間可以很容易的把軟件設計目標放在策略與需求上,可以很方便的屏蔽掉底層實現,從而很好的完成客戶功能需求。計算機系統(tǒng)是軟件和硬件的結合體。而軟件又分為應用層軟件和驅動層軟件。驅動層軟件是應用層軟件和底層硬件的紐帶。通過驅動層軟件實現對底層硬件屏蔽。
在裸機時代,比如單片機系統(tǒng),程序員往往是直接操作硬件寄存器,直接設置硬件。而在Linux操作系統(tǒng)中,硬件驅動程序中實現對硬件直接操作,而用戶空間,通過通用的系統(tǒng)調用接口,實現對硬件操作,應用程序沒有直接操作底層設備,通過posix標準,應用程序的系統(tǒng)調用往往是被規(guī)定和限值,用戶只能通過規(guī)定的接口實現對底層硬件的操作,導致了應用程序在類UINIX操作系統(tǒng)具有非常好的可移植性。
圖2.1 直接操作硬件程序
上圖2.1 是裸機時代,應用程序和硬件操作糅合在一起,應用程序和硬件操作高度耦合的框圖,上述代碼一般很難有良好的代碼互用和移植性。往往從一個平臺移植到另一個平臺,甚至是同一平臺不同硬件配置都要求很大的代碼改動,另外從應用層來說,應用與驅動高度耦合,應用程序也幾乎難以移植,甚至說是沒有應用程序概念,原因在于應用與驅動的糾纏不清。
圖2.2 無操作系統(tǒng)應用程序和設備驅動程序關系
上圖2.2所示,良好的裸機代碼框架,設備驅動層和應用層之間有良好的分層思想,用戶可以較好的實現策略和需求,例如:客戶要求實現流水燈程序,程序員在底層機制實現(硬件操作)的基礎下,可以充分在用戶應用程序中把主要精力方法流水燈的實現,即策略。但是在良好的裸機程序設計,代碼移植性可能從一個平臺移植到另外一平臺只需要修改少量的底層驅動,例如:LED_ON()的實現。但是在用戶空間,沒有系統(tǒng)調用概念,函數接口千差萬別。應用程序移植性差。
圖2.3 Linux系統(tǒng)調用框圖
操作系統(tǒng)中,需求決定應用程序,通過系統(tǒng)調用,調用底層驅動,此外,在驅動程序中,把一部分公用的驅動接口抽象出來,如此,程序員只需修改很少量的驅動資源,形成特定的驅動框架。導致用戶只需添加專用的硬件屬性作為平臺資源,在內核中獲取資源,大大解放了設備驅動開發(fā),提高了設備驅動的通用型。在用戶空間,由于遵循posix標準,類UNIX操作系統(tǒng)中,所有操作接口基本一樣,從而方便了應用程序的移植,應用程序幾乎不要做修改。如圖2.3所示。
Linux操作系統(tǒng)對于所有的硬件都是當做一個文件來操作:一切設備皆文件。Linux設備文件一般分為字符設備,塊設備,網絡設備。在Linux系統(tǒng)中,除了網絡設備之外,所有的設備都被映射到Linux的文件系統(tǒng)中。如圖2.4所示。
圖2.4 Linux操作系統(tǒng)與應用程序關系
----------------講講51,linux,安卓之間的差別。先申明一下,我是實際工作中沒有使用過單片機,我使用單片機僅僅是用來參加全國電子設計大賽。工作主要在android driver這一塊。我們這一行很多人說單片機是有瓶頸的,我也不是很清楚。但是實話實說,這鳥東西太簡單了,沒啥技術含量的,你要之后android的龐大。
歡迎點贊。后面會說說android,linux,51,32單片機之間的聯系與學習方法,雖然我也是菜鳥,如果你現在看不懂也沒關系,有個映像就行。以后就有方向去學習了。想當初我真的是一個人孤孤學習linux ================= 補充一個:單片機要點亮一個led等,同樣在安卓上你點亮一個燈也要驅動的,不然怎么亮呢,只是我們只看到了app。背后驅動,怎么實現的,安卓架構,跟單片機有啥區(qū)別,相同的地方。其實手機arm芯片跟單片機都是嵌入式微處理器,單片機叫做微控制器。高通,mtk啥的也是嵌入式微處理器~都是一樣的~但是難度你想想看就知道了。
51單片機大家都知道了,裸機,直接操作硬件,直觀,簡單,沒有框架,沒有系統(tǒng)。STM32,可以學習一下RTOS了,實時的小系統(tǒng),ucos II等等許多實時系統(tǒng),STM32+ucos II這種組合學習方式還是挺好的。STM32比較難的在我印象中一個是時鐘樹,因為我們從51,沒有時鐘樹的概念12M晶振,時鐘不要你配置,而比較新的ARM框架,外設都是有時鐘的。可能剛剛接觸概念不是很清楚,但是也是很簡單的。另外一個是定時器,什么輸入捕獲模式,定時器模式,編碼器模式。。。強大的多,比起51??偟膩碚f還是簡單的。因為是沒有框架的原因,代碼量真的很少。你要知道,MTK android 5.1 所有的東西加起來 10G多,包括bootloader,linux kernel,android framework,定制的部分。等等。我們接觸的就那些目錄,當你去看C++,java代碼時,你就知道面向過程的代碼真的很容易看??赡苡行┡笥巡恢繿ndroid的框架,以及android 與linux之間的關系,以及l(fā)inux驅動與裸機的關系,聯系與區(qū)別。你現在只要知道linux驅動比較大,android框架更大。單片機簡單。單片機一般是C語言,而android一般涉及三種語言:底層linux內核C,中間的JNI層是C++,framework和app是java。
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 學過51單片機的朋友知道,我們要點亮一個LED燈,是這樣子的P0 = xxx,我們就點亮了一個,好。一燒寫,好,燈亮了。linux,上我們要亮一個燈,有點難了,有了操作系統(tǒng),沒那么容易了。一般人搞不定了。好,到android,更加難了。但是你想一想手機芯片也是ARM。亮燈這種肯定都是CPU的管腳操作。上了系統(tǒng)了,難了,點個燈都費勁的。本質上是一樣的。很多人都知道單片機有瓶頸的。原因是會點硬件,會點C,輕輕松松就可以亮燈的。入門容易。
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 我舉一個小的例子說明一下51,linux,android三者的之間的差別。你就知道是啥區(qū)別。下面是51單片機: 大概是這樣: int main(void)//一個main函數搞定 { P0 = 0xxx;while(1);return 0;} linux: 驅動程序: #include
//class_create/device_create #include
struct s5pv210_device *s5pv210_dev;
volatile unsigned long *gpc0con = NULL;volatile unsigned long *gpc0dat = NULL;
staticintled_open(structinode *inode, struct file *file){ printk(KERN_INFO“%s()-%dn”, __func__, __LINE__);
/*初始化GPC0_3,GPC0_4引腳功能為輸出功能*/ *gpc0con &= ~((0xf<<12)|(0xf<<16));*gpc0con |=((0x1<<12)|(0x1<<16));return 0;} staticintled_close(structinode *inode, struct file *file){ printk(KERN_INFO“%s()-%dn”, __func__, __LINE__);//iounmap(S5PV210_PA_GPC0CON);return 0;}
staticssize_tled_read(struct file *file, char __user *buf, size_t count, loff_t *offset){ printk(KERN_INFO“%s()-%dn”, __func__, __LINE__);return 0;}
//write(fd, &val, 4)static ssize_tled_write(struct file *file, const char __user *buf, size_t count, loff_t *offset){ int ret;unsignedintval;printk(KERN_INFO“%s()-%dn”, __func__, __LINE__);
/*獲取用戶空間數據*/ ret = copy_from_user(&val,buf,count);if(ret){ printk(KERN_ERR“copy data from user failed!n”);return-ENODATA;}
printk(KERN_INFO“copy data from user: val=%dn”,val);if(val){ //點亮LED *gpc0dat |=((0x1<<3)|(0x1<<4));} else { //熄滅LED *gpc0dat &= ~((0x1<<3)|(0x1<<4));} return ret?0:count;}
staticstructfile_operationsled_fops={.owner = THIS_MODULE,.open = led_open,.read = led_read,.write = led_write,.release = led_close, };
staticint __initled_init(void){ int ret;printk(KERN_INFO“%s()-%dn”, __func__, __LINE__);s5pv210_dev = kmalloc(sizeof(struct s5pv210_device),GFP_KERNEL);if(s5pv210_dev==NULL){ printk(KERN_INFO“no memory malloc for s5pv210_dev!n”);return-ENOMEM;} /*注冊*/ led_major = register_chrdev(0,“l(fā)ed”,&led_fops);if(led_major<0){ printk(KERN_INFO“register major failed!n”);ret =-EINVAL;goto err1;}
/*創(chuàng)建設備文件*/ s5pv210_dev->led_class = class_create(THIS_MODULE,“l(fā)ed_class”);if(IS_ERR(s5pv210_dev->led_class)){ printk(KERN_ERR “class_create()failed for led_classn”);ret =-EINVAL;goto err2;}
s5pv210_dev->led_device = device_create(s5pv210_dev->led_class,NULL,MKDEV(led_major,0),NULL,“l(fā)ed”);if(IS_ERR(s5pv210_dev->led_device)){ printk(KERN_ERR “device_create failed for led_devicen”);ret =-ENODEV;goto err3;}
/*將物理地址映射為虛擬地址*/ gpc0con = ioremap(S5PV210_PA_GPC0CON,8);if(gpc0con==NULL){ printk(KERN_INFO“ioremap failed!n”);ret =-ENOMEM;goto err4;} gpc0dat = gpc0con + 1;
return 0;err4: device_destroy(s5pv210_dev->led_class,MKDEV(led_major,0));err3: class_destroy(s5pv210_dev->led_class);err2: unregister_chrdev(led_major,“l(fā)ed”);err1: kfree(s5pv210_dev);return ret;} static void __exit led_exit(void){ printk(KERN_INFO“%s()-%dn”, __func__, __LINE__);unregister_chrdev(led_major,“l(fā)ed”);device_destroy(s5pv210_dev->led_class,MKDEV(led_major,0));class_destroy(s5pv210_dev->led_class);iounmap(gpc0con);kfree(s5pv210_dev);} module_init(led_init);module_exit(led_exit);MODULE_LICENSE(“GPL”);
應用程序:
#include
if(strcmp(argv[1], “on”)==0){ val = 1;} else { val = 0;}
if(write(fd, &val, 4)!=4){ perror(“write failed!n”);exit(1);} close(fd);return 0;}
android:
不知道大家清不清楚android與linux之間的關系。
android是基于linux內核的,linux操作系統(tǒng)的5大組件:驅動,內存管理,文件系統(tǒng),進程管理,網絡套接字。android是基于linux kernel上的,大家平時只看到了app。app是java語言的,其實每運行一個java應用程序,實際上是fork一個linux應用程序。android四大組件,activity,service,Broadcast Receiver,Content Provider。這是android的主要框架,java應用開發(fā)是基于這開發(fā)的。android平臺是基于linux內核的。在linux運行之后才建立起java世界。
直接上代碼:上面的linux的驅動在android是一樣的,適用于android。驅動ok之后是應用層了,也就是應用程序。我下面就是最直接的應用,不包含任何android框架性的東西,大家可以直接看到,應用app->jni->linux驅動這三層調用關系。下面是jni代碼是c++; #define LOG_TAG “l(fā)ed-jni-log” #include
#include “jni.h”
#include
staticintfd =-1;jintopen_led(JNIEnv *env, jobjectthiz){ LOGD(“$$%sn”, __FUNCTION__);fd = open(“/dev/led1”, O_RDWR);if(fd< 0){ LOGE(“open : %sn”, strerror(errno));return-1;} return 0;}
jintled_on(JNIEnv *env, jobjectthiz){ LOGD(“$$%sn”, __FUNCTION__);intval = 1;jint ret = 0;ret = write(fd, &val, 4);if(ret!= 4){ LOGE(“write : %sn”, strerror(errno));return-1;} return 0;}
jintled_off(JNIEnv *env, jobjectthiz){ LOGD(“$$%sn”, __FUNCTION__);intval = 0;jint ret = 0;ret = write(fd, &val, 4);if(ret!= 4){ LOGE(“write : %sn”, strerror(errno));return-1;} return 0;}
jintclose_led(JNIEnv *env, jobjectthiz){ LOGD(“$$%sn”, __FUNCTION__);if(fd> 0)close(fd);return 0;}
staticJNINativeMethodmyMethods[] ={ {“openDev”, “()I”,(void *)open_led}, {“onDev”, “()I”,(void *)led_on}, {“offDev”, “()I”,(void *)led_off}, {“closeDev”, “()I”,(void *)close_led}, };jintJNI_OnLoad(JavaVM * vm, void * reserved){ JNIEnv *env = NULL;jint ret =-1;ret = vm->GetEnv((void **)&env, JNI_VERSION_1_4);if(ret < 0){ LOGE(“GetEnv errorn”);return-1;}
jclassmyclz = env->FindClass(“com/ledtest/LedActivity”);if(myclz == NULL){ LOGE(“FindClass errorn”);return-1;} ret = env->RegisterNatives(myclz, myMethods, sizeof(myMethods)/sizeof(myMethods[0]));if(ret < 0){ LOGE(“RegisterNatives errorn”);return-1;}
return JNI_VERSION_1_4;} 然后是java app: packagecom.ledtest;
importandroid.os.Bundle;importandroid.app.Activity;importandroid.util.Log;importandroid.view.Menu;importandroid.view.View;importandroid.view.View.OnClickListener;importandroid.widget.Button;
public class LedActivity extends Activity {
final String TAG = “LedActivity”;public Button btn_on = null;public Button btn_off = null;
public void init(){ btn_on =(Button)this.findViewById(R.id.btn1);btn_on.setOnClickListener(clickListener);
btn_off =(Button)this.findViewById(R.id.btn2);btn_off.setOnClickListener(clickListener);}
OnClickListenerclickListener = new OnClickListener(){ public void onClick(View v){ switch(v.getId()){ case R.id.btn1: Log.d(TAG, “l(fā)ed on in app”);onDev();break;case R.id.btn2: Log.d(TAG, “l(fā)ed off in app”);offDev();break;default: break;} } };
@Override protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState);setContentView(R.layout.activity_led);init();openDev();}
@Override publicbooleanonCreateOptionsMenu(Menu menu){ // Inflate the menu;this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.activity_led, menu);return true;}
@Override protected void onDestroy(){ // TODO Auto-generated method stub super.onDestroy();
closeDev();} static { System.loadLibrary(“l(fā)ed_jni”);}
public native intopenDev();
public native intonDev();
public native intoffDev();
public native intcloseDev();}
框架是這樣的:最上層是java,點開app,點擊一下一個button,點亮了LED,調用onDev();onDev調用c++的led_on,然后led_on是調用驅動的led_write,明白不?這樣說吧:linux驅動是最下層的,驅動嘛。然后是c++層,c++包裝一下是給java調用的,然后到java層。下面是android比價經典的一張框架圖。
linux在最下面。lib 是動態(tài)庫。然后是JNI,然后是Framework(android框架),然后是大家喜聞樂見的app。linux在最下面。lib 是動態(tài)庫。然后是JNI,然后是Framework(android框架),然后是大家喜聞樂見的app。
第二篇:嵌入式軟件工程師底層驅動內核工程師
嵌入式軟件工程師 嵌入式軟件工程師嵌入式系統(tǒng)是以應用為中心,以計算機技術為基礎,并且軟硬件可裁剪,適用于應用系統(tǒng)對功能、可靠性、成本、體積、功耗有嚴格要求的專用計算機系統(tǒng)。它一般由嵌入式微處理器、外圍硬件設備、嵌入式操作系統(tǒng)以及用戶的應用程序等四個部分組成,用于實現對其他設備的控制、監(jiān)視或管理等功能。
嵌入式軟件工程師就是編寫嵌入式系統(tǒng)的工程師。
嵌入式軟件工程師待遇
IBM、微軟、華為、Yahoo、聯想、搜狐、亞信、花旗...2010'應屆畢業(yè)生就業(yè)安置計劃火熱啟動:先實訓后上崗,轉正年薪50000元。
怎樣做個嵌入式軟件工程師
應具備哪些能力,最直接的方法,就是去根據各公司,招聘網站的嵌入式軟件工程師的應聘要求來分析
我?guī)湍憧偨Y下:
1.最重要的是C語言編程,以及C++,這個與你讀程,應用,開發(fā)項目,做系統(tǒng)移植息息相關;
2.操作系統(tǒng): LINUX,WINCE等,至少學習過一種,并且還需要對些基礎知識有蠻多的了解;
3.對ARM,FPGA,DSP等這些硬件比較了解。
這是最常規(guī)的條件
當然,一些基本素質,像英語能力,或是啥的,也很重要
推薦: 你可以去按照招聘要求分析,也可以按照培訓機構的培訓目的,方向,內容來分析得知,像海同科技就是蠻不錯的嵌入式軟件工程師發(fā)展前景分析
嵌入式領域較新,目前發(fā)展非???,很多軟硬件技術出現的時間都不太長(如ARM處理器、嵌入式操作系統(tǒng)、LINUX操作系統(tǒng)),大多數人沒有條件接觸或進入嵌入式行業(yè),更談不上能有機會接受專業(yè)人士的指導。因此,踏進這個行業(yè)的難度比較大,嵌入式人才稀缺,身價自然也水漲船高。
權威部門統(tǒng)計,我國嵌入式人才缺口每年50萬人左右。根據前程無憂網發(fā)布的調查報告,嵌入式軟件開發(fā)是未來幾年最熱門和最受歡迎的職業(yè)之一,具有10年工作經驗的高級嵌入式工程師年薪在30萬元左右。即使是初級的嵌入式軟件開發(fā)人員,平均月薪也達到了3000—5000元,中高級的嵌入式工程師月薪平均超過10000元。做軟件實際上有高下之分,開發(fā)語言從機器語言、匯編到C、C++,再到紅透半邊天的Java、C#等,該學哪種呢?為什么有些開發(fā)者工資低,而有些開發(fā)者千金難求?為什么3年的Java高級程序員薪水僅僅8k-10k,而一個Linux底層C語言程序員兩
年經驗就敢要10k的薪水?
還是門檻,比如月薪15k的Linux嵌入式開發(fā)職位,門檻就有 Linux系統(tǒng)、Shell編程、Linux開發(fā)環(huán)境、C語言、ARM硬件平臺、數據結構、Linux內核、驅動程序等,粗略數數就有8道關口,他需要非常熟悉整個的計算機體系,能做出實際的產品,而Java的開發(fā)者卻僅僅是會使用名叫Java的語言工具,始終高高飄在眾多層次之上,開發(fā)項目非???,甚至可以不知道OSI模型,很可能自始至終都是軟件藍領。嵌入式開發(fā)本身也有高下之分,至少包含嵌入式應用程序工程師和底層的驅動內核工程師兩種。前者同樣是使用現成工具進行簡單勞動,比如使用J2ME開發(fā)小游戲或者進行一些界面開發(fā),而后者是根據芯片具體情況把操作系統(tǒng)(如Linux)移植到上面,同時編寫必要的驅動程序,改寫相應的內核代碼。很顯然后者是一個公司真正的技術核心。而技術核心的工資很可能是其他開發(fā)者的數倍。
嵌入式開發(fā)突出強制和項目,學習不僅僅是學習幾項技術,而是構建你的知識體系。比如學習嵌入式開發(fā),就要從基礎Linux,C語言,數據結構開始,到ARM,匯編,Linux內核、驅動等,更重要的是更多的項目練習,設計至少5個項目,多達10000行強制核心代碼的編寫可以讓你真正獲得知識。為進入外企或者出國做準備。
未來的幾年內,隨著信息化,智能化,網絡化的發(fā)展,嵌入式系統(tǒng)技術也將獲得廣闊的發(fā)展空間。美國著名未來學家尼葛洛龐帝99年1月訪華時預言,4~5年后嵌入式智能(電腦)工具將是PC和因特網之后最偉大的發(fā)明。我國著名嵌入式系統(tǒng)專家沈緒榜院士98年11月在武漢全國第11次微機學術交流會上發(fā)表的《計算機的發(fā)展與技術》一文中,對未來10年以嵌入式芯片為基礎的計算機工業(yè)進行了科學的闡述和展望。1999年世界電子產品產值已超過12000億美元,2000年達到13000億美元,預計2005年,銷售額將達18000億美元。目前一些先進的PDA在顯示屏幕上已實現漢字寫入、短消息語音發(fā)布,日用范圍也將日益廣闊。對于企業(yè)專用解決方案,如物流管理、條碼掃描、移動信息采集等,這種小型手持嵌入式系統(tǒng)將發(fā)揮巨大的作用。自動控制領域,不僅可以用于ATM機,自動售貨機,工業(yè)控制等專用設備,和移動通訊設備結合、GPS、娛樂相結合,嵌入式系統(tǒng)同樣可以發(fā)揮巨大的作用。
第三篇:嵌入式開發(fā)工程師
任職要求:
1、大學本科及以上學歷,2年以上工作經驗,計算機電子通訊類專業(yè)畢業(yè);
2、能夠熟練使用POWER PCB或PROTEL或ORCAD等電路設計軟件進行PCB設計;
3、熟悉電子元器件,能獨立設計數字及模擬電路,擁有單片機開發(fā)工作經驗,懂得RF433無線及紅外遙控等相關知識;
4、熟練使用C語言,有嵌入式開發(fā)工作開發(fā)及智能家居防盜報警產品經驗者優(yōu)先。
崗位職責:
1、新產品項目設計開發(fā)工作;
2、為相關部門及項目提供技術支持;
3、產品售后返修分析,品質不斷提升性能改進;
4、組織對新研發(fā)產品的制樣、驗證、試產、量產等工作的確認與審核。
第四篇:嵌入式Linux底層驅動軟件工程師崗位職責
1.負責按照總體設計完成模塊詳細設計說明書。
2.完成模塊代碼編寫、內部測試工作。
3.協(xié)助硬件設計人員及應用軟件設計人員進行系統(tǒng)開發(fā)與調試。
4.根據技術支持需求進行軟件代碼維護。
5.編寫相關技術文檔,并對有關人員進行培訓。
第五篇:嵌入式Linux開發(fā)流程
嵌入式Linux開發(fā)流程
嵌入式 linux開發(fā),根據應用需求的不同有不同的配置開發(fā)方法,但是一般都經過以下過程:
建立開發(fā)環(huán)境。操作系統(tǒng)一般 REDHAT-LINUX,版本 7 到9 都可以,選擇定制安裝或全部安裝,通過網絡下載相應的 GCC 交叉編譯器進行安裝(比如 arm-linux-gcc、arm-uclibc-gcc),或者安裝產品廠家提供的交叉編譯器。
配置開發(fā)主機。配置 MINICOM,一般參數為115200,數據位 8位,停止位 1,無奇偶校驗,軟硬件控制流設為無。在 WINDOWS 下的超級終端的配置也是這樣。MINICOM軟件的作用是作為調試嵌入式開發(fā)板信息輸出的監(jiān)視器和鍵盤輸入的工具;配置網絡,主要是配置 NFS 網絡文件系統(tǒng),需要關閉防火墻,簡化嵌入式網絡調試環(huán)境設置過程。
建立引導裝載程序BOOTLOADER,從網絡上下載一些公開源代碼的BOOTLOADER,如 U-BOOT、BLOB、VIVI、LILO、ARM-BOOT、RED-BOOT等,根據自己具體芯片進行移植修改。有些芯片沒有內置引導裝載程序,比如三星的 ARM7、ARM9 系列芯片,這樣就需要編寫燒寫開發(fā)板上 flash 的燒寫程序,網絡上有免費下載的 WINDOWS 下通過JTAG并口簡易仿真器燒寫 ARM 外圍 flash 芯片的程序。也有 LINUX 下公開源代碼的J-FLASH 程序。如果不能燒寫自己的開發(fā)板,就需要根據自己的具體電路進行源代碼修改。這是讓系統(tǒng)可以正常運行的第一步。如果你購買了廠商提供的仿真器,當然比較容易燒寫flash了,但是其中的核心技術是無法了解的。這對于需要迅速開發(fā)應用的人來說可以極大地提高開發(fā)速度。
下載別人已經移植好的 LINUX 操作系統(tǒng),如 UCLINUX、ARM-LINUX、PPC-LINUX等,如果有專門針對你所使用的CPU移植好的 LINUX 操作系統(tǒng)那是再好不過,下載后再添加自己的特定硬件的驅動程序,進行調試修改,對于帶 MMU的 CPU可以使用模塊方式調試驅動,對于 UCLINUX 這樣的系統(tǒng)好像只能編譯進內核進行調試。
建立根文件系統(tǒng),從下載使用 BUSYBOX 軟件進行功能裁減,產生一個最基本的根文件系統(tǒng),再根據自己的應用需要添加其他的程序。默認的啟動腳本一般都不會符合應用的需要,所以就要修改根文件系統(tǒng)中的啟動腳本,它的存放位置位于 /etc目錄下,包括:/etc/init.d/rc.S、/etc/profile、/etc/.profile 等,自動掛裝文件系統(tǒng)的配置文件/etc/fstab,具體情況會隨系統(tǒng)不同而不同。根文件系統(tǒng)在嵌入式系統(tǒng)中一般設為只讀,需要使用 mkcramfs、genromfs 等工具產生燒寫映象文件。
建立應用程序的 flash 磁盤分區(qū),一般使用JFFS2 或 YAFFS 文件系統(tǒng),這需要在內核中提供這些文件系統(tǒng)的驅動,有的系統(tǒng)使用一個線性 flash(NOR 型)512K-32M,有的系統(tǒng)使用非線性 flash(NAND型)8-512M,有的兩個同時使用,需要根據應用規(guī)劃 flash的分區(qū)方案。
開發(fā)應用程序,可以下載到根文件系統(tǒng)中,也可以放入 YAFFS、JFFS2 文件系統(tǒng)中,有的應用程序不使用根文件系統(tǒng),而是直接將應用程序和內核設計在一起,這有點類似于UCOS-II 的方式。
燒寫內核、根文件系統(tǒng)、應用程序。
發(fā)布產品。