正文
——————————— || |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" /*延时函数*/ voiddelay() { inti=0; for(i=0;i<5000;i++); } void led_on() { P1_1=0; } void led_off() { P1_1=1; } /******************应用系统****************************************************************/ #include“../driver/driver.h” int main() { while(1) { led_on(); delay(); led_off(); delay(); } }
3、四层结构
硬件层<-->驱动层<-->操作系统层<-->应用层
/******************************驱动****************************************************/ #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); }
从上面的例子可以看出,层次越多,好像系统的代码越多,开发者的工作量越大。实际情况是真的如此吗?其实分层的目的主要1是降低系统开发难度;2是为了复用。
驱动层和中间的操作系统层是可以复用的,产品升级或更新换代的时候,虽然总的代码量是大的,但实际有很多代码是不需要重新开发的,系统开发的工作量相对较小。比如说IO口调整了,甚至是整个硬件板子更换了,软件上只要调整驱动即可。
很多大学的嵌入式系统课程中采用的是两层结构,主要的原因是教材中的示例一般比较简单,其主要目的是为了演示如何使用芯片,如何实现某个功能,很少考虑复用的问题。
为了讲清楚其中的操作方法,其代码会尽量简单,即使是实现相对比较复杂的功能可能也只是采用抽象为函数的方法,很少考虑工程的问题,在潜移默化中很多人就以为两层架构就是理所当然的。
具体采用何种分层结构是与产品相关的。比如大家都知道坐飞机是比步行快得,在校园里从上课的教室到休息的宿舍哪一种方式好呢?当然是步行。反之,从南京到北京,采用坐飞机肯定要比步行好(当然,更好的是坐高铁)。
第3种方式似乎代码量是最大的,但是要记住底层是很少改的,所以开发的时候就是写应用,这个代码量有多少?!优势可见一斑!
审核编辑:刘清
-
嵌入式软件
+关注
关注
4文章
240浏览量
26635 -
LED闪烁
+关注
关注
0文章
29浏览量
9815
原文标题:简说嵌入式软件分层思想
文章出处:【微信号:最后一个bug,微信公众号:最后一个bug】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
评论