主页

cmake之函数

函数 添加函数 为每个源文件添加 __FILENAME__ 宏 # utils.cmake #重新定义当前目标的源文件的 __FILENAME__ 宏 function(redefine_file_macro targetname) #获取当前目标的所有源文件 get_target_property(source_files "${targetname}" SOURCES) #遍历源文件 foreach(sourcefile ${source_files}) #获取当前源文件的编译参数 get_property(defs SOURCE "${sourcefile}" PROPERTY COM...

阅读更多

msys2环境下使用外部mingw64编译器

电脑环境 Windows 10 msys2 QT5.14.2 mingw64(已安装) 步骤 安装 msys2 下载安装包 https://www.msys2.org/ 运行安装包,选择安装目录,默认安装即可 配置 msys2 运行 msys2,输入 pacman -Syu 更新软件包 安装常用软件包:pacman -S git zsh vim tree make autoconf automake libtool 安装 mingw64 编译器:pacman -S mingw-w64-x86_64-toolchain 注意:如果要使用外部编...

阅读更多

ubuntu下交叉编译tinyalsa

环境 Ubuntu 20.04.2 LTS tinyalsa-2.0.0 下载源码 Github https://github.com/tinyalsa/tinyalsa 解压 tar -xvf tinyalsa-2.0.0.tar.bz2 编译源码 添加交叉编译配置 # vim toolchain_arm_linux_gcc.cmake # 设置C和C++编译器路径 set(CMAKE_C_COMPILER "/usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-gcc") set(CMAKE_C...

阅读更多

ubuntu下交叉编译alsa-lib和alsa-utils

环境 Ubuntu 20.04.2 LTS alsa-lib-1.2.2 alsa-utils-1.2.2 下载源码 官网https://www.alsa-project.org 解压 tar -xvf alsa-lib-1.2.2.tar.bz2 tar -xvf alsa-utils-1.2.2.tar.bz2 安装依赖 sudo apt install -y build-essential gcc g++ cmake libxkbcommon-x11-dev libgl1-mesa-dev libglu1-mesa-dev libfontconfig1-dev libmysqlclient-dev l...

阅读更多

ubuntu下编译QT

环境 Ubuntu 20.04.2 LTS Qt 5.14.2 下载源码 官网https://download.qt.io/archive/qt/ 完整路径https://download.qt.io/archive/qt/5.14/5.14.2/single/qt-everywhere-src-5.14.2.tar.xz 解压 # 注意解压路径不要有中文 tar -xvf qt-everywhere-src-5.14.2.tar.xz 安装依赖 sudo apt install -y build-essential gcc g++ cmake libxkbcommon-x11-dev libgl1-mesa-dev lib...

阅读更多

音频调试相关

概述 音频调试是在开发过程中对Android系统中的音频功能进行故障排除和优化的重要步骤。通过调试音频相关的问题,可以确保音频功能的正常运行,并提供更好的用户体验。本文将介绍一些常见的音频调试方法和工具,以及在Android系统中进行音频调试的一般流程。 Android framework Android framework是Android系统中的一个重要组成部分,它提供了访问音频硬件和实现音频功能的接口和类。在进行音频调试时,可以利用Android framework提供的工具和方法来诊断和解决问题。 APM日志 adb shell setprop log.tag.APM_AudioPolicyManager V dumpsys dumpsys media.audio_...

阅读更多

C++11新特性之type_traits

概述 C++11中的type_traits是一个模板元编程库,它提供了一些模板类和模板函数,用于在编译期间进行类型信息的查询和转换。它可以帮助我们编写更加通用和可靠的代码,避免了很多运行时类型检查和转换的开销。 中文官方网址 zh.cppreference 头文件 #include <type_traits> 基本类型特性 以下模板类和函数用于判断基本类型的特性: 模板类/函数 描述 std::is_void 是否为void类型 std::is_integral 是否为整数类型 std...

阅读更多

代码格式化工具clang-format的安装和使用

简介 clang-format是一个由LLVM项目提供的代码格式化工具,可以自动化地格式化C、C++、Objective-C、Java、JavaScript和Protobuf等语言的代码。它可以根据自定义的风格规则,将代码自动格式化成统一的风格,提高代码的可读性和可维护性。 安装 Linux 在Linux系统中,我们可以使用包管理工具来安装clang-format。 在Debian/Ubuntu系统中,可以使用以下命令安装: sudo apt-get update sudo apt-get install clang-format 在Fedora系统中,可以使用以下命令安装: sudo dnf install clang-tools-extra macOS 在m...

阅读更多

Linux驱动开发之I2C体系

