正文
——————————— || |P1.1|-----I<|--------------<| |??????????|???????????????? |?????p2.1?|-------------/?---------|--. |??????????| |??????????| ———————————??????
1、兩層結構
硬件層<-->軟件層--最粗糙的分層架構
/**********************************************************************************/ #includeintmain() { inti=0; while(1) { P1_1=0; for(i=0;i<5000;i++); ??????P1_1=1; ??????for(i=0;i<5000;i++); ??} }
2、三層結構
硬件層<--> 驅動層<-->應用層
/*******************驅動頭文件driver.h***********************************************************/ voiddelay(); voidled_on(); voidled_off(); /*******************驅動源文件driver.c************************************************************/ #include#include"driver.h" /*延時函數(shù)*/ voiddelay() { inti=0; for(i=0;i<5000;i++); } void?led_on() { ???P1_1=0; } void?led_off() { ???P1_1=1; } /******************應用系統(tǒng)****************************************************************/ #include“../driver/driver.h” int?main() { ??while(1) ???{? ???????led_on(); ???????delay(); ???????led_off(); ???????delay(); ??} }
3、四層結構
硬件層<-->驅動層<-->操作系統(tǒng)層<-->應用層
/******************************驅動****************************************************/ #include#include #include #include #include #include #include #include intled_init(void); voidled_cleanup(); staticintdevice_open(structinode*,structfile*); staticintdevice_release(structinode*,structfile*); staticssize_tdevice_write(structfile*,constchar*,size_t,loff_t*); intinit_model(void); voidcleanup_module(void); structfile_operationsled_ops={ .owner=THIS_MODULE, .............................. } intled_init(void) { .............................. } voidled_cleanup() { .............................. } staticintdevice_open(structinode*inode,structfile*file) { .............................. } staticintdevice_release(structinode*inode,structfile*file) { .............................. } staticssize_tdevice_write(structfile*file,constchar*buffer,size_tlength,loff_t*offset) { .............................. intinit_model(void) { .............................. } modele_init(led_init); module_exit(led_cleanup); MODULE_LICENCE("GPL"); /******************************應用****************************************************/ #include #include #include #include #defineLED"/dev/led" intmain() { File*fp=fopen(LED,RDWR); if(!fp){ while(1){ ioctl(fp,1); sleep(1); ioctl(fp,0); sleep(0); } } fclose(fp); }
從上面的例子可以看出,層次越多,好像系統(tǒng)的代碼越多,開發(fā)者的工作量越大。實際情況是真的如此嗎?其實分層的目的主要1是降低系統(tǒng)開發(fā)難度;2是為了復用。
驅動層和中間的操作系統(tǒng)層是可以復用的,產(chǎn)品升級或更新?lián)Q代的時候,雖然總的代碼量是大的,但實際有很多代碼是不需要重新開發(fā)的,系統(tǒng)開發(fā)的工作量相對較小。比如說IO口調整了,甚至是整個硬件板子更換了,軟件上只要調整驅動即可。
很多大學的嵌入式系統(tǒng)課程中采用的是兩層結構,主要的原因是教材中的示例一般比較簡單,其主要目的是為了演示如何使用芯片,如何實現(xiàn)某個功能,很少考慮復用的問題。
為了講清楚其中的操作方法,其代碼會盡量簡單,即使是實現(xiàn)相對比較復雜的功能可能也只是采用抽象為函數(shù)的方法,很少考慮工程的問題,在潛移默化中很多人就以為兩層架構就是理所當然的。
具體采用何種分層結構是與產(chǎn)品相關的。比如大家都知道坐飛機是比步行快得,在校園里從上課的教室到休息的宿舍哪一種方式好呢?當然是步行。反之,從南京到北京,采用坐飛機肯定要比步行好(當然,更好的是坐高鐵)。
第3種方式似乎代碼量是最大的,但是要記住底層是很少改的,所以開發(fā)的時候就是寫應用,這個代碼量有多少?!優(yōu)勢可見一斑!
審核編輯:劉清
-
嵌入式軟件
+關注
關注
4文章
239瀏覽量
26579 -
LED閃爍
+關注
關注
0文章
29瀏覽量
9790
原文標題:簡說嵌入式軟件分層思想
文章出處:【微信號:最后一個bug,微信公眾號:最后一個bug】歡迎添加關注!文章轉載請注明出處。
發(fā)布評論請先 登錄
相關推薦
評論