嵌入式硬件库的基本操作方式与分析

这篇具有很好参考价值的文章主要介绍了嵌入式硬件库的基本操作方式与分析。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本次要介绍的开源软件是 c-periphery:

https://github.com/vsergeev/c-periphery

一个用 C 语言编写的硬件外设访问库。

嵌入式硬件库的基本操作方式与分析,单片机项目实战操作之优秀,log4j,jvm,linux

我们可以用它来读写 Serial、SPI、I2C 等,非常适合在嵌入式产品上使用。

我们可以基于它优秀的代码框架,不断地扩展出更多的功能模块,最终形成自己产品适用的 Linux 硬件抽象层。


源文件:

$ tree .
├── src
│   ├── gpio.c
│   ├── gpio.h
│   ├── i2c.c
│   ├── i2c.h
│   ├── led.c
│   ├── led.h
│   ├── mmio.c
│   ├── mmio.h
│   ├── pwm.c
│   ├── pwm.h
│   ├── serial.c
│   ├── serial.h
│   ├── spi.c
│   ├── spi.h
│   ├── version.c
│   └── version.h

约 4500 行代码,每个硬件模块的代码都是相对独立,上手难度小。
 

能收获什么?
1、降低硬件编程的门槛;

2、了解 Linux 应用层如何访问 GPIO / I2C / SPI / PWM 等硬件;

3、了解如何对硬件外设进行封装,并提供良好的 API;

4、了解如何将代码封装成库;

5、了解如何为代码编写单元测试程序;

c-periphery 很好地示范了如何在 Linux 平台上进行硬件编程,定义出来的接口即丰富又实用。

另外,它最终输出的是静态库 libperiphery.a,并且为每一个硬件模块功能都编写了单元测试代码,代码质量有保障。
 

c-periphery 的用法

简单例子

我们以最常见的串口读写为例:

int main(void)
{
    serial_t *serial;
    uint8_t s[] = "Hello World!";
    uint8_t buf[128];
    int ret;

    serial = serial_new();

    /* Open /dev/ttyUSB0 with baudrate 115200, and defaults of 8N1, no flow control */
    if (serial_open(serial, "/dev/ttyUSB0", 115200) < 0) {
        fprintf(stderr, "serial_open(): %s\n", serial_errmsg(serial));
        exit(1);
    }

    /* Write to the serial port */
    if (serial_write(serial, s, sizeof(s)) < 0) {
        fprintf(stderr, "serial_write(): %s\n", serial_errmsg(serial));
        exit(1);
    }

    /* Read up to buf size or 2000ms timeout */
    if ((ret = serial_read(serial, buf, sizeof(buf), 2000)) < 0) {
        fprintf(stderr, "serial_read(): %s\n", serial_errmsg(serial));
        exit(1);
    }
    printf("read %d bytes: _%s_\n", ret, buf);
    serial_close(serial);
    serial_free(serial);

    return 0;
}

serial_t 是对串口设备的抽象;

serial_new() 用于创建一个串口设备, 这里只是申请了数据,使用完毕后, 要通过 serial_free() 将其释放掉。

serial_open() 用于初始化串口,设置设备节点、波特率等; 相应地,用 serial_close() 可以关闭串口。

serial_write() 用于给串口发数据,模仿了系统调用 write()。

serial_read() 用于从串口读数据,比系统调用 read() 多了一个 timeout_ms 的参数,有了超时机制后,至少可以避免程序一直阻塞。

这就是一个最简单的基于 c-periphery 的串口示例。即便是嵌入式初学者,基于这些接口,也能轻松地读写串口了。
 

另外,这里只用到了最常用的几个 API。对于串口模块,c-periphery 还有很多实用的 API:

嵌入式硬件库的基本操作方式与分析,单片机项目实战操作之优秀,log4j,jvm,linux


比较有意思的几个 API:

serial_poll() 类似 select(),用于监控串口是否有数据,避免死等;

serial_get/set_xxx() 用于读写串口的属性;

