自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(30)
  • 资源 (1)
  • 收藏
  • 关注

原创 C/C++读写文件操作

#include <iostream>#include <fstream> #include <string>#include <cstdio>#include <string.h>#include <stdlib.h>#include <stdio.h>using namespace std;int main(int argc, char* argv[]){#if 1 //std IO wri..

2021-11-07 14:10:22 299

原创 ZMQ发布订阅示例代码

【代码】ZMQ发布订阅示例代码。

2023-03-11 22:05:15 291

原创 C++ List使用

【代码】C++ List使用。

2023-03-10 19:43:23 90

原创 给定一个整数数组 nums 和一个整数目标值target,请你在该数组中找出和为目标值target的那两个整数,并返回它们的数组下标。

给定一个整数数组 nums和一个整数目标值target,请你在该数组中找出和为目标值target的那两个整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。你可以按任意顺序返回答案。输入:nums = [2,7,11,15], target = 9输出:[0,1]解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。来源:力扣(LeetCode)链接:https://leetcode.cn/problem.

2022-08-07 21:06:19 6341

原创 使用poll监听可用文件描述符示例代码

使用poll示例代码

2022-07-28 23:03:05 204

原创 cmake如何导入开源项目的动态链接库

cmake_minimum_required(VERSION 2.8.9)set(TARGET_HELLO_APP hello_app)# 设置源代码路径set(HELLO_APP_SOURCES hello.cpp)# 包含外部依赖库的头文件路径include_directories( include include/eigen3 include/glog include/gflags)# 引入外部的依赖库,lib跟CMakeLists.txt同.

2021-11-15 09:47:21 1192

原创 cmake动态库的生成和调用

1. 文件拓朴图.├── bin│ └── main.cpp├── build├── CMakeLists.txt├── include│ ├── add.h│ └── sub.h└── src ├── add.cpp └── sub.cpp2. add.h内容如下:int add(int a, int b);3. add.cpp内容如下:#include "add.h"int add(int a, int b){ retu...

2021-11-11 17:38:03 986

原创 Linux创建进程的流程

Linux系统中提供系统调用fork、vfork、clone的接口用于创建多进程,内核本身创建内核线程的接口是kernel_thread。而它们最终都会调用_do_fork()来创建进程或者内核线程。它们的区别是在于flag的不同,大致的流程如下图所示:_do_fork简要流程...

2020-07-03 23:38:03 629

原创 start_kernel分析总结

从进程的角度分析start_kernel函数,从大的方向可分成三个进程,即:进程0,进程1,进程2。注:其实在内核中是没有进程说法的,在Linux内核中用来描述一个进程或者线程,都是描述为task_struct,即任务。以下方便还是以进程这个说法来描述。进程0:由来:唯一一个没有通过fork或者kernel_thread产生的进程,在内核初始化过程中,进程0则是由静态定义构造出了一个task_struct。职责:1. 初始化内核各个组件,包括mm、vfs、timer、process sched

2020-07-02 23:57:35 260

原创 ALSA架构中DMA的使用

ASoC中的Platform驱动分为两个部分:snd_soc_platform_driver和snd_soc_dai_driver。其中,snd_soc_platform_driver负责管理音频数据,把音频数据通过DMA传送至cpu dai中。注册声卡驱动时候,DMA驱动需要预先设置DMA一致性以及申请playback和capture所需的DMA Buffer。像snd_pcm_ops中的open、hw_params函数是在应用程序进行open("/dev/snd/pcmC0D0p")时,会进行调用。而t

2020-06-22 15:35:54 1306

原创 音频时钟

