一、前言
以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就是这样实现的。四、总结
这样就可以实现软硬件分层了,是不是非常好用!
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
-
STM32
+关注
关注
2265文章
10859浏览量
354546 -
软硬件
+关注
关注
1文章
289浏览量
19176 -
代码
+关注
关注
30文章
4733浏览量
68294
原文标题:嵌入式项目如何实现应用和硬件分层管理
文章出处:【微信号:strongerHuang,微信公众号:strongerHuang】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
支持过程级动态软硬件划分的RSoC设计与实现
目前,可重构计算平台所支持的动态软硬件划分粒度多处于线程级或指令级,但线程级划分开销太大,而指令级划分又过于复杂,因此很难被用于实际应用之中。本文设计并实现了一种支持过程级动态软硬件划分的可重构片上
发表于 05-28 13:40
linux系统实现软硬件分层的方法
一、前言 以STM32为例,打开网络上下载的例程或者是购买开发板自带的例程,都会发现应用层中会有stm32f10x.h或者stm32f10x_gpio.h,这些文件严格来时属于硬件层的,如果软件层出
发表于 11-08 08:52
如何去实现一种基于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
•1824次阅读
基于FPGA的软硬件协同测试设计影响因素分析与设计实现
,不利于硬件的开发进度。面对这一难题,文章从FPGA 的软硬件协同测试角度出发,利用PC 机和测试硬件设备的特点,进行FPGA 的软硬件协同测试的设计,努力
发表于 11-18 05:46
•1886次阅读
为什么要从“软硬件协同”走向“软硬件融合”?
软件和硬件需要定义好交互的“接口”,通过接口实现软硬件的“解耦”。例如,对CPU来说,软硬件的接口是指令集架构ISA:ISA之下的CPU处理器是硬件
软硬件融合的概念和内涵
跟很多朋友交流,当提到软硬件融合的时候,他们会这么说:“软硬件融合,难道不是显而易见吗?我感觉在二三十年前就已经有这个概念了。”在他们的想法里,其实:软硬件融合等同于软硬件协同,甚至等
评论