新聞中心

        EEPW首頁 > 設(shè)計應(yīng)用 > 用點(diǎn)亮LED舉例,說明嵌入式軟件分層設(shè)計的思想

        用點(diǎn)亮LED舉例,說明嵌入式軟件分層設(shè)計的思想

        作者: 時間:2024-02-29 來源:網(wǎng)絡(luò) 收藏

        開發(fā),點(diǎn)燈一路發(fā)” —— 今天我們就以控制閃爍為例,來聊聊分層。

        本文引用地址:http://www.104case.com/article/202402/455842.htm
        ———————————           
        |          |
        |     P1.1 |-----I<|--------------<|
        |          |                
        |     P2.1 |-------------/ ---------|--.
        |          |
        |          |
        ———————————      

        1. 兩層結(jié)構(gòu)

        硬件層<-->層--最粗糙的分層架構(gòu)

        /*****************************/
        #include 
        int main(){
          int i=0;
          while(1)
           {
              P1_1=0;
              for(i=0;i<5000;i++);
              P1_1=1;
              for(i=0;i<5000;i++);
          }
        }

        2. 三層結(jié)構(gòu)

        硬件層<--> 驅(qū)動層<-->應(yīng)用層

        /*******驅(qū)動頭文件 driver.h*********/
        void delay();
        void led_on();
        void led_off();
        /**********驅(qū)動源文件 driver.c******/
        #include 
        #include"driver.h"
        /*延時函數(shù)*/
        void delay(){
           int i=0;
           for(i=0;i<5000;i++);
        }
        void led_on(){
           P1_1=0;
        }
        void led_off(){
           P1_1=1;
        }
        /*****應(yīng)用系統(tǒng)***************/
        #include“../driver/driver.h”
        int main(){
          while(1)
           { 
               led_on();
               delay();
               led_off();
               delay();
          }
        }

        3. 四層結(jié)構(gòu)

        硬件層<-->驅(qū)動層<-->操作系統(tǒng)層<-->應(yīng)用層

        /********驅(qū)動***********************/
        #include
        #include
        #include
        #include
        #include
        #include
        #include
        #include
        int led_init(void);
        void led_cleanup();
        static int device_open(struct inode *,struct file*);
        static int device_release(struct inode *,struct file*);
        static ssize_t device _write(struct file*,const char *,size_t,loff_t *);
        int init_model(void);
        void cleanup_module(void);
        struct file_operations led_ops={
        .owner=THIS_MODULE,
        ..............................
        }
        int led_init(void)
        {
        ..............................
        }
        void led_cleanup()
        {
        ..............................
        }
        static int device_open(struct inode * inode ,struct file* file)
        {
        ..............................
        }
        static int device_release(struct inode *inode,struct file* file)
        {
        ..............................
        }
        static ssize_t device _write(struct file *file,const char * buffer,size_t length,loff_t *offset)
        {
        ..............................
        int init_model(void)
        {
        ..............................
        }
        modele_init(led_init);
        module_exit(led_cleanup);
        MODULE_LICENCE("GPL");
        /************應(yīng)用****************/
        #include 
        #include 
        #include 
        #include
        #define   "/dev/led"
        int main(){
            File *fp=fopen(,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. 是為了復(fù)用,解耦,層次分明。

        驅(qū)動層和中間的操作系統(tǒng)層是可以復(fù)用的,產(chǎn)品升級或更新?lián)Q代的時候,雖然總的代碼量是大的,但實際有很多代碼是不需要重新開發(fā)的,系統(tǒng)開發(fā)的工作量相對較小。比如說IO口調(diào)整了,甚至是整個硬件板子更換了,上只要調(diào)整驅(qū)動即可。

        很多大學(xué)的系統(tǒng)課程中采用的是兩層結(jié)構(gòu),主要的原因是教材中的示例一般比較簡單,其主要目的是為了演示如何使用芯片,如何實現(xiàn)某個功能,很少考慮復(fù)用的問題。

        為了講清楚其中的操作方法,其代碼會盡量簡單,即使是實現(xiàn)相對比較復(fù)雜的功能可能也只是采用抽象為函數(shù)的方法,很少考慮工程的問題,在潛移默化中很多人就以為兩層架構(gòu)就是理所當(dāng)然的。

        具體采用何種分層結(jié)構(gòu)就是與產(chǎn)品相關(guān)的。比如大家都知道坐飛機(jī)要比步行快,在校園里從上課的教室到休息的宿舍哪一種方式好呢?當(dāng)然是步行。反之,從南京到北京,如果坐飛機(jī)肯定要比步行好(當(dāng)然,個人覺得更好的選擇是坐高鐵)。

        第3種方式似乎代碼量是最大的,但是要記住底層是很少改的,所以開發(fā)的時候就是寫應(yīng)用,這個代碼量有多少呢?優(yōu)勢可見一斑!



        關(guān)鍵詞: 嵌入式 LED 軟件 設(shè)計

        評論


        相關(guān)推薦

        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 察哈| 长兴县| 武冈市| 克拉玛依市| 景谷| 肇州县| 信丰县| 昭通市| 广东省| 吴江市| 渝北区| 乌苏市| 正镶白旗| 进贤县| 雅安市| 高要市| 洱源县| 三台县| 深圳市| 舟山市| 富阳市| 双城市| 娱乐| 达州市| 葫芦岛市| 长武县| 治县。| 收藏| 宜章县| 郑州市| 格尔木市| 崇义县| 墨玉县| 和林格尔县| 佛学| 阳高县| 泸溪县| 丘北县| 青龙| 阜城县| 绥棱县|