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
    +关注

    关注

    2239

    文章

    10670

    浏览量

    348712
  • 软硬件
    +关注

    关注

    1

    文章

    269

    浏览量

    19052
  • 代码
    +关注

    关注

    30

    文章

    4554

    浏览量

    66736

原文标题:嵌入式项目如何实现应用和硬件分层管理

文章出处:【微信号:strongerHuang,微信公众号:strongerHuang】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    STM32单片机到底是如何实现软硬件结合?

    本文分析 STM32 单片机到底是如何实现软硬件结合的,接着分析单片机程序如何编译、运行。
    发表于 05-16 09:54 797次阅读
    STM32单片机到底是如何<b class='flag-5'>实现</b><b class='flag-5'>软硬件</b>结合?

    支持过程级动态软硬件划分的RSoC设计与实现

    目前,可重构计算平台所支持的动态软硬件划分粒度多处于线程级或指令级,但线程级划分开销太大,而指令级划分又过于复杂,因此很难被用于实际应用之中。本文设计并实现了一种支持过程级动态软硬件划分的可重构片上
    发表于 05-28 13:40

    基于Altera FPGA的软硬件协同仿真方法介绍

    摘要:简要介绍了软硬件协同仿真技术,指出了在大规模FPGA开发中软硬件协同仿真的重要性和必要性,给出基于Altera FPGA的门级软硬件协同仿真实例。 关键词:系统级芯片设计;软硬件
    发表于 07-04 06:49

    怎么实现动感系统的总体构想及其软硬件设计?

    新型车辆模拟驾驶训练系统的组成及工作原理是什么怎么实现动感系统的总体构想及其软硬件设计?
    发表于 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次下载

    基于FPGA的软硬件协同测试设计影响因素分析与设计实现

    ,不利于硬件的开发进度。面对这一难题,文章从FPGA 的软硬件协同测试角度出发,利用PC 机和测试硬件设备的特点,进行FPGA 的软硬件协同测试的设计,努力
    发表于 11-18 05:46 1648次阅读

    基于FPGA芯片的软硬件平台的使用

    基于FPGA芯片的软硬件平台的使用
    发表于 07-01 09:35 20次下载

    Type-c设计及PD相关软硬件实现详解

    Type-c设计及PD相关软硬件实现详解,
    发表于 02-23 09:53 39次下载

    为什么要从“软硬件协同”走向“软硬件融合”?

    软件和硬件需要定义好交互的“接口”,通过接口实现软硬件的“解耦”。例如,对CPU来说,软硬件的接口是指令集架构ISA:ISA之下的CPU处理器是硬件
    的头像 发表于 12-07 14:23 1918次阅读

    软硬件融合的概念和内涵

    跟很多朋友交流,当提到软硬件融合的时候,他们会这么说:“软硬件融合,难道不是显而易见吗?我感觉在二三十年前就已经有这个概念了。”在他们的想法里,其实:软硬件融合等同于软硬件协同,甚至等
    的头像 发表于 10-17 14:36 530次阅读
    <b class='flag-5'>软硬件</b>融合的概念和内涵