serial_fd() 用于获取文件描述符,有了 fd 就意味这所有 Linux 应用编程的机制都可以使用了。例如我们可以将这个 fd 传递给 libev,然后就能进行事件驱动编程了。
 

c-periphery 的实现

关键数据

c-periphery 里对每个硬件模块封装的方法都是类似,用一个结构体来保存模块所有相关的信息,看下面这几个例子。

Serial:

嵌入式硬件库的基本操作方式与分析,单片机项目实战操作之优秀,log4j,jvm,linux


I2C:

嵌入式硬件库的基本操作方式与分析,单片机项目实战操作之优秀,log4j,jvm,linux


GPIO:

嵌入式硬件库的基本操作方式与分析,单片机项目实战操作之优秀,log4j,jvm,linux


它们的成员变量大多都有文件描述符 fd、用于记录错误状态的 errno / error string,然后再加上一些硬件模块特有的成员变量。

最终库的调用者只会看到 serial_t、i2c_t、gpio_t 这种类似描述符的数据类型,使用时不需要关心内部细节。

后续我们要添加自己的硬件模块时,可以依葫芦画瓢,模仿着定义出属于该硬件的 xxx_t 结构体,然后一步步地为 c-periphery 扩展出新的功能模块。
 

几个关键 API 的实现

我们以 Serial 为例,看下其核心 API 的实现。


分配与释放:

嵌入式硬件库的基本操作方式与分析,单片机项目实战操作之优秀,log4j,jvm,linux

就是在申请分配和释放 serial_t 的内存。


写数据 serial_write() 就是调用 write(),读数据 serial_read() 则是利用 select() 实现了超时的功能:

嵌入式硬件库的基本操作方式与分析,单片机项目实战操作之优秀,log4j,jvm,linux


serial_poll() 则是使用 poll() 来完成 io 监控。

嵌入式硬件库的基本操作方式与分析,单片机项目实战操作之优秀,log4j,jvm,linux

其他硬件模块的实现都是类似的。

到此,c-periphery 的核心实现代码就拆解完毕了。


为 c-periphery 添加新的硬件模块
学以致用,我们按照 c-periphery 的框架,添加背光 Backlight 功能。

Backlight 的控制方法可以参考这篇文章:一个控制背光的命令行小工具。
 

先定义 backlight_t:

嵌入式硬件库的基本操作方式与分析,单片机项目实战操作之优秀,log4j,jvm,linux

然后再实现好下面这些 API:

嵌入式硬件库的基本操作方式与分析,单片机项目实战操作之优秀,log4j,jvm,linux

API 的具体实现代码就不再这里展示了,因为控制背光无非就是读写 /sys/class/backlight/ 内的文件节点,难度不大。

总结

c-periphery 是一个 C 语言编写的硬件访问库,已支持 Serial、I2C、SPI、MMIO、PWM、GPIO 等硬件。约 4500 行代码,每个硬件模块的代码都是相对独立,上手难度小,非常使用在嵌入式 Linux 平台上使用。

另外,我们可以基于它优秀的代码框架,不断地扩展出自己需要的功能模块,最终形成自己产品专用的 Linux 硬件抽象层,绝对的嵌入式开发的利器。文章来源地址https://www.toymoban.com/news/detail-740379.html