体系概述 I2C(Inter-Integrated Circuit)是一种串行通信协议,用于在芯片之间进行通信。Linux内核支持I2C总线,可以通过I2C总线访问连接到系统的各种设备,如温度传感器、加速度计、数字电压计等。 在Linux内核中,I2C体系由以下几个部分组成: I2C核心代码:I2C核心提供了I2C总线驱动和设备驱动的注册、注销方法,I2C通信方法(即Algorithm)上层的与具体适配器无关的代码以及探测设备、检测设备地址的上层代码等 I2C总线驱动程序:I2C总线驱动程序负责管理I2C总线的物理层和数据链路层,实现I2C总线的读写操作。I2C总线驱动主要包含I2C适配器数据结构i2c_adapter、I2C适配器的Algor...

阅读更多

Linux驱动开发之输入设备驱动

概述 输入设备(如按键、键盘、触摸屏、鼠标等)是典型的字符设备,其一般的工作机理是底层在按键、触摸等动作发送时产生一个中断(或驱动通过Timer定时查询),然后CPU通过SPI、I2C或外部存储器总线读取键值、坐标等数据,并将它们放入一个缓冲区,字符设备驱动管理该缓冲区,而驱动的read()接口让用户可以读取键值、坐标等数据。 显然,在这些工作中,只是中断、读键值/坐标值是与设备相关的,而输入事件的缓冲区管理以及字符设备驱动的file_operations接口则对输入设备是通用的。基于此,内核设计了输入子系统,由核心层处理公共的工作。Linux内核输入子系统的框架如下图所示。 输入核心提供了底层输入设备驱动程序所需的API,如分配/释放一个输入设备: struct inpu...

阅读更多

Linux驱动开发之misc设备驱动

概述 misc设备驱动是Linux内核中的一种特殊类型的驱动程序,它用于管理那些没有与特定硬件设备相关联的设备。这些设备通常是由用户空间的应用程序创建和控制的,例如设备文件/dev/null和/dev/random。 miscdevice本质上也是字符设备,只是在miscdevice核心层的misc_init()函数中,通过register_chrdev(MISC_MAJOR,”misc”,&misc_fops)注册了字符设备,而具体miscdevice实例调用misc_register()的时候又自动完成了device_create()、获取动态次设备号的动作。 miscdevice的主设备号是固定的,MISC_MAJOR定义为10,在Linux内核中,大概可以找到20...

阅读更多

Linux驱动开发之设备驱动模型

概述 Linux的设备驱动模型分为总线、设备和驱动三个实体。这三个实体在内核里的职责分别如下: 总线:负责管理设备和驱动,为设备匹配合适的驱动,为驱动匹配合适的设备。 设备:负责提供硬件资源。 驱动:负责使用设备提供的硬件资源。 总线将设备和驱动联系起来,使得它们之间解耦。 优点 Linux驱动程序模型是先前在内核中使用的所有不同驱动程序模型的统一。它旨在通过将一组数据和操作整合到全局可访问的数据结构中,来扩展基于基础总线来桥接设备驱动程序。这样,不同类型的总线之间就可以有一致性。 统一总线模型包括一组所有总线都具有的公共属性和一组公共回调,如总线探测期间的设备发现、总线关闭、总线电源管理等。通用的设备和桥接接口反映了现代计算机的目标:即执行无缝设备“即插即...

阅读更多

Linux驱动开发之定时器

概述 Linux内核中的定时器是一种机制,用于在特定时间间隔内执行某些操作。它是通过内核中的计时器实现的,计时器会在指定的时间间隔内触发一个中断,这个中断用于启动定时器。定时器通常用于处理周期性任务,例如更新屏幕或处理网络流量。 在Linux内核中,有两种类型的定时器:硬件定时器和软件定时器。硬件定时器是由计算机的硬件设备提供的,例如时钟或定时器芯片。而软件定时器则是由内核代码实现的。 要在Linux内核中使用定时器,您需要编写一个处理程序来处理定时器中断。这个处理程序将在定时器触发时自动调用。处理程序应该执行您想要在定时器触发时执行的任务。例如,如果您想要在每秒钟更新屏幕,您可以编写一个处理程序来更新屏幕,并将它与一个每秒钟触发的定时器关联起来。 定时器编程 软件意义上的定...

阅读更多

Linux驱动开发之中断

概述 所谓中断是指CPU在执行程序的过程中,出现了某些突发事件急待处理,CPU必须暂停当前程序的执行,转去处理突发事件,处理完毕后又返回原程序被中断的位置继续执行。 根据中断的来源,中断可分为内部中断和外部中断,内部中断的中断源来自CPU内部(软件中断指令、溢出、除法错误等,例如,操作系统从用户态切换到内核态需借助CPU内部的软件中断),外部中断的中断源来自CPU外部,由外设提出请求。 根据中断是否可以屏蔽,中断可分为可屏蔽中断与不可屏蔽中断(NMI),可屏蔽中断可以通过设置中断控制器寄存器等方法被屏蔽,屏蔽后,该中断不再得到响应,而不可屏蔽中断不能被屏蔽。 根据中断入口跳转方法的不同,中断可分为向量中断和非向量中断。采用向量中断的CPU通常为不同的中断分配不同的中断号,当检测...

