操作要點:
1、每一層直接對下一層操作,儘量避免交叉調用或越級調用
2、某些器件會把硬件驅動層合併成一個文件時,則歸於較高的層
3、相同功能的外部函數儘量一致,儘量保證通用性
4、對於初次編程的模塊,要嚴格保證中間各層的正確性
好處:
1、對於後期維護擴展,只需修改應用層和物理層,根據需要擴展功能層
2、一個新項目只需把要用到的文件加入工程,簡單修改調試就出來了
3、隨着模塊的不斷積累,新的項目將越來越容易完成,後期的維護擴展也變得非常簡單了
4、對於C語言編程,只需簡單修改物理層就可完成不同單片機間的移植
呵呵,一些經驗,大家有好的想法可以繼續補充指正
一般分爲以下幾層:
---應用層--面向用戶
軟| ↓
件|---協議層--現成的協議棧、軟件包、標準庫,大多是移植,不自己寫,如FAT、TCPIP、OS、GAME等
相| ↓
關| ↓
---功能層--實現器件無關性,實現器件的各種功能擴展和器件通用性處理,如LCD的線、圓、矩形等功能,如EEPROM的塊寫,自己的print
硬| ↓
件|---器件層--實現硬件無關性,保證IO無關性,只提供器件的基本功能,如字節讀寫、點
驅| ↓
動 ---物理層--IO相關,直接操作硬件,實現硬件連接的多種方案
對應文件舉例1:
---應用層--面向用戶的主程序
軟| ↓
件|---協議層--如FAT、TCPIP、OS等現成的協議棧、算法、遊戲等
相| ↓
關| ↓
---功能層--如文件lcd.c;led.c;eeprom.c;time.c;ir.c;keybord.c;harddisk.c;引出LCD的線、圓、矩形、填充等功能
硬| ↓ ↓
件|---器件層--文件lcd61202.c;lcd1520.c;lcd6963.c;lcd133x.c;lcd44780.c;lcd162x.c;lcd856x.c或者lcd1602.c;lcd12864.c;lcd320240.c等,引出基本的初始化、定位、寫點、寫字節函數
驅| ↓ ↓
動 ---物理層--文件lcd61202_io.c;lcd61202_bus.c;引出器件的基本讀寫函數
對應文件應用舉例2:
---應用層--面向用戶的主程序
軟| ↓
件|---協議層--如FAT、TCPIP、OS等現成的協議棧、算法、遊戲等
相| ↓
關| ↓
---功能層--如文件lcd.c;led.c;eeprom.c;time.c;ir.c;keybord.c;harddisk.c;如EEPROM的塊寫統一化
硬| ↓ ↓
件|---器件層--文件ee24xx.c;ee93xx.c;ee_sdcard.c;ee29xx.c;ee28f.c;ee39xx.c;等
驅| ↓ ↓
動 ---物理層--文件bus_i2c.c;bus_spi.c等
一個大的單片機程序往往包含很多模塊,我是這樣組織的
1。每一個C源文件都要建立一個與之名字一樣的H文件,裏面僅僅包括該C文件的函數的聲明,其他的什麼也
不會有,比如變量的定義啊等等不應該有。
2。建立一個所有的文件都要共同使用的頭文件,裏面當然就是單片機的管腳使用的定義,還有裏面放那些需
要的KEIL系統的頭文件,比如 #include<reg52.h>,#include<absacc.h>等等,把這個文件命名爲common.h,
或者乾脆就叫main.h
3,每個C源文件應該包含自己的頭文件以及那個共同的使用的頭文件,裏面還放自己本文件內部使用的全局
變量或者以extern定義的全局變量
4。主文件main.c裏面包含所有的頭文件包括那個共同使用的文件,main.c裏面的函數可以再做一個頭文件,
也可以直接放在文件的開頭部分聲明就可以了,裏面一般還有中斷服務程序也放在main.c裏面
5。對於那些貫穿整個工程的變量,可以放在那個共同的使用的頭文件裏面,也可以用extern關鍵字在某
個C源文件裏面定義,哪個文件要使用就重複定義一下
6.建立工程的時候,只要把C源文件加到工程中,把H文件直接放到相應的目錄下面就可以了,不需要加到工程裏面。
文章出處:DIY部落(http://www.diybl.com/course/3_program/c++/cppsl/2008920/144019.html)