第28章_瑞萨MCU零基础入门系列教程之基于面向对象的工程结构

news2024/11/29 17:04:06

本教程基于韦东山百问网出的 DShanMCU-RA6M5开发板 进行编写,需要的同学可以在这里获取: https://item.taobao.com/item.htm?id=728461040949

配套资料获取:https://renesas-docs.100ask.net

瑞萨MCU零基础入门系列教程汇总: https://blog.csdn.net/qq_35181236/article/details/132779862


第28章 基于面向对象的工程结构

在前面的章节里,讲解了瑞萨RA6M5的常用外设,重点在于模块的操作原理、如何使用RASC进行配置、如何编写程序。这些模块功能单一,RASC生成的代码封装良好,也是基于面向对象的思想构造了对应的结构体。但是在使用这些模块时,我们没有特意使用面向对象的思想来写程序。

本章之后的内容,将会在FSP所提供的HAL库基础上,去操作更丰富的模块。这些模块的驱动程序,不应该跟底层的HAL库紧密绑定:比如温湿度传感器DHT11的驱动程序,既可以在RA6M5上运行,也能够非常容易地移植到其他平台上。在编写模块驱动程序时,就要把程序分层,每层之间设计好接口,然后使用面向对象的思想来实现各层。

随着功能的增加,一个工程涉及的文件会越来越多,本书设计了如下图所示的工程结构:

  1. 应用程序

位于applications目录下,用于存放业务相关的代码,它们可能是多个模块对象的联调,也可能是数据的处理。比如“根据按键操作LED”,这就属于应用层的代码。按键和LED的操作函数,不属于应用层,而是属于底下的设备层。

这一层需要和底层驱动完全解耦合:这一层的代码移植到其它平台时,无需修改代码。

  1. 头文件

位于include目录下,主要存放error.h和config.h,前者用于统一错误代码,后者用于配置整个工程。

  1. 设备层

位于devices目录。简单设备的文件直接放在devices目录里;对于模块,在devices目录下根据模块名字创建一个子目录,用来存放模块的文件。

在dev_xxx.h中根据设备的特性定义一些结构体,在dev_xxx.c里实现了这些结构体,并使用链表来管理同类设备。上层代码获取这些结构体后,就可以直接调用结构的函数指针来操作设备。

以GPIO设备为例,实现了4个函数:

void IODevicesRegister(void);
void IODeviceInsert(struct IODev *ptdev);
struct IODev *IODeviceFind(const char *name);
void IODeviceList(void);
  • IODevicesRegister:注册所有使用到的GPIO设备;
  • IODeviceInsert:这个函数被底层的drv_gpio.c调用,用来插入一个GPIO设备;
  • IODeviceFind:根据名称查找IO设备;
  • IODeviceList:打印所有的IO设备;
  1. 驱动层

位于drivers目录,存放的平台相关的驱动源代码。

drivers.h:根据config.h中的宏开关,包含drv_xxx.h。

drv_xxx.h:接口,供外部代码调用。

drv_xxx.h:驱动代码,一般用来实现并注册dev_xxx.h中声明的结构体,会调用平台提供的HAL库。

仍以GPIO设备为例,在dev_gpio.h里抽象出了IODev接构体,如下:

typedef struct IODev{
    char            *name;
    unsigned int    port;
    unsigned char   value;
    int             (*Init)(struct IODev *ptDev);
    int             (*Write)(struct IODev *ptDev, unsigned char level);
    int             (*Read)(struct IODev *ptDev);
    struct IODev *next;
}IODevice, *pIODevice;

在drv_gpio.c,对于每一个GPIO引脚,都要实现一个IODev结构体,示例如下:

static struct IODev gDQDev = {
    .name = "DS18B20 DQ",
    .port = BSP_IO_PORT_00_PIN_03,
    .value = 0,
    .Init = IODrvInit,
    .Read = IODrvRead,
    .Write = IODrvWrite,
    .next = NULL
};

最后,在drv_gpio.c里还要实现一个函数,用来注册这些IODev:

void IODevicesCreate(void)
{
    IODeviceInsert(&gDQDev);
}

在drv_gpio.h里声明IODevicesCreate函数,供外部代码调用。

  1. 自定义库

位于libs目录。

存放一些通用功能模块,例如延时函数、环形缓冲区函数、printf重定向函数等。一般来说这些模块跟底层硬件关系不大,但是也有例外。比如延时函数跟底层硬件定时器密切相关,但是它太常用了,所以也放在libs目录下。

  1. RA库

这一层是一个泛指,RA相关的代码。比如使用RASC生成工程时,这些目录的代码都是自动生成的:ra、ra_cfg、ra_gen,它们都属于“RA库”。


本章完

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Django05_反向解析

Django05_反向解析 5.1 反向解析概述 随着功能的不断扩展,路由层的 url 发生变化,就需要去更改对应的视图层和模板层的 url,非常麻烦,不便维护。这个时候我们可以通过反向解析,将 url解析成对应的 试图函数 通过 path…

OSCP系列靶场-Esay-Vegeta1保姆级

OSCP系列靶场-Esay-Vegeta1保姆级 目录 OSCP系列靶场-Esay-Vegeta1保姆级总结准备工作信息收集-端口扫描目标开放端口收集目标端口对应服务探测 信息收集-端口测试22-SSH端口的信息收集22-SSH端口版本信息与MSF利用22-SSH协议支持的登录方式22-SSH手动登录尝试(无)22-SSH弱口令…

魔众携手ModStart上线全新模块市场,支持模板主题

