面向嵌入式系统的轻量级框架分析

mr-library简介

mr-library 是一个面向嵌入式系统的轻量级框架,提供统一的底层驱动设备模型以及基础服务功能,具有模块化设计、可配置性和扩展性的特点, 可帮助开发者快速构建嵌入式应用程序。

mr-library 框架支持互斥锁、对象管理等基础内核功能。集成异步事件驱动框架(event)、多时基软件定时器(soft-timer) 等服务。提供串口、SPI、I2C、ADC/DAC等常见外设的驱动设备模型,通过统一的驱动接口(open、close、ioctl、read、write)访问底层硬件设备,解耦底层驱动和应用。

应用场景

  • MCU开发的低层驱动程序。

  • RTOS实时操作系统的外挂框架(作为驱动设备框架使用)。

  • 各类IoT和智能硬件产品的快速开发。


驱动设备框架

开发者能以面向对象的方式访问外设,简化驱动逻辑的开发流程。框架实现了常用外设的通用驱动模板,开发者可以快速移植到不同的硬件平台。

驱动设备框架支持普通设备的通用接口、总线设备自动总线控制、多种设备的中断接管。

驱动设备接口

设备驱动框架提供统一的操作接口,设备的所有操作都需要通过以下接口实现:

接口描述
mr_device_add添加设备
mr_device_find查找设备
mr_device_open打开设备
mr_device_close关闭设备
mr_device_ioctl控制设备
mr_device_read从设备读取数据
mr_device_write向设备写入数据

SPI设备使用示例:

/* 定义SPI设备 */
#define SPI_DEVICE0_CS_PIN              10
#define SPI_DEVICE1_CS_PIN              20
struct mr_spi_device spi_device0, spi_device1;/* 添加SPI设备 */
mr_spi_device_add(&spi_device0, "spi10", SPI_DEVICE0_CS_PIN);
mr_spi_device_add(&spi_device1, "spi11", SPI_DEVICE1_CS_PIN);/* 查找SPI设备 */
mr_device_t spi0_device = mr_device_find("spi10");
mr_device_t spi1_device = mr_device_find("spi11");/* 挂载总线 */
mr_device_ioctl(spi0_device, MR_CTRL_ATTACH, "spi1");
mr_device_ioctl(spi1_device, MR_CTRL_ATTACH, "spi1");/* 以可读可写的方式打开SPI设备 */
mr_device_open(spi0_device, MR_OPEN_RDWR);
mr_device_open(spi1_device, MR_OPEN_RDWR);/* 发送数据 */
char buffer0[] = "hello";
char buffer1[] = "world";
mr_device_write(spi0_device, 0, buffer0, sizeof(buffer0) - 1);
mr_device_write(spi1_device, 0, buffer1, sizeof(buffer1) - 1);/* 读取数据 */
mr_device_read(spi0_device, 0, buffer0, sizeof(buffer0) - 1);
mr_device_read(spi1_device, 0, buffer1, sizeof(buffer1) - 1);/* 关闭设备 */
mr_device_close(spi0_device);
mr_device_close(spi1_device);

服务框架

mr-library 框架集成了轻量级的服务框架,用于构建嵌入式开发中的应用服务,支持异步事件监听,多时基软件定时器等。通过服务框架完成对应用层不同应用间的解耦,实现应用程序的模块化,可裁剪,业务逻辑清晰,开发快速,代码高度复用。

事件服务

事件服务是一种异步事件处理机制,它通过事件分发和回调的方式,可以有效地提高系统的异步处理能力、解耦性和可扩展性。

事件服务包含两个部分:事件服务器和事件。

  • 事件服务器用于接收和分发事件,其内部维护一个事件队列用于存储待处理事件和一个事件列表用于存储已创建事件。

  • 事件需要创建到事件服务器并提供一个回调函数。

当事件发生时,事件服务器会将事件插入到事件队列中进行缓存。事件服务器会周期性地从事件队列中取出事件进行分发,找到对应的事件回调进行事件处理。

事件服务操作接口
接口描述
mr_event_server_find查找事件服务器
mr_event_server_add添加事件服务器
mr_event_server_remove移除事件服务器
mr_event_server_handle事件服务器处理
mr_event_create创建事件
mr_event_delete移除事件
mr_event_notify通知事件发生
mr_event_trigger触发事件
事件服务使用示例:
/* 定义事件 */
#define EVENT1                          1
#define EVENT2                          2
#define EVENT3                          3/* 定义事件服务器 */
struct mr_event_server event_server;mr_err_t event1_cb(mr_event_server_t server, void *args)
{printf("event1_cb\r\n");/* 通知事件服务器事件2发生 */mr_event_notify(EVENT2, server);return MR_ERR_OK;
}mr_err_t event2_cb(mr_event_server_t server, void *args)
{printf("event2_cb\r\n");/* 通知事件服务器事件3发生 */mr_event_notify(EVENT3, server)return MR_ERR_OK;
}mr_err_t event3_cb(mr_event_server_t server, void *args)
{printf("event3_cb\r\n");return MR_ERR_OK;
}int main(void)
{/* 添加事件服务器到内核容器 */mr_event_server_add(&event_server, "server", 4);/* 创建事件到服务器 */mr_event_create(EVENT1, event1_cb, MR_NULL, &event_server);mr_event_create(EVENT2, event2_cb, MR_NULL, &event_server);mr_event_create(EVENT3, event3_cb, MR_NULL, &event_server);/* 通知事件服务器事件1发生 */mr_event_notify(EVENT1, &event_server);while (1){/* 事件服务器处理 */mr_event_server_handle(&event_server);}
}

