嵌入式
文章平均质量分 81
木士易
不考虑今天,何来未来
展开
-
语音芯片WTW-28P 应用电路
采用 DC3.3V 供电时,可以直接短接 VDD 跟 VCC,采用 DC5V 供电时,VDD 端接 5V,VCC 端需要从 VDD 端串接两个二极管以提供工作电压。采用 DC3.3V 供电时,可以直接短接 VDD 跟 VCC,采用 DC5V 供电时,VDD 端接 5V,VCC 端需要从 VDD 端串接两个二极管以提供工作电压。采用 DC3.3V 供电时,可以直接短接 VDD 跟 VCC,采用 DC5V 供电时,VDD 端接 5V,VCC 端需要从 VDD 端串接两个二极管以提供工作电压。原创 2023-04-03 09:09:15 · 914 阅读 · 0 评论 -
WT588D-20SS 应用电路
采用 DC3.3V 供电时,可以直接短接 VDD 跟 VCC,采用 DC5V 供电时,VDD 端接 5V,VCC 端需要从 VDD 端串接两个二极管以提供工作电压。采用 DC3.3V 供电时,可以直接短接 VDD 跟 VCC,采用 DC5V 供电时,VDD 端接 5V,VCC 端需要从 VDD 端串接两个二极管以提供工作电压。采用 DC3.3V 供电时,可以直接短接 VDD 跟 VCC,采用 DC5V 供电时,VDD 端接 5V,VCC 端需要从 VDD 端串接两个二极管以提供工作电压。原创 2023-03-30 13:30:30 · 622 阅读 · 0 评论 -
Linux ITIMER_REAL 3 个内部间隔计时器
真实间隔定时器(ITIMER_REAL):这种间隔定时器在启动后,不管进程是否运行,每个时钟滴答都将其间隔计数器减1。当减到0值时,内核向进程发送SIGALRM信号。结构类型task_struct中的成员it_real_incr则表示真实间隔定时器的间隔计数器的初始值,而成员it_real_value则表示真实间隔定时器的间隔计数器的当前值。由于这种间隔定时器本质上与上一节的内核定时器时一样的,因此Linux实际上是通过real_timer这个内嵌在task_struct结构中的内核动态定时器来实现真...原创 2022-07-01 09:23:44 · 642 阅读 · 0 评论 -
嵌入式操作系统FreeRTOS:低功耗 Tickless 模式
很多应用场合对于功耗的要求很严格,比如长期无人照看的数据采集仪器,可穿戴设备等。其实很多 MCU 都有相应的低功耗模式,以此来降低设备运行时的功耗,进行裸机开发的时候就可以使用这些低功耗模式。但是现在我们要使用操作系统,因此操作系统对于低功耗的支持也显得尤为重要,这样硬件与软件相结合,可以进一步降低系统的功耗。这样开发也会方便很多,毕竟系统已经原生支持低功耗了,我们只需要按照系统的要求来做编写相应的应用层代码即可。FreeRTOS 提供了一个叫做 Tickless 的低功耗模式。原创 2022-02-16 13:39:49 · 1759 阅读 · 0 评论 -
嵌入式Linux设备驱动中断下文之工作队列
工作队列(workqueue) 是实现中断下文的机制之一, 是一种将工作推后执行的形式。tasklet 也是实现中断下文的机制。 他们俩个最主要的区别是 tasklet不能休眠, 而工作队列是可以休眠的。 所以, tasklet 可以用来处理比较耗时间的事情, 而工作队列可以处理非常复杂并且更耗时间的事情。原创 2022-01-25 10:05:44 · 1012 阅读 · 0 评论 -
嵌入式Linux 阻塞和非阻塞 IO 驱动设备访问模式
阻塞和非阻塞 IO 是 Linux 驱动开发里面很常见的两种设备访问模式, 在编写驱动的时候一定要考虑到阻塞和非阻塞。原创 2022-01-25 09:03:57 · 450 阅读 · 0 评论 -
嵌入式Linux 中断下文之 tasklet
中断的上下文与进程上下文并没有什么瓜葛, 当执行一个中断处理函数时, 内核处于中断上下文。 由于中断相当于打断了当前执行的程序, 而且中断也没有后备的进程, 所以中断上下文不可以睡眠( 注意某些函数会睡眠) , 中断处理也必须做到迅捷, 有一定的时限要求。原创 2022-01-24 09:23:33 · 453 阅读 · 0 评论 -
嵌入式Linux 中断实验
在 Linux 下的驱动实验中, 中断是频繁使用的功能, Linux 内核提供了完善的中断框架, 我们只需要使用内核提供的函数, 便可以方便的使用中断功能。原创 2022-01-24 08:57:29 · 1615 阅读 · 0 评论 -
物联网MQTT简单介绍
物联网曾被认为是继计算机、互联网之后,信息技术行业的第三次浪潮。随着基础通讯设施的不断完善,尤其是 5G 的出现,进一步降低了万物互联的门槛和成本。物联网本身也是 AI 和区块链应用很好的落地场景之一,各大云服务商也在纷纷上架物联网平台和服务。原创 2022-01-23 17:44:59 · 14875 阅读 · 0 评论 -
嵌入式模块化编程、驱动分离的重要性
引言当项目小组做一个相对较复杂的工程时,意味着你不再独自单干。而是和小组成员分工合作,这就要求小组成员各自负责一部分工程。比如你可能只是负责通讯或者显示这一块。这个时候,你就应该将自己的这一块程序写成一个模块,单独调试,留出接口供其它模块调用。最后,小组成员都将自己负责的模块写完并调试无误后,由项目组长进行组合调试。像这些场合就要求程序必须模块化。模块化的好处是很多的,不仅仅是便于分工,它还有助于程序的调试,有利于程序结构的划分,还能增加程序的可读性和可移植性。要说的话初学者往往搞不原创 2022-01-23 17:33:46 · 111 阅读 · 0 评论 -
嵌入式Linux Pinctrl 子系统和 GPIO 子系统
大多数 SOC 的 PIN 都是支持复用的, 比如 I.MX6ULL 的 GPIO1_IO03 既可以作为普通的 GPIO 使用,也可以作为 I2C1 的 SDA 等等。 此外我们还需要配置 pin 的电气特性, 比如上/下拉、 速度、 驱动能力等等。 传统的配置 pin 的方式就是直接操作相应的寄存器, 但是这种配置方式比较繁琐、 而且容易出问题(比如 pin 功能冲突)。原创 2022-01-22 11:20:18 · 1408 阅读 · 0 评论 -
嵌入式Linux设备树下的 platform 驱动
Linux 系统中 platform 平台框架包括总线、 设备和驱动, 其中总线不用我们去操心, Linux 内核中会自动管理, 我们只需要关系设备和驱动如何实现。 在不支持设备树的内核中, 我们需要分别实现platform_device 和 platform_driver, 其中 platform_device 是在平台文件中实现的。 在支持设备树的内核中,我们就不用实现 platform_device 了, 而是在设备树文件中添加设备信息。 下面看一下在设备树文件中添加设备信息。原创 2022-01-22 10:59:21 · 1339 阅读 · 1 评论 -
嵌入式Linux设备树常用 of 函数
设备树描述了设备的详细信息, 这些信息包括数字类型的、 字符串类型的、 数组类型的, 我们在编写驱动的时候需要获取到这些信息。 比如设备树使用 reg 属性描述了某个外设的寄存器地址为 0X02005482,长度为 0X400, 我们在编写驱动的时候需要获取到 reg 属性的 0X02005482 和 0X400 这两个值, 然后初始化外设。 Linux 内核给我们提供了一系列的函数来获取设备树中的节点或者属性信息, 这一系列的函数都有一个统一的前缀“ of_” , 所以在很多资料里面也被叫做 OF 函数。原创 2022-01-21 14:35:26 · 972 阅读 · 0 评论 -
嵌入式Linux添加设备树节点
查看设备树节点方法以 imx6ull 开发板为例, 打开内核源码 linux-imx-rel_imx_4.1.15_2.1.0_ga/arch/arm/boot/dts 目录,输入命令编辑设备树文件 vim imx6ull-14x14-evk.dts。打开文件后, 我首先找到根节点, 如下图所示:在根节点的末尾准备添加设备节点, 那么怎么来验证自己添加设备节点成功了呢?设备树可以在 linux 系统里面以文件或者是目录的形式表示出来, 这里有两种方法。方法一, 进入到开发板的/proc/dev原创 2022-01-21 13:57:08 · 4354 阅读 · 0 评论 -
Linux 设备树
要想了解为什么会有设备树, 设备树是怎么来的, 我们就要先来回顾一下在没有设备树之前我们是怎么来写一个驱动程序的。 以字符设备驱动代码框架为例, 我们一起来回顾下。原创 2022-01-20 11:17:52 · 2983 阅读 · 0 评论 -
嵌入式Linux Platform 设备驱动 设备驱动分层和分离
在面向对象的程序设计中, 可以为某一类相似的事物定义一个基类, 而具体的事物可以继承这个基类中的函数。 如果对于继承的这个事物而言, 其某函数的实现与基类一致, 那它就可以直接继承基类的函数;相反, 它可以重载之。 这种面向对象的设计思想极大地提高了代码的可重用能力, 是对现实世界事物间关系的一种良好呈现。原创 2022-01-20 10:45:43 · 670 阅读 · 0 评论 -
嵌入式中的强符号和弱符号__attribute__
__attribute__ 是一个编译器指令,其实是 GNU C 的一种机制,本质是一个编译器的指令,在声明的时候可以提供一些属性,在编译阶段起作用,来做多样化的错误检查和高级优化。原创 2022-01-19 09:08:09 · 340 阅读 · 0 评论 -
嵌入式Linux字符设备和杂项设备总结
字符设备是 3 大类设备(字符设备、 块设备和网络设备) 中的一类, 其驱动程序完成的主要工作是初始化、 添加和删除 cdev 结构体, 申请和释放设备号, 以及填充 file_operations 结构体中的操作函数, 实现file_operations 结构体中的 read() 、 write() 和 ioctl() 等函数是驱动设计的主体工作。原创 2022-01-18 10:05:43 · 185 阅读 · 0 评论 -
嵌入式Linux字符设备自动创建设备节点
Linux 驱动实验中, 当我们通过 insmod 命令加载模块后, 还需要通过 mknod 命令来手动创建设备节点, 这样使用起来太麻烦了, 并且不可能每个设备都去这样操作, Linux 系统的存在就是为了方便使用, 所以我们来看一下如何实现自动创建设备节点, 当加载模块时, 在/dev 目录下自动创建相应的设备文件。怎么自动创建一个设备节点呢? 在嵌入式 Linux 中使用 mdev 来实现设备节点文件的自动创建和删除。原创 2022-01-18 09:53:35 · 1296 阅读 · 0 评论 -
嵌入式Linux驱动模块注册字符类设备
在 Linux 内核中, 使用 cdev 结构体描述一个字符设备原创 2022-01-17 09:35:56 · 510 阅读 · 0 评论 -
嵌入式Linux驱动模块注册字符设备号
Linux 的设备管理是和文件系统紧密结合的, 各种设备都以文件的形式存放在/dev 目录下, 称为设备文件。 应用程序可以打开、 关闭和读写这些设备文件, 完成对设备的操作, 就像操作普通的数据文件一样。为了管理这些设备, 系统为设备编了号, 每个设备号又分为主设备号和次设备号。 主设备号用来区分不同类型的设备, 而次设备号用来区分同一类型的多个设备。原创 2022-01-17 09:08:44 · 365 阅读 · 0 评论 -
关于CAN通讯基础知识点
在学习CAN总线时,经常会看到CAN总线的电平分为显性电平与隐性电平,那何为显性,何为隐性呢?显性、隐性与逻辑0、逻辑1又有什么样的对应关系呢?CAN通讯逻辑0与1,显性与隐性电信号的传输在物理层面都是靠电压高低区分来实现的,CAN通信也一样。CAN总线的两条信号线被称为CAN高(CAN_H)和CAN低(CAN_L),关于CAN的逻辑0、逻辑1和CAN总线的显性与隐性,整理了如下图表帮助大家有个清晰的认识。 CAN_H CAN_L CAN_diff ...原创 2022-01-15 10:26:40 · 6488 阅读 · 0 评论 -
几种流行的 IoT 物联网传感器
物联网传感器的类型很多,应用和用例的数量更多。以下是10种比较流行的物联网传感器类型及其一些用例。原创 2022-01-14 13:01:26 · 2920 阅读 · 0 评论 -
嵌入式状态机编程简介
状态机是一个这样的东东:状态机(state machine)有 5 个要素,分别是状态(state)、迁移(transition)、事件(event)、动作(action)、条件(guard)。原创 2022-01-14 09:15:55 · 292 阅读 · 0 评论 -
Linux文件 IO 和标准 IO简介
文件 IO 是 Linux 系统提供的接口, 针对文件和磁盘进行操作, 不带缓存机制; 标准 IO 是 C 语言函数库里的标准 I/O 模型, 在 stdio.h 中定义, 通过缓冲区操作文件, 带缓存机制。 Linux 系统中一切皆文件, 包括普通文件, 目录, 设备文件(不包含网络设备) , 管道, fifio 队列, socket 套接字等, 在终端输入“ls -l”可查看文件类型和权限。原创 2022-01-12 11:23:07 · 2366 阅读 · 0 评论 -
嵌入式Linux交叉编译器的安装和使用
如果想在 ARM 上运行, 就要使用 ARM 的编译器, 然后在 X86 上进行编译。 因为使用 ARM 的编译器编译完了之后, 是把可执行程序放到开发板上来运行, 而不是在 PC 上运行的, 这个过程可以把它理解成交叉, 然后再和编译器结合起来就叫做交叉编译器。原创 2022-01-12 09:18:00 · 1436 阅读 · 1 评论 -
makefile 基本语法
Makefile就是描述了整个工程编译连接等规则的文件。我们在终端输入完make命令之后,调用make工具,make就会在当前目录按照文件名就会找makefile文件,Makefile的命名必须是makefile或Makefile,m大写小写都是可以的。原创 2022-01-10 14:27:04 · 1178 阅读 · 0 评论 -
嵌入式Linux 用户层和内核层交互
Linux 一切皆文件! 驱动文件最终通过与文件操作相关的系统调用或者 C 库函数(本质也是系统调用)被访问, 而设备驱动的结构最终也是为了迎合提供给应用程序的 API。(在 Windows编程领域, 习惯称操作系统的接口为 API) 。原创 2022-01-07 16:26:02 · 1533 阅读 · 1 评论 -
嵌入式Linux misc 设备驱动
于linux 驱动倾向于分层设计, 所以每个具体的设备都可以找到它归属的类型, 从而可以套到它相应的架构里面去, 我们只需要实现它最底层的那部分。 但是也有部分字符设备, 确实不知道它属于哪种类型, 一般推荐大家采用 miscdevice 的框架结构。原创 2022-01-07 15:23:51 · 2023 阅读 · 0 评论 -
嵌入式Linux驱动模块编译进内核
Linux 驱动开发者需要牢固地掌握 Linux 内核的编译方法以为嵌入式系统构建可运行的 Linux 操作系统映像。 在编译内核时, 需要配置内核原创 2022-01-07 14:42:49 · 1698 阅读 · 0 评论 -
嵌入式Linux字符设备和杂项设备总结
字符设备是 3 大类设备(字符设备、 块设备和网络设备) 中的一类, 其驱动程序完成的主要工作是初始化、 添加和删除 cdev 结构体, 申请和释放设备号, 以及填充 file_operations 结构体中的操作函数, 实现file_operations 结构体中的 read() 、 write() 和 ioctl() 等函数是驱动设计的主体工作。原创 2022-01-07 14:24:55 · 748 阅读 · 0 评论 -
嵌入式Linux字符设备号简介
Linux 的设备管理是和文件系统紧密结合的, 各种设备都以文件的形式存放在/dev 目录下, 称为设备文件。 应用程序可以打开、 关闭和读写这些设备文件, 完成对设备的操作, 就像操作普通的数据文件一样。为了管理这些设备, 系统为设备编了号, 每个设备号又分为主设备号和次设备号。 主设备号用来区分不同类型的设备, 而次设备号用来区分同一类型的多个设备。原创 2022-01-07 10:32:18 · 1253 阅读 · 0 评论 -
嵌入式Linux驱动模块传参简介
在装载内核模块时, 用户可以向模块传递参数, 形式为“insmode(或 modprobe) 模块名参数名=参数值” , 如果不传递, 参数将使用模块内定义的缺省值。 如果模块被内置, 就无法 insmod 了, 但是 bootloader可以通过在 bootargs 里设置“模块名.参数名=值” 的形式给该内置的模块传递参数。原创 2022-01-07 09:54:30 · 496 阅读 · 0 评论 -
Linux物理地址与虚拟地址简介
目前, 大多数嵌入式微控制器(如 ARM、 PowerPC 等) 中并不提供 I/O 空间, 而仅存在内存空间。 内存空间可以直接通过地址、 指针来访问, 程序及在程序运行中使用的变量和其他数据都存在于内存空间中。原创 2022-01-06 18:58:10 · 1468 阅读 · 0 评论 -
linux 设备驱动分类及特点
计算机系统的硬件主要由 CPU、 存储器和外设组成。 随着 IC 制作工艺的发展, 目前, 芯片的集成度越来越高, 往往在 CPU 内部就集成了存储器和外设适配器。 譬如, 相当多的 ARM、 PowerPC、 MIPS 等处理器都集成了 UART、 I2C 控制器、 SPI 控制器、 USB 控制器、 SDRAM 控制器等, 有的处理器还集成了 GPU(图形处理器) 、 视频编解码器等。 驱动针对的对象是存储器和外设(包括 CPU 内部集成的存储器和外设, 而不是针对 CPU 内核。 Li...原创 2022-01-06 17:49:45 · 530 阅读 · 0 评论 -
linux 设备驱动开发基本概念
任何一个计算机系统的运转都是系统中软硬件共同努力的结果, 没有硬件的软件是空中楼阁, 而没有软件的硬件则只是一堆废铁。 硬件是底层基础, 是所有软件得以运行的平台, 代码最终会落实为硬件上的组合逻辑与时序逻辑; 软件则实现了具体应用, 它按照各种不同的业务需求而设计, 并完成用户的最终诉求。 硬件较固定, 软件则很灵活, 可以适应各种复杂多变的应用。 因此, 计算机系统的软硬件相互成就了对方。原创 2022-01-06 17:32:48 · 1580 阅读 · 0 评论 -
Linux进程间通信:消息队列
System V IPC 包含三种进程间通信机制, 有消息队列, 信号灯(也叫信号量) , 共享内存。 此外还有 SystemV IPC 的补充版本 POSIX IPC, 这两组 IPC 的通信方法基本一致, 本章以 System V IPC 为例介绍 Linux 进程通信机制。原创 2022-01-06 11:19:51 · 569 阅读 · 0 评论 -
Linux进程间通信:共享内存
共享内存, 顾名思义就是允许两个不相关的进程访问同一个逻辑内存, 共享内存是两个正在运行的进程之间共享和传递数据的一种非常有效的方式。 不同进程之间共享的内存通常为同一段物理内存。 进程可以将同一段物理内存连接到他们自己的地址空间中, 所有的进程都可以访问共享内存中的地址。 如果某个进程向共享内存写入数据, 所做的改动将立即影响到可以访问同一段共享内存的任何其他进程。原创 2022-01-06 11:02:29 · 643 阅读 · 0 评论 -
Linux进程间通信:信号讲解
信号发送 信号是 Linux 系统响应某些条件而产生的一个事件, 接收到该信号的进程会执行相应的操作。信号的产生有三种方式:1)由硬件产生, 如从键盘输入 Ctrl+C 可以终止当前进程2)由其他进程发送, 如可在 shell 进程下, 使用命令 kill -信号标号 PID, 向指定进程发送信号。3)异常, 进程异常时会发送信号 本篇只关注在应用层对信号的处理。 在 Ubuntu 终端输入 kill -l, 查看所有的信号。1) SIGHUP 2) SIGINT...原创 2022-01-06 10:37:08 · 310 阅读 · 0 评论 -
Linux有名管道与无名管道简介
无名管道无名管道是最古老的进程通信方式, 有如下两个特点:1. 只能用于有关联的进程间数据交互, 如父子进程, 兄弟进程, 子孙进程, 在目录中看不到文件节点, 读写文件描述符存在一个 int 型数组中。2. 只能单向传输数据, 即管道创建好后, 一个进程只能进行读操作, 另一个进程只能进行写操作,读出来字节顺序和写入的顺序一样。函数 int pipe(int pipefd[2]) 头文件 #include <unistd.h> 参数 pipefd[2] 一原创 2022-01-06 09:40:13 · 931 阅读 · 1 评论