新聞中心

EEPW首頁 > 設計應用 > 用點亮LED舉例,說明嵌入式軟件分層設計的思想

用點亮LED舉例,說明嵌入式軟件分層設計的思想

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

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

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

1. 兩層結構

硬件層<-->層--最粗糙的分層架構

/*****************************/
#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. 三層結構

硬件層<--> 驅動層<-->應用層

/*******驅動頭文件 driver.h*********/
void delay();
void led_on();
void led_off();
/**********驅動源文件 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;
}
/*****應用系統(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
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");
/************應用****************/
#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. 是為了復用,解耦,層次分明。

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

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

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

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

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



關鍵詞: 嵌入式 LED 軟件 設計

評論


相關推薦

技術專區(qū)

關閉