现象:

event1_cb
event2_cb
event3_cb

软件定时器服务

软件定时器是一种在软件层面实现计时功能的机制,通过软件定时器,可以在特定时间点或时间间隔触发特定的事件。软件定时器常用于实现周期性任务、超时处理、定时器中断等功能。

软件定时器包含两个主要组件:定时服务器和定时器。

  • 定时服务器用于时间管理和定时器处理。

  • 定时器用于处理特定的超时处理,它需要注册到定时服务器并提供一个回调函数。

软件定时器服务操作接口

接口描述
mr_soft_timer_server_find查找定时服务器
mr_soft_timer_server_add添加定时服务器
mr_soft_timer_server_remove移除定时服务器
mr_soft_timer_server_update定时服务器时基信号更新
mr_soft_timer_server_handle定时服务器处理
mr_soft_timer_add添加定时器
mr_soft_timer_remove移除定时器
mr_soft_timer_start启动定时器
mr_soft_timer_stop暂停定时器
mr_soft_timer_add_then_start添加定时器并启动

软件定时器服务使用示例:

/* 定义定时服务器和定时器 */
struct mr_soft_timer_server server;
struct mr_soft_timer timer1, timer2, timer3;mr_err_t timer1_callback(mr_soft_timer timer, void *args)
{printf("timer1_callback\r\n");return MR_ERR_OK;
}mr_err_t timer2_callback(mr_soft_timer timer, void *args)
{printf("timer2_callback\r\n");return MR_ERR_OK;
}mr_err_t timer3_callback(mr_soft_timer timer, void *args)
{printf("timer3_callback\r\n");mr_soft_timer_stop(timer);return MR_ERR_OK;
}int main(void)
{/* 添加定时服务器 */mr_soft_timer_server_add(&server, "soft-timer");/* 添加定时器并启动 */mr_soft_timer_add_then_start(&timer1, 5, timer1_callback, MR_NULL, &server);mr_soft_timer_add_then_start(&timer2, 10, timer2_callback, MR_NULL, &server);mr_soft_timer_add_then_start(&timer3, 15, timer3_callback, MR_NULL, &server);while (1){/* 更新定时服务器时钟 */mr_soft_timer_server_update(&server, 1);/* 定时服务器处理(放在哪里,回调就将在哪里被调用) */mr_soft_timer_server_handle(&server);}
}

代码目录

mr-library 的代码目录结构如下表所示:

名称描述
bsp板级支持包
device设备文件
document文档
driver驱动文件
include库头文件
module组件
package软件包
src库源文件
  • 内核层: mr-library 的核心部分,实现对象管理,设备控制,服务接口等。

  • 设备层: 提供统一的设备接口,将设备接入到内核中。

  • 驱动层: 为设备提供底层硬件驱动,当硬件更换时仅需修改驱动层。

  • 组件层: 通过框架提供的API实现不同的功能。包括但不限于虚拟文件系统、通用传感器模块、网络框架等。

  • 软件包: 可独立使用,无依赖的软件包。

原文:https://gitee.com/MacRsh/mr-library

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/139752.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Aqs独占/共享模式

独占锁和共享锁的概念 独占锁也叫排他锁,是指该锁一次只能被一个线程所持有。如果线程T对数据A加上排他锁后,则其他线程不能再对A加任何类型的锁。获得排它锁的线程即能读数据又能修改数据。 共享锁是指该锁可被多个线程所持有。如果线程T对数据A加上共…

Flume最简单使用

文章目录 一、简介1、定义2、基础架构 二、快速入门1、解压Flume2、案例一:监控端口号3、案例二:将空目录下文件 三、Flume进阶1、Flume事务2、Flume Agent内部原理3、案例一:监控日志4、案例二:多路复用和拦截器适应4.1 原理4.2 …

Linux 操作技巧

目录 一、shell-命令解释器 二、Linux中的特殊符号 三、命令历史--history 一、shell-命令解释器 shell——壳,命令解释器,负责解析用户输入的命令 ——内置命令(shell内置) ——外置命令,在文件系统的某个目录下&…

【学习草稿】背包问题

一、01背包问题 图解详细解析 (转载) https://blog.csdn.net/qq_37767455/article/details/99086678 :Vi表示第 i 个物品的价值,Wi表示第 i 个物品的体积,定义V(i,j):当前背包容量 j,前 i 个物…

2010-2017年WIND分省政府性债务余额面板数据

2010-2017年WIND分省政府性债务余额面板数据 1、时间:2010-2017年 2、指标:债务余额 3、范围:30个省 4、来源:wind 5、指标解释:地方政府债务分为一般债务和专项债务。 一般债务对应的是一般公共预算&#xff0c…

