衡阳派盒市场营销有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

如何實現軟硬件分層

strongerHuang ? 來源:CSDN ? 作者:CSDN ? 2022-03-10 17:32 ? 次閱讀

一、前言

STM32為例,打開網絡上下載的例程或者是購買開發板自帶的例程,都會發現應用層中會有stm32f10x.h或者stm32f10x_gpio.h,這些文件嚴格來時屬于硬件層的,如果軟件層出現這些文件會顯得很亂。使用過Linux的童鞋們肯定知道linux系統無法直接操作硬件層,打開linux或者rt_thread代碼會發現代碼中都會有device的源文件,沒錯,這就是驅動層。

二、實現原理

原理就是將硬件操作的接口全都放到驅動鏈表上,在驅動層實現device的open、read、write等操作。當然這樣做也有弊端,就是驅動find的時候需要遍歷一遍驅動鏈表,這樣會增加代碼運行時間。

三、代碼實現

國際慣例,寫代碼先寫頭文件。rt_thread中使用的是雙向鏈表,為了簡單在這我只用單向鏈表。有興趣的可以自行研究rt_thread頭文件接口:本次只實現如下接口,device_open 和device_close等剩下的接口可以自行研究。這樣就可以在應用層中只調用如下接口可實現:
/*
驅動注冊
*/
intcola_device_register(cola_device_t*dev);
/*
驅動查找
*/
cola_device_t*cola_device_find(constchar*name);
/*
驅動讀
*/
intcola_device_read(cola_device_t*dev,intpos,void*buffer,intsize);
/*
驅動寫
*/
intcola_device_write(cola_device_t*dev,intpos,constvoid*buffer,intsize);
/*
驅動控制
*/
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;
};

/*
驅動注冊
*/
intcola_device_register(cola_device_t*dev);
/*
驅動查找
*/
cola_device_t*cola_device_find(constchar*name);
/*
驅動讀
*/
intcola_device_read(cola_device_t*dev,intpos,void*buffer,intsize);
/*
驅動寫
*/
intcola_device_write(cola_device_t*dev,intpos,constvoid*buffer,intsize);
/*
驅動控制
*/
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;

/*
查找任務是否存在
*/
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;
}

/*
驅動注冊
*/
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);

}
/*
驅動查找
*/
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;
}
/*
驅動讀
*/
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;
}
/*
驅動寫
*/
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;
}
/*
驅動控制
*/
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),需要在初始化中調用。


#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);
}
應用層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狀態改變一次
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文件中就不需要調用led.h頭文件了,rtt就是這樣實現的。

四、總結

這樣就可以實現軟硬件分層了,是不是非常好用!


原文標題:嵌入式項目如何實現應用和硬件分層管理

文章出處:【微信公眾號:strongerHuang】歡迎添加關注!文章轉載請注明出處。

審核編輯:彭菁

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • STM32
    +關注

    關注

    2272

    文章

    10923

    瀏覽量

    357576
  • 軟硬件
    +關注

    關注

    1

    文章

    303

    瀏覽量

    19267
  • 代碼
    +關注

    關注

    30

    文章

    4827

    瀏覽量

    69052

原文標題:嵌入式項目如何實現應用和硬件分層管理