到了这里,关于嵌入式硬件库的基本操作方式与分析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 嵌入式硬件

    嵌入式硬件是一种在电子设备中集成且运行特定程序的硬件。它通常与特定软件应用紧密相关,用于实现一个以上的特定功能,如压缩解压缩、保安服务等。嵌入式系统通常涉及到至少一个控制器(或微控制器)和其他一些外部芯片,例如存储器、输入/输出(I/O)接口、传感

    2024年02月09日
    浏览(48)
  • 嵌入式硬件电路·电平

    目录 1.  电平的概念 1.1  高电平 1.2  低电平 2.  电平的使用场景 2.1  高电平使能 2.2  低电平使能 2.3  失能         电平是指电信号电压的大小或高低状态。在数字电子学中,电平有两种状态,高电平和低电平,用来表示二进制中的1或0。在模拟电子学中,电平可以是一

    2024年02月04日
    浏览(48)
  • 【计算机三级嵌入式】考试自学笔记(三)——嵌入式系统硬件组成、嵌入式处理芯片以及存储器介绍

    常考知识点: 嵌入式最小硬件组成 嵌入式处理芯片 嵌入式系统的存储器 I/O接口及常用I/O设备 ARM内核典型嵌入式处理芯片 嵌入式系统外部通信接口 嵌入式最小硬件系统的组成如下: 嵌入式硬件系统≠嵌入式最小硬件系统 电源电路 :为整个嵌入式系统提供能量 时钟电路 :

    2023年04月12日
    浏览(82)
  • 嵌入式硬件中常见的100种硬件选型方式

    1请列举您知道的电阻、电容、电感品牌(最好包括国内、国外品牌)。 电阻: 美国:AVX、VISHAY 威世 日本:KOA 兴亚、Kyocera 京瓷、muRata 村田、Panasonic 松下、ROHM 罗姆、susumu、TDK 台湾:LIZ 丽智、PHYCOM 飞元、RALEC 旺诠、ROYALOHM 厚生、SUPEROHM 美隆、TA-I 大毅、TMTEC 泰铭、TOKEN德键

    2024年02月06日
    浏览(48)
  • 嵌入式硬件设计与实践(从硬件到产品)

    【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】         很多同学会画电路板,也会写固件代码,但是他们做的这项工作很难称之为产品。这中间的原因是多方面的,第一,这些功能不是根据真实需求开发的;第二,相关功能使用的芯片供

    2023年04月17日
    浏览(36)
  • 嵌入式硬件和软件哪个好?

    嵌入式硬件和软件哪个好? 嵌入式软硬件工程师哪个更有前途呢?一起来看看。 嵌入式是分为软硬件工程师的,首先我们先来看看嵌入式硬件工程师吧! 嵌入式硬件开发工程师主要编写嵌入式系统硬件总体方案和详细方案,要求理解嵌入式系统架构,有一定的C语言基础,熟悉

    2024年02月04日
    浏览(53)
  • 嵌入式硬件基础知识——1

    目录 SOC、MCU、MPU、CPU SPI STM32的时钟系统 can是什么 串口和并口 传感器输出引脚高阻抗好还是低阻抗好? iic 运算放大器特点 MOS管和三极管 同步电路和异步电路         SOC 片上系统  手机的核心芯片         MCU 微控系统  单片机         MPU 嵌入式微处理器    

    2024年02月05日
    浏览(47)
  • 嵌入式硬件电路学习之阻抗

    阻抗(Impedance)是指电路中交流电源施加电压后,电路元件对电流的阻碍程度。它是一个由幅值和相位角组成的复数。 阻抗是交流电路中电阻、电感、电容等元件共同表现出来的电学量,表示为 $Z$。它随输入信号的频率而变化,用复数形式表示。 对于包含电阻 $R$、电感 $

    2024年02月03日
    浏览(43)
  • 嵌入式硬件需要过哪几关?

    目标是成为一名硬件工程师,用电烙铁和电路板一统江湖,游戏共有九关。 你要有一定的基础,模电,数电这些都得会一些。一般科班出身的专业有电信,通信,自动化等等。 你如果完全没这些基础,连电阻,电容都不认识,那就需要在这关待上很久啦。 模电数电不用太纠

    2024年04月17日
    浏览(40)
  • 嵌入式硬件:proteus仿真放大电路

    在设计放大器电路时,需要用到仿真软件进行辅助。这里采用proteus,如下图简单的同向放大电路。 proteus自带的ANALOG库包括ADI公司几乎所有的放大器元件,很方便我们使用,如下图: 在仿真软件中,如果采用单电源进行供电,则按如下电路图: 这是一个简单的同向放大电路

    2024年02月11日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包