一、前言
以STM32為例,打開網(wǎng)絡(luò)上下載的例程或者是購買開發(fā)板自帶的例程,都會發(fā)現(xiàn)應(yīng)用層中會有stm32f10x.h或者stm32f10x_gpio.h,這些文件嚴格來時屬于硬件層的,如果軟件層出現(xiàn)這些文件會顯得很亂。使用過Linux的童鞋們肯定知道linux系統(tǒng)無法直接操作硬件層,打開linux或者rt_thread代碼會發(fā)現(xiàn)代碼中都會有device的源文件,沒錯,這就是驅(qū)動層。二、實現(xiàn)原理
原理就是將硬件操作的接口全都放到驅(qū)動鏈表上,在驅(qū)動層實現(xiàn)device的open、read、write等操作。當(dāng)然這樣做也有弊端,就是驅(qū)動find的時候需要遍歷一遍驅(qū)動鏈表,這樣會增加代碼運行時間。三、代碼實現(xiàn)
國際慣例,寫代碼先寫頭文件。rt_thread中使用的是雙向鏈表,為了簡單在這我只用單向鏈表。有興趣的可以自行研究rt_thread頭文件接口:本次只實現(xiàn)如下接口,device_open 和device_close等剩下的接口可以自行研究。這樣就可以在應(yīng)用層中只調(diào)用如下接口可實現(xiàn):
/*
驅(qū)動注冊
*/
intcola_device_register(cola_device_t*dev);
/*
驅(qū)動查找
*/
cola_device_t*cola_device_find(constchar*name);
/*
驅(qū)動讀
*/
intcola_device_read(cola_device_t*dev,intpos,void*buffer,intsize);
/*
驅(qū)動寫
*/
intcola_device_write(cola_device_t*dev,intpos,constvoid*buffer,intsize);
/*
驅(qū)動控制
*/
intcola_device_ctrl(cola_device_t*dev,intcmd,void*arg);;
頭文件cola_device.h:
#ifndef_COLA_DEVICE_H_
#define_COLA_DEVICE_H_
enumLED_state
{
LED_OFF,
LED_ON,
LED_TOGGLE,
};
typedefstructcola_devicecola_device_t;
structcola_device_ops
{
int(*init)(cola_device_t*dev);
int(*open)(cola_device_t*dev,intoflag);
int(*close)(cola_device_t*dev);
int(*read)(cola_device_t*dev,intpos,void*buffer,intsize);
int(*write)(cola_device_t*dev,intpos,constvoid*buffer,intsize);
int(*control)(cola_device_t*dev,intcmd,void*args);
};
structcola_device
{
constchar*name;
structcola_device_ops*dops;
structcola_device*next;
};
/*
驅(qū)動注冊
*/
intcola_device_register(cola_device_t*dev);
/*
驅(qū)動查找
*/
cola_device_t*cola_device_find(constchar*name);
/*
驅(qū)動讀
*/
intcola_device_read(cola_device_t*dev,intpos,void*buffer,intsize);
/*
驅(qū)動寫
*/
intcola_device_write(cola_device_t*dev,intpos,constvoid*buffer,intsize);
/*
驅(qū)動控制
*/
intcola_device_ctrl(cola_device_t*dev,intcmd,void*arg);
#endif
源文件cola_device.c:
#include"cola_device.h"
#include
#include
structcola_device*device_list=NULL;
/*
查找任務(wù)是否存在
*/
staticboolcola_device_is_exists(cola_device_t*dev)
{
cola_device_t*cur=device_list;
while(cur!=NULL)
{
if(strcmp(cur->name,dev->name)==0)
{
returntrue;
}
cur=cur->next;
}
returnfalse;
}
staticintdevice_list_inster(cola_device_t*dev)
{
cola_device_t*cur=device_list;
if(NULL==device_list)
{
device_list=dev;
dev->next=NULL;
}
else
{
while(NULL!=cur->next)
{
cur=cur->next;
}
cur->next=dev;
dev->next=NULL;
}
return1;
}
/*
驅(qū)動注冊
*/
intcola_device_register(cola_device_t*dev)
{
if((NULL==dev)||(cola_device_is_exists(dev)))
{
return0;
}
if((NULL==dev->name)||(NULL==dev->dops))
{
return0;
}
returndevice_list_inster(dev);
}
/*
驅(qū)動查找
*/
cola_device_t*cola_device_find(constchar*name)
{
cola_device_t*cur=device_list;
while(cur!=NULL)
{
if(strcmp(cur->name,name)==0)
{
returncur;
}
cur=cur->next;
}
returnNULL;
}
/*
驅(qū)動讀
*/
intcola_device_read(cola_device_t*dev,intpos,void*buffer,intsize)
{
if(dev)
{
if(dev->dops->read)
{
returndev->dops->read(dev,pos,buffer,size);
}
}
return0;
}
/*
驅(qū)動寫
*/
intcola_device_write(cola_device_t*dev,intpos,constvoid*buffer,intsize)
{
if(dev)
{
if(dev->dops->write)
{
returndev->dops->write(dev,pos,buffer,size);
}
}
return0;
}
/*
驅(qū)動控制
*/
intcola_device_ctrl(cola_device_t*dev,intcmd,void*arg)
{
if(dev)
{
if(dev->dops->control)
{
returndev->dops->control(dev,cmd,arg);
}
}
return0;
}
硬件注冊方式:以LED為例,初始化接口void led_register(void),需要在初始化中調(diào)用。
#include"stm32f0xx.h"
#include"led.h"
#include"cola_device.h"
#definePORT_GREEN_LEDGPIOC
#definePIN_GREENLEDGPIO_Pin_13
/*LED亮、滅、變化*/
#defineLED_GREEN_OFF(PORT_GREEN_LED->BSRR=PIN_GREENLED)
#defineLED_GREEN_ON(PORT_GREEN_LED->BRR=PIN_GREENLED)
#defineLED_GREEN_TOGGLE(PORT_GREEN_LED->ODR^=PIN_GREENLED)
staticcola_device_tled_dev;
staticvoidled_gpio_init(void)
{
GPIO_InitTypeDefGPIO_InitStructure;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOC,ENABLE);
GPIO_InitStructure.GPIO_Pin=PIN_GREENLED;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL;
GPIO_Init(PORT_GREEN_LED,&GPIO_InitStructure);
LED_GREEN_OFF;
}
staticintled_ctrl(cola_device_t*dev,intcmd,void*args)
{
if(LED_TOGGLE==cmd)
{
LED_GREEN_TOGGLE;
}
else
{
}
return1;
}
staticstructcola_device_opsops=
{
.control=led_ctrl,
};
voidled_register(void)
{
led_gpio_init();
led_dev.dops=&ops;
led_dev.name="led";
cola_device_register(&led_dev);
}
應(yīng)用層app代碼:
#include
#include"app.h"
#include"config.h"
#include"cola_device.h"
#include"cola_os.h"
statictask_ttimer_500ms;
staticcola_device_t*app_led_dev;
//led每500ms狀態(tài)改變一次
staticvoidtimer_500ms_cb(uint32_tevent)
{
cola_device_ctrl(app_led_dev,LED_TOGGLE,0);
}
voidapp_init(void)
{
app_led_dev=cola_device_find("led");
assert(app_led_dev);
cola_timer_create(&timer_500ms,timer_500ms_cb);
cola_timer_start(&timer_500ms,TIMER_ALWAYS,500);
}
這樣app.c文件中就不需要調(diào)用led.h頭文件了,rtt就是這樣實現(xiàn)的。四、總結(jié)
這樣就可以實現(xiàn)軟硬件分層了,是不是非常好用!
原文標題:嵌入式項目如何實現(xiàn)應(yīng)用和硬件分層管理
文章出處:【微信公眾號:strongerHuang】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
審核編輯:彭菁
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。
舉報投訴
-
STM32
+關(guān)注
關(guān)注
2307文章
11150瀏覽量
372410 -
軟硬件
+關(guān)注
關(guān)注
1文章
319瀏覽量
20121 -
代碼
+關(guān)注
關(guān)注
30文章
4956瀏覽量
73495
原文標題:嵌入式項目如何實現(xiàn)應(yīng)用和硬件分層管理
文章出處:【微信號:strongerHuang,微信公眾號:strongerHuang】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
熱點推薦
支持過程級動態(tài)軟硬件劃分的RSoC設(shè)計與實現(xiàn)
目前,可重構(gòu)計算平臺所支持的動態(tài)軟硬件劃分粒度多處于線程級或指令級,但線程級劃分開銷太大,而指令級劃分又過于復(fù)雜,因此很難被用于實際應(yīng)用之中。本文設(shè)計并實現(xiàn)了一種支持過程級動態(tài)軟硬件劃分的可重構(gòu)片上
發(fā)表于 05-28 13:40
怎么實現(xiàn)動感系統(tǒng)的總體構(gòu)想及其軟硬件設(shè)計?
新型車輛模擬駕駛訓(xùn)練系統(tǒng)的組成及工作原理是什么怎么實現(xiàn)動感系統(tǒng)的總體構(gòu)想及其軟硬件設(shè)計?
發(fā)表于 05-12 06:15
linux系統(tǒng)實現(xiàn)軟硬件分層的方法
一、前言 以STM32為例,打開網(wǎng)絡(luò)上下載的例程或者是購買開發(fā)板自帶的例程,都會發(fā)現(xiàn)應(yīng)用層中會有stm32f10x.h或者stm32f10x_gpio.h,這些文件嚴格來時屬于硬件層的,如果軟件層出
發(fā)表于 11-08 08:52
如何去實現(xiàn)RCC系統(tǒng)時鐘的軟硬件設(shè)計呢
RCC時鐘樹是由哪些部分組成的?如何去實現(xiàn)RCC系統(tǒng)時鐘的軟硬件設(shè)計呢?
發(fā)表于 11-10 07:20
如何去實現(xiàn)一種基于SoPC的軟硬件協(xié)同設(shè)計呢
什么是軟硬件協(xié)同設(shè)計呢?片上可編程系統(tǒng)SoPC是什么?如何去實現(xiàn)一種基于SoPC的軟硬件協(xié)同設(shè)計呢?基于SoPC的軟硬件協(xié)同設(shè)計有何功能呢?
發(fā)表于 12-24 07:15
如何對SOA進行軟硬件部署
車型項目,平臺線,負責(zé)構(gòu)建技術(shù)中臺。新平臺的開發(fā),技術(shù)鏈路往往非常長且復(fù)雜,分層的架構(gòu)設(shè)計和軟硬件解耦的方式,可很好的便于進行分層測試與驗證,減少集成測試的壓力,問題發(fā)現(xiàn)的更充分,也能夠提高版本發(fā)布的速度。原作者:Jessie焉
發(fā)表于 06-10 17:23
單片機測控系統(tǒng)的軟硬件平臺技術(shù)
本文探討了一種用于工業(yè)測控系統(tǒng)的單片機軟硬件綜合設(shè)計方法——軟硬件平臺技術(shù),重點闡述了其基本原理、設(shè)計思想、實現(xiàn)方法,并給出了一個單片機測控系統(tǒng)軟硬件開發(fā)平臺
發(fā)表于 08-13 09:38
?12次下載
面向HDTV應(yīng)用的音頻解碼軟硬件協(xié)同設(shè)計
摘要:該文以Dolby實驗室的音頗AC3算法為基礎(chǔ),研究了在RISC核Virgo上HDTV音頻解碼的軟硬件協(xié)同設(shè)計方法,提出了通過對程序關(guān)鍵子函數(shù)建模來實現(xiàn)軟硬件劃分的軟硬件協(xié)同設(shè)計方
發(fā)表于 07-02 21:56
?32次下載
基于SoPC的狀態(tài)監(jiān)測裝置的嵌入式軟硬件協(xié)同設(shè)計與實現(xiàn)
本文利用基于SoPC的軟硬件協(xié)同設(shè)計方法實現(xiàn)了水電機組在線監(jiān)測系統(tǒng)中的狀態(tài)監(jiān)測裝置,是軟硬件協(xié)同設(shè)計技術(shù)在電力場合的嵌入式裝置開發(fā)中的創(chuàng)新式的嘗試。
發(fā)表于 01-16 10:35
?7558次閱讀
基于FPGA的軟硬件協(xié)同測試設(shè)計影響因素分析與設(shè)計實現(xiàn)
,不利于硬件的開發(fā)進度。面對這一難題,文章從FPGA 的軟硬件協(xié)同測試角度出發(fā),利用PC 機和測試硬件設(shè)備的特點,進行FPGA 的軟硬件協(xié)同測試的設(shè)計,努力
發(fā)表于 11-18 05:46
?2337次閱讀
Type-c設(shè)計及PD相關(guān)軟硬件實現(xiàn)詳解
Type-c設(shè)計及PD相關(guān)軟硬件實現(xiàn)詳解,
發(fā)表于 02-23 09:53
?41次下載
為什么要從“軟硬件協(xié)同”走向“軟硬件融合”?
軟件和硬件需要定義好交互的“接口”,通過接口實現(xiàn)軟硬件的“解耦”。例如,對CPU來說,軟硬件的接口是指令集架構(gòu)ISA:ISA之下的CPU處理器是硬件
軟硬件融合的概念和內(nèi)涵
跟很多朋友交流,當(dāng)提到軟硬件融合的時候,他們會這么說:“軟硬件融合,難道不是顯而易見嗎?我感覺在二三十年前就已經(jīng)有這個概念了?!痹谒麄兊南敕ɡ?,其實:軟硬件融合等同于軟硬件協(xié)同,甚至等
如何實現(xiàn)軟硬件分層
評論