文章出處:【微信號:strongerHuang,微信公眾號:strongerHuang】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    支持過程級動態軟硬件劃分的RSoC設計與實現

    目前,可重構計算平臺所支持的動態軟硬件劃分粒度多處于線程級或指令級,但線程級劃分開銷太大,而指令級劃分又過于復雜,因此很難被用于實際應用之中。本文設計并實現了一種支持過程級動態軟硬件劃分的可重構片上
    發表于 05-28 13:40

    怎么實現動感系統的總體構想及其軟硬件設計?

    新型車輛模擬駕駛訓練系統的組成及工作原理是什么怎么實現動感系統的總體構想及其軟硬件設計?
    發表于 05-12 06:15

    linux系統實現軟硬件分層的方法

    一、前言 以STM32為例,打開網絡上下載的例程或者是購買開發板自帶的例程,都會發現應用層中會有stm32f10x.h或者stm32f10x_gpio.h,這些文件嚴格來時屬于硬件層的,如果軟件層出
    發表于 11-08 08:52

    如何去實現RCC系統時鐘的軟硬件設計呢

    RCC時鐘樹是由哪些部分組成的?如何去實現RCC系統時鐘的軟硬件設計呢?
    發表于 11-10 07:20

    如何去實現一種基于SoPC的軟硬件協同設計呢

    什么是軟硬件協同設計呢?片上可編程系統SoPC是什么?如何去實現一種基于SoPC的軟硬件協同設計呢?基于SoPC的軟硬件協同設計有何功能呢?
    發表于 12-24 07:15

    如何對SOA進行軟硬件部署

    車型項目,平臺線,負責構建技術中臺。新平臺的開發,技術鏈路往往非常長且復雜,分層的架構設計和軟硬件解耦的方式,可很好的便于進行分層測試與驗證,減少集成測試的壓力,問題發現的更充分,也能夠提高版本發布的速度。原作者:Jessie焉
    發表于 06-10 17:23

    單片機測控系統的軟硬件平臺技術

    本文探討了一種用于工業測控系統的單片機軟硬件綜合設計方法——軟硬件平臺技術,重點闡述了其基本原理、設計思想、實現方法,并給出了一個單片機測控系統軟硬件開發平臺
    發表于 08-13 09:38 ?12次下載

    面向HDTV應用的音頻解碼軟硬件協同設計

    摘要:該文以Dolby實驗室的音頗AC3算法為基礎,研究了在RISC核Virgo上HDTV音頻解碼的軟硬件協同設計方法,提出了通過對程序關鍵子函數建模來實現軟硬件劃分的軟硬件協同設計方
    發表于 07-02 21:56 ?32次下載

    基于SoPC的狀態監測裝置的嵌入式軟硬件協同設計與實現

    本文利用基于SoPC的軟硬件協同設計方法實現了水電機組在線監測系統中的狀態監測裝置,是軟硬件協同設計技術在電力場合的嵌入式裝置開發中的創新式的嘗試。
    發表于 01-16 10:35 ?1893次閱讀
    基于SoPC的狀態監測裝置的嵌入式<b class='flag-5'>軟硬件</b>協同設計與<b class='flag-5'>實現</b>

    USB的串行通信軟硬件設計

    USB的串行通信軟硬件設計
    發表于 09-04 10:08 ?14次下載
    USB的串行通信<b class='flag-5'>軟硬件</b>設計

    基于FPGA的軟硬件協同測試設計影響因素分析與設計實現

    ,不利于硬件的開發進度。面對這一難題,文章從FPGA 的軟硬件協同測試角度出發,利用PC 機和測試硬件設備的特點,進行FPGA 的軟硬件協同測試的設計,努力
    發表于 11-18 05:46 ?1963次閱讀

    基于FPGA芯片的軟硬件平臺的使用

    基于FPGA芯片的軟硬件平臺的使用
    發表于 07-01 09:35 ?20次下載

    Type-c設計及PD相關軟硬件實現詳解

    Type-c設計及PD相關軟硬件實現詳解,
    發表于 02-23 09:53 ?41次下載

    為什么要從“軟硬件協同”走向“軟硬件融合”?

    軟件和硬件需要定義好交互的“接口”,通過接口實現軟硬件的“解耦”。例如,對CPU來說,軟硬件的接口是指令集架構ISA:ISA之下的CPU處理器是硬件
    的頭像 發表于 12-07 14:23 ?2834次閱讀

    軟硬件融合的概念和內涵

    跟很多朋友交流,當提到軟硬件融合的時候,他們會這么說:“軟硬件融合,難道不是顯而易見嗎?我感覺在二三十年前就已經有這個概念了。”在他們的想法里,其實:軟硬件融合等同于軟硬件協同,甚至等
    的頭像 發表于 10-17 14:36 ?1665次閱讀
    <b class='flag-5'>軟硬件</b>融合的概念和內涵
    罗盘24山度数| 东辽县| 至尊百家乐停播| 百家乐官网规则技法| 网上百家乐官网赌城| 注册娱乐城送体验金| 缅甸百家乐赌博有假吗| 菲律宾百家乐官网太阳城| 太阳城的故事| 百家乐10法则| 百家乐官网免费破解外挂| 大发888游戏客户端下载| 百家乐官网园| 黄金城百家乐官网游戏| 全讯网3344555| 网上百家乐投注法| 澳门百家乐官网大揭密| 澳门顶级赌场娱乐平台| 澳门百家乐怎玩| 百家乐官网赌博公司| 立即博最新网址| 七匹狼百家乐的玩法技巧和规则| 游戏机百家乐官网的技巧| 金豪娱乐| 凯斯百家乐的玩法技巧和规则| 百家乐官网赌场| 百乐坊百家乐官网游戏| 扬中棋牌游戏中心| 百家乐娱乐网77scs| 博彩百家乐官网字谜总汇二丹东| 北票市| 大发888赌城| 现金百家乐赌法| 百家乐官网合法| 百家乐官网能赢到钱吗| 535棋牌游戏| 网上百家乐游戏哪家信誉度最好| 微信百家乐官网群规则大全| 百家乐官网台布21点| 澳门金沙| 大发888娱乐场下载co|