阅读更多

Linux驱动开发之异步通知

简述 异步通知的意思是:一旦设备就绪,则主动通知应用程序,这样应用程序根本就不需要查询设备状态,这一点非常类似于硬件上“中断”的概念,比较准确的称谓是“信号驱动的异步I/O”。信号是在软件层次上对中断机制的一种模拟,在原理上,一个进程收到一个信号与处理器收到一个中断请求可以说是一样的。信号是异步的,一个进程不必通过任何操作来等待信号的到达,事实上,进程也不知道信号到底什么时候到达。 下图呈现了阻塞I/O,结合轮询的非阻塞I/O及基于SIGIO的异步通知在时间先后顺序上的不同。 信号 信号(signal)是一种异步通知机制,它用于向进程发送通知。内核可以通过向进程发送信号来通知它们发生了某些事件。进程可以通过使用信号处理函数来处理这些信号。在Linux内核中,每个信号都有一个...

阅读更多

Linux驱动开发之阻塞与非阻塞IO

简述 在Linux内核中,I/O操作可以是阻塞或非阻塞的。 阻塞I/O是指进程在进行I/O操作时会一直等待直到操作完成。在这种情况下,进程会被挂起,直到I/O操作完成。这种方式可以确保操作的完整性,但可能会导致进程长时间等待,从而影响应用程序的响应速度。 非阻塞I/O是指进程在进行I/O操作时不会一直等待,而是立即返回。如果I/O操作还没有完成,则进程可以继续执行其他操作。这种方式可以提高应用程序的响应速度,但可能会导致I/O操作不完整或错误。关系如下: 在Linux内核中,可以使用select、poll、epoll等系统调用来实现非阻塞I/O。这些系统调用可以监视多个文件描述符,并在其中任何一个变为“就绪”时通知进程。这样,进程可以在I/O操作完成之前继续进行其他操作,而...

阅读更多

Linux驱动开发之并发控制

概述 并发(Concurrency)指的是多个执行单元同时、并行被执行,而并发的执行单元对共享资源(硬件资源和软件上的全局变量、静态变量等)的访问则很容易导致竞态(Race Conditions)。 在Linux内核中,主要的竞态发生于如下几种情况: 对称多处理器(SMP)的多个CPU 单CPU内进程与抢占它的进程 中断(硬中断、软中断、Tasklet、底半部)与进程之间 解决竞态问题的途径是保证对共享资源的互斥访问,所谓互斥访问是指一个执行单元在访问共享资源的时候,其他的执行单元被禁止访问。访问共享资源的代码区域称为临界区(Critical Sections),临界区需要被以某种互斥机制加以保护.以下是一些实现并发...

阅读更多

Linux驱动开发之字符设备

驱动结构 结构如图: cdev结构体 在Linux内核中,cdev结构体是表示字符设备的结构体之一。字符设备是一种特殊类型的设备,它以字符为单位进行输入和输出,例如终端、串口等。 cdev结构体用于表示字符设备,它包含了所有与该设备相关的信息和属性。cdev结构体定义在头文件<linux/cdev.h>中,其定义如下: struct cdev { struct kobject kobj; struct module *owner; const struct file_operations *ops; struct list_head list; dev_t dev; unsigned int count; }; ...

阅读更多

Linux驱动开发之设备文件

devfs devfs是一种特殊的文件系统,用于在Linux内核中管理设备文件。在早期版本的Linux内核中,设备文件是通过手动创建和管理的,但是随着系统设备数量的增加,这变得越来越困难。 devfs解决了这个问题,它是一种动态的文件系统,可以自动创建和删除设备文件。当一个设备被添加到系统中时,devfs会自动为其创建一个设备文件,并在设备被删除时删除该文件。 devfs的优点包括: 简化设备文件的管理 允许设备文件的动态创建和删除 提高系统的可靠性和稳定性 但是,devfs在现代Linux内核中已经被udev取代,因为udev提供了更多的功能和灵活性。因此,如果您正在使用最新版本的Linux内核,您不需要了解devfs的详细信息。 udev udev是L...

阅读更多

Linux驱动开发之文件系统

简介 Linux系统中采用的文件系统有很多种,以下是一些常用的文件系统: ext4:是Linux系统中使用最广泛的文件系统,支持文件大小高达1EB(EB级别的文件系统尚未被广泛使用)。它支特数据日志和元数据日志,提供了更好的文 件系统稳定性。 XFS:是一种高性能的日志文件系统,适用于大容量文件系统和强烈的/○操作。它支特高速读取和写入,可以处理大量的小文件和大文件 Bts:是一种新的文件系统,支持快照、压缩、多设备、白动修复等功能。它是一个多用途的文件系统,可以适用于很多场景。 NTFS:是一种Windows系统中常用的文件系统,Linux系统中也可以读取和写入NTFS文件系统。但由于其专有技术,Linux系统不能直接使用NTFS文件系统。 FAT32:是一...

阅读更多