方案:浅析利用AI智能识别与视频监控技术打造智慧水产养殖监管系统

一、方案背景 针对目前水产养殖集约、高产、高效、生态、安全的发展需求,基于智能传感、智慧物联网、人工智能、视频监控等技术打造智慧水产系统,成为当前行业的发展趋势。传统的人工观察水产养殖方式较为单一,难以及时发现人员非法入侵、偷…

跨域问题解决方案(三种)

Same Origin Policy同源策略(SOP) 具有相同的Origin,也即是拥有相同的协议、主机地址以及端口。一旦这三项数据中有一项不同,那么该资源就将被认为是从不同的Origin得来的,进而不被允许访问。 Cross-origin resource…

SpringBean的生命周期

SpringBean的生命周期 SperingBean的生命周期是从Bean实例化之后,即通过反射创建出对象之后,到Bean成为一个完整对象,最终存储到单例池中,这个过程被称为Spring Bean的生命周期。Spring Bean的生命周期大体上分为三个阶段 Bean的…

Win7开启触摸键盘方法

在Win7系统中,自带有触摸屏幕键盘,能够在屏幕上显示虚拟键盘,让用户可以用指针设备或触屏等进行输入操作,那么Win7系统怎么开启触摸键盘呢?想知道的小伙伴可以跟着我一起来学习一下。 1、首先打开Win7系统的开始菜单&a…

小程序中如何查看会员的访问记录

​在小程序中,我们可以通过如下方式来查看会员的访问记录。下面是具体的操作流程: 1. 找到指定的会员卡。在管理员后台->会员管理处,找到需要查看访客记录的会员卡。也支持对会员卡按卡号、手机号和等级进行搜索。 2. 查看会员卡详情。点…

Smart UI Web 16.0.1 WebComponents htmlelements Crack

Javascript Web 组件库 Smart UI Web 组件库是您构建令人惊叹的 Web 应用程序所需的唯一套件。它包含 70 多个快速且专业设计的 UI 组件,可在单个包中实现美观且始终现代的 Web 应用程序。 具有高级功能的即用型Javascript 组件。只需几行代码即可使用数据网格、甘特…

解决编译中遇到的问题:Please port gnulib freadahead.c to your platform

今天在编译旧版的gzip-1.7时遇到了一个错误: error: #error "Please port gnulib freadahead.c to your platform! Look at the definition of fflush, fread, ungetc on your system, then report this to bug-gnulib." 在网上搜了一下解决方法&#xf…

400电话申请流程详解,助您快速办理联通、移动、电信400电话

导语:随着企业业务的发展,越来越多的企业开始关注400电话的申请与办理。本文将为您详细介绍联通、移动、电信400电话的申请流程,帮助您快速办理400电话,提升企业形象和客户服务质量。 一、联通400电话申请流程 咨询与选择&#x…

nginx知识点详解:反向代理+负载均衡+动静分离+高可用集群

一、nginx基本概念 1. nginx是什么,做什么事情? Nginx是一个高性能的HTTP和反向代理服务器,特点是占有内存少,并发能力强。Nginx转为性能优化而开发,能经受高负载考验。支持热部署,启动容易,运…

Avl树(有详细图解)

目录 介绍 引入 概念 特点 模拟实现 思路 插入 旋转 左旋 无子树 有子树 右旋 无子树 有子树 左右旋 引入(也就是有子树版本的抽象图解) 解决方法(也就是左右旋) 总结 无子树(也就是curright的位置就是newnode) 有子树 模型高度解释 旋转 更新三个…

资料分析笔记

统计术语 现期:现在的时间 基期:之前的时间 现期量 基期量 增长量(有正负) 增长率 【增幅、增速、r】(有正负) 同比:例:2014年5月 和 2013年5月 环比:例:20…

[Linux入门]---git命令行的基本使用

文章目录 1.git使用gitee仓库创建git使用测试ignore文件 1.git使用 git是一款对文件进行版本控制的软件,gitee、github是基于git软件搭建的网站,是可以对代码进行托管的平台;github是国外的网站,访问慢,不稳定&#xf…

基于微信小程序的高校宿舍信息管理系统设计与实现(源码+lw+部署文档+讲解等)

前言 💗博主介绍:✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌💗 👇🏻…

【C++入门指南】C如何过渡到C++?祖师爷究竟对C++做了什么?

【C入门指南】C如何过渡到C?祖师爷究竟对C做了什么? 前言一、命名空间1.1 命名空间的定义1.2 命名空间使用 二、C输入、输出2.1 std命名空间的使用惯例 三、缺省参数3.1 缺省参数的定义3.2 缺省参数分类 四、函数重载4.1 函数重载概念4.2 C支持函数重载的…

逻辑漏洞挖掘之XSS漏洞原理分析及实战演练 | 京东物流技术团队

一、前言 2月份的1.2亿条用户地址信息泄露再次给各大公司敲响了警钟,数据安全的重要性愈加凸显,这也更加坚定了我们推行安全测试常态化的决心。随着测试组安全测试常态化的推进,有更多的同事对逻辑漏洞产生了兴趣,本系列文章旨在…