音频时钟主要由负责编解码器正常工作的主时钟和产生正确的音频播放和捕获采样率数字时钟组成。主时钟每个音频子系统需要由主时钟进行驱动(有时称为MCLK或SYSCLK)。音频的主时钟的来源可以是外部晶振,PLL,CPU时钟,主时钟主要负责产生正确的音频播放和捕获采样率。数字时钟数字音频接口通常由位时钟(通常称为BCLK)进行驱动。BCLK通常用于通过编解码器和CPU之间的链接驱动数字音频数据。数字时钟除了BCLK外,还有帧时钟(LRCLK),以信号通知每个音频帧的开始。 该时钟有时称为LRC(左右时钟

2020-06-17 16:51:01 3051

原创 Digital Audio Interface介绍

ASoC当前支持当今在SoC控制器和便携式音频编解码器中发现的三个主要数字音频接口(DAI),即AC97,I2S和PCM。AC97总线:AC97是五线接口,通常在许多PC声卡上都可以找到。 现在,它在许多便携式设备中也很流行。 该DAI具有一条复位线,并在其SDATA_OUT(播放)和SDATA_IN(捕获)线上进行时间复用。 位时钟(BCLK)始终由编解码器(通常为12.288MHz)驱动,而帧(FRAME)(通常为48kHz)始终由控制器驱动。 每个AC97帧长21uS,分为13个时隙。I2S

2020-06-16 17:20:26 2284

原创 Linux进程调度子系统

学习Linux进程调度子系统,需要合理进程拆分,逐一击破。关于Linux进程调度子系统可以拆分如下五个大方向:一、Tasks1. tasks如何在Linux内核中表示:struct task_struct2. Linux如何在用户态和内核态下分别创建task_struct3. Linux中task_struct相关属性,如调度策略,PID等等二、Scheduler Class1. Linux内核关于进程调度的五种调度算法2. Linux高版本上默认的调度算法三、Scheduler1.

2020-06-16 13:32:26 438 1

原创 虚拟Codec设计思路

虚拟Codec设计思路就是只提供SoC到Codec端的PCM接口,Codec端的内部路由不做控制。统一化代码时需要将平台端与Codec端代码分析,设计思路如下所示:虚拟Codec平台化

2020-06-15 17:38:39 560

原创 如何使用宏定义求两个数的最大值

源代码如下所示:#include <stdio.h>#include <stdlib.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <unistd.h>#define max_t(type, x, y) ({ \ type __max1 = (x); \ type _...

2020-06-08 10:56:14 1548

原创 PCM的open流程

在系统初始化后,关于声卡驱动的加载流程主要先跑Step 1-->Step 2-->Step 3这个顺序进行加载。首先Step 1是声卡驱动的入口函数,其次Step 3是我们装载声卡驱动模块的入口函数,最后Step 3是用户空间的应用程序打开pcm设备节点。该图是声卡0,设备0且以打开播放设备为例,录音的流程基本相似,再此不做复述。PCM的open流程...

2020-06-02 15:33:18 2777 1

原创 ALSA声卡注册流程

嵌入式声卡驱动主要分为Platform Driver、Codec Driver、Machine Driver三部分,声卡驱动的注册是Machine Driver的注册进行展开。按照ALSA架构看,声卡的注册流程是自底向上进行展开。也就是具体的Machine驱动,和Codec驱动以及Platform驱动,接下来再往ASoC核心层,再到ALSA核心层。通过下图大致描述一下这整个过程:声卡驱动注册流程...

2020-05-28 16:07:01 1797 4

原创 Linux声卡驱动涉及重要结构体

struct snd_card是在ALSA Core层的核心数据结构,而snd_soc_card是ASoC层的核心数据结构。在嵌入式系统中,声卡驱动一般只需要关注两个逻辑设备:PCM设备跟Control设备。PCM设备用于管理音频数据,而Control设备用于Codec物理设备。下图尽可能描述声卡驱动所涉及的重要数据结构。ALSA关键数据结构...

2020-05-27 15:15:31 570

原创 Linux内核线程管理

内核线程的调度和管理都是通过kthreadd(pid=2)进行管理的,内核线程kthreadd通过进程0创建,而创建内核线程通过函数kernel_thread进行创建。kthreadd如何管理内核线程和调度如下所示:标Linux内核线程管理题...

2020-05-22 17:48:41 287

原创 虚拟化技术架构分类

宿主架构:直接在操作系统之上安装和运行虚拟化程序,而这种虚拟化程序的稳定性完全取决于宿主操作系统的稳定行,该虚拟化程序依赖于主机操作系统对设备的支持和物理资源的管理。宿主架构裸机架构:除了宿主架构外,接下来就是裸机架构的虚拟化,裸机架构虚拟化就是虚拟化软件可以直接在硬件上面进行安装,然后操作系统在虚拟化逻辑层上安装操作系统和应用,依赖虚拟层内核和服务器控制台进行管理。裸机架构智能座舱:虚拟化技术应用方向很多,这里主要介绍车载智能座舱领域的虚拟化,目前符合车载标准的也只有QNX He

2020-05-21 16:31:36 2477 1

原创 进程调度笔记

进程命令:ps -eLf :查看多线程额tid及数量chrt -p + pid号:查看进程的优先级跟调度策略top -p + pid号:PR和NICE (NICE仅对normal进程有效)调度策略:1. 正常调度: SCHED_OTHER, SCHED_IDLE, SCHED_BATCHprority value:02. 实时调度: SCHED_FIFO, SCHED_RRprority value:[1, 99]normal进程PR值计算:...

2020-05-20 16:03:04 183

原创 ALSA框架

要深入学习ALSA,首先我们得清晰把握ALSA的软件架构是怎样的?通过对整体的把握,我们在后续的学习中才能进行更加深入的模块化学习。如下图所示:ALSA体系架构在这个体系架构图,我们只需要关注两个方面,一个是PCM设备控制流,另一个是Control控制流。PCM流这一条路针对平台的DMA操作,旨在将音频数据从内存到CPU (RX/TX)FIFO数据交换。而Control这一路是针对Cod...

2020-03-30 16:11:42 555

原创 求一个数组中的最大值与最小值的差的绝对值。

源代码如下:#include &lt;stdio.h&gt;#include &lt;stdlib.h&gt;#include &lt;string.h&gt;#include &lt;math.h&gt;int MaxAndMinAbs(int Array[], int iLen){    int Max = 0;    int Min = 0;    int i = 0;    for(i =...

2018-05-07 23:36:53 4557 1

原创 把一个字符串所有出现的大写字母都替换成小写字母,同时把小写字母替换成大写字母。

源代码如下:#include &lt;stdio.h&gt;#include &lt;stdlib.h&gt;#include &lt;string.h&gt;char* ChangeEngChar(char* input, int iLen){    int i;    char *szSrc = input;    for(i = 0; i &lt; iLen; i++)    {      ...

2018-05-07 23:18:45 8052

原创 用C语言编程:输入一个整数,判断这个数是奇数还是偶数。

源代码如下:#include &lt;stdio.h&gt;#include &lt;stdlib.h&gt;#include &lt;string.h&gt;int main(int argc, char* argv[]){    int input;    printf("请输入一个整数: ");    scanf("%d", &amp;input);    if(input &amp; 0x...

2018-05-02 22:28:09 23257

原创 C语言求一个32位数的原码、补码、反码、和移码。

由于浮点数还需要考虑浮点数的存储方式,所以目前暂时提供正数的补码、反码、移码源代码如下:#include &lt;stdio.h&gt;#include &lt;stdlib.h&gt;#include &lt;string.h&gt;void ShowValueBin(int bits, int value){    int i;    for(i = bits-1; i &gt;=0; i--...

2018-04-21 00:55:53 4955

原创 将一个寄存器内的值中的某连续几位(start--end)的值替换为给定的val值

思路:a、先将替换的连续位数清零b、将给定的值左移start位后跟所给的值相或。例如:1011 0000 101(1501)---&gt;1011 1111 101(1533)源代码如下:#include &lt;stdio.h&gt;#include &lt;stdlib.h&gt;#include &lt;string.h&gt;int ReplaceValueToRegister(int i...

2018-04-19 01:44:50 485

原创 写一个函数,反转一个无符号字符变量x(unsigned char x),并且把结果保存在无符号变量y中,反转处理如下: 反转前:x = 10101111 (二进制) 反转后:y = 11110101

思路:a、将需要反转数按位右移动b、将每位右移i位的数与1比较,若该位为1,将该位左移7-i并置为1,否则置为0。以此类推。将左移的每位保存一个临时变量中,并最终返回。源代码如下:#include &lt;stdio.h&gt;#include &lt;stdlib.h&gt;#include &lt;string.h&gt;unsigned ReversalBits(unsigned char ...

2018-04-18 00:31:18 1011

原创 unsigned int intvert(unsigned int x, int p, int n)实现对x进行转换,p为起始转换位,n为需要转换的长度,假 设起始点为右边,如如x=0b0001 00

unsigned int intvert(unsigned int x, int p, int n)实现对x进行转换,p为起始转换位,n为需要转换的长度,假设起始点为右边,如如x=0b0001 0001(十进制为17),p=4,n=3转换后x=0b0110 0001(十进制为97)思路:1、对所求的位数按位进行转换。2、对所求的位进行取反。源代码:#include &lt;stdio.h&gt;#...

2018-04-02 16:38:48 726

原创 请编写相关函数来完成对一段英文字符串进行字母统计功能,出现最多那个字母的出现次数,不区分大小写。

思路:1、对字符串进行过滤,把英文字母过滤出来。2、将所有英文字母统一转成小写(大写)。3、将待求的字符串与26个字母进行比较并统计个数4、统计出现最多的字母。源代码:#include &lt;stdio.h&gt;#include &lt;stdlib.h&gt;#include &lt;string.h&gt;char s_str[] = "abcdefghijklmnopqrstuvwxyz...

2018-04-02 16:09:52 5947

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除