ModStart模板主题 对于很多新手或者是缺乏经验的开发者来说,快速建站具有一定的难度,总是一件让人头疼的问题。 ModStart为开发者提供了一些模板主题供开发者选购使用,模块市场包含了丰富的模块,后台一键快速安装,让开…

Botowski:SEO友好的AI内容生成器

【产品介绍】 名称 Botowski 具体描述 Botowski是一个人工智能内容生成器,可以被撰稿人、企业主和其他人用来创建高质量的内容。 它可以创建各种主题的文章、博客文章,甚至散文。Botowski的设计是用户友好的;你所需要做…

Java笔记042-反射章节练习

反射章节练习 练习1:通过反射修改私有成员变量 定义PrivateTest类,有私有name属性,并且属性值为helloKitty提供getName的公有方法创建PrivateTest的类,利用Class类得到私有的name属性,修改私有的name属性值&#xff…

过拟合、欠拟合、泛化误差、训练误差

模型容量的影响: 泛化误差: 当训练的模型的容量过了最优点时,泛化误差反而升高,这是由于模型过于关注细节导致,模型也同时记住噪声;当拿来一个真的数据时,模型会被一些无关紧要的细节所干扰。 …

Python数据分析 — 数据分析概念、重要性、流程和常用工具

前言:Hello大家好,我是小哥谈。Python数据分析是利用Python编程语言进行数据处理、转换、清洗、可视化和建模的过程。Python在数据科学领域非常流行,有许多强大的库和工具可供使用,例如NumPy、Pandas、Matplotlib和Scikit-learn等…

问道管理:iPhone15系列发布 星闪技术快速商用

9月12日,沪指盘中窄幅震动收拾,创业板指午后下探。到收盘,沪指跌0.18%报3137.06点,深成指微跌0.08%报10373.99点,创业板指跌0.59%报2051.04点;两市算计成交7083亿元,较此前一日削减1329亿元&…

UPS电源UL1778认证,不间断电源系统ul1778认证

UPS电源UL1778认证,不间断电源系统ul1778认证 UL认证-不间断电源系统ul1778认证范围: 不间断电源系统:UPS即不间断电源(Uninterruptible Power Supply),是一种含有储能装置的不间断电源。主要用于给部分对电源稳定性要求较高的设…

JavaScript与jQuery(上篇)

JavaScript与jQuery笔记(上篇) 一、引入JavaScript二、快速入门三、数据类型快速过一遍四、严格检查模式strict五、详解字符串六、数组详解七、对象详解八、流程控制,判断,循环九、Map、Set集合(ES6才出来的&#xff…

FD1257H 带有嵌入式霍尔传感器的智能电机驱动器芯片

FD1257H 带有嵌入式霍尔传感器的智能电机驱动器芯片 特征 电机驱动器与集成霍尔传感器 锁关闭保护和自动重启功能 精确的磁开关阈值 “软开关“相位切换技术,以减少振动和声噪声 热关闭保护 可在SIP-4L包 为12V系统 一般说明 FD1257H是一个嵌入式霍尔传感器的单线圈…

帆软FineReport决策报表Tab实现方案

最近有个需求是要做首页展示,为了减少前端工作量,利用采购的帆软FineReport来实现,记录过程,方便备查。 需求 做个Tab页,实现多个页切换。 方案一、利用帆软自带切换 帆软自带的有Tab控件,可实现切换&a…

多线程案例(1) - 单例模式

目录 单例模式 饿汉模式 懒汉模式 前言 多线程中有许多非常经典的设计模式(这就类似于围棋的棋谱),这是用来解决我们在开发中遇到很多 "经典场景",简单来说,设计模式就是一份模板,可以套用。…

江西服装学院图书馆藏《乡村振兴战略下传统村落文化旅游设计》许少辉八一新著

江西服装学院图书馆藏《乡村振兴战略下传统村落文化旅游设计》许少辉八一新著

浅谈C++|STL之string篇

一.string的基本概念 本质 string是C风格的字符串,而string本质是一个字符串 string和char * 区别 char * 是一个指针string是一个类,类内部封装了char *,管理这个字符串,是一个char * 型容器。 特点 string类内部封装了很多成…

Unity技术手册-UGUI零基础详细教程-Canvas详解

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列点击跳转>蓝桥系列 👉关于作者 专注于Android/Unity和各种游…

1275MPaMJ螺纹螺栓 最新标准 学习记录

声明 本文是学习GB-T 42850-2023 1275MPaMJ螺纹螺栓. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 10 min~15 min。 A.1.5.8 水冲洗 表面清理后迅速将零件放在21℃~93℃自来水中冲洗,自来水应符合GB5749 的要求。 A.1.6 表…

【qiankun乾坤】从0到1搭建微前端

微前端是一种将一个大型单体应用拆分成多个小型应用的架构方式。它可以让不同的团队独立开发部署自己的应用,同时这些应用可以集成到一个统一的底座应用中,对用户来说就是一个完整的应用。 qiankun 是阿里开源的一个微前端实现框架,可以帮助我们比较容易地实现微前端架构。 下…

Linux中执行bash脚本报错/bin/bash^M: bad interpreter: No such file or directory

文章目录 参考博客: Linux中执行bash脚本报错/bin/bash^M: bad interpreter: No such file or directory 首先在此对这位博主表示感谢。 运行bash脚本会出现两个文件,1037.err和1037.out。 1037.err的文件内容如下: /data/home/user12/.lsbat…

5.11.Webrtc接口的设计原理

在上节课中呢,我向你介绍了web rtc的接口宏,那有很多同学会产生疑问啊,那觉得web rtc为什么要把接口设计的这么复杂?还非要通过宏来实现一个代理类,再通过代理类来调用到web rtc内部。 那为什么要这么设计呢&#xf…