自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(53)
  • 收藏
  • 关注

原创 FFMpeg学习——5 摄像头采集并进行H264压缩

1 流程平台:win10+vs2019基本流程:1 打开设备av_find_input_formatavformat_open_input2 打开视频编码器avcodec_find_decoderavcodec_open23 转换为YUV420sws_getContextsws_scale4 编码视频avcodec_send_frameavcodec_receive_packet2 code#include <iostream>extern "C"

2021-07-20 14:31:25 732

原创 wav文件格式解析

1 简介  以RIFF(Resource Interchange File Format)格式为标准的。  PCM 数据:原始音频数据,没有文件格式  WAV数据:存储了PCM或压缩型,数据以小端方式存储  WAVE文件是由若干个Chunk组成的。按照在文件中的出现位置包括:RIFF WAVE Chunk, Format Chunk, Fact Chunk(可选), Data Chunk。具体见下图:2 格式详解2.1 RIFF块字段长度内容ckID4 Bytes“

2021-07-19 09:54:32 1087

原创 FFMpeg学习——4 SDL

1 简介SDL(Simple DirectMedia Layer)是一套开放源代码的跨平台多媒体开发库,使用C语言写成。SDL提供了数种控制图像、声音、输出入的函数,让开发者只要用相同或是相似的代码就可以开发出跨多个平台(Linux、Windows、Mac OS X等)的应用软件。目前SDL多用于开发游戏、模拟器、媒体播放器等多媒体应用领域。2 显示流程SDL视频显示函数简介SDL_Init():初始化SDL系统SDL_CreateWindow():创建窗口SDL_WindowSDL_Cr

2021-07-17 09:16:59 281 1

原创 FFMpeg学习——3 编解码

1 环境  系统:win10  IDE:vs2019  ffmpeg:ffmpeg4.4vs工程配置:(1)新建vs工程,平台选择x64。(2)拷贝ffmpeg shared目录下lib、include到工程文件夹,拷贝bin目录下的dll文件到后缀为vcxproj所在的目录下(3)配置工程属性头文件配置:属性——>C/C++——>常规——>附加包含目录,输入“$(SolutionDir)\include”导入库配置:属性——>链接器——>常规——>附

2021-07-16 20:08:54 534

原创 FFMpeg学习——2 基本命令

1 环境  系统:win10  ffmpeg:ffmpeg 4.42 基本用法下载ffmpeg,在bin目录下的工具:ffmpeg:音频、视频编码器/解码器ffplay:多媒体播放器ffprobe:多媒体文件特征解析打开cmd窗口,进入ffmpeg/bin目录,将测试文件放到相同目录下,使用示例//将input.avi文件转换为码率为640kbps的output.ts文件ffmpeg -i input.avi -b:v 640k output.ts//播放ffplay inpu

2021-07-16 13:39:38 268 2

原创 FFMpeg学习——1 基础知识

文章目录1 基础知识2 FFMpeg命令行3 FFMpeg视频解码器4 SDL视频显示5 FFMpeg+SDL视频播放器6 FFMpeg+SDL音频播放器7 FFMpeg+SDL音视频播放器8 学习参考1基础知识1 基础知识2 FFMpeg命令行3 FFMpeg视频解码器4 SDL视频显示5 FFMpeg+SDL视频播放器6 FFMpeg+SDL音频播放器7 FFMpeg+SDL音视频播放器8 学习参考1基础知识1.1 视频解码原理例如,对于一个TS格式的视频文件,里面可能包含了多个

2021-07-16 08:17:38 222 2

原创 《Operating System —— Three Easy Pieces》笔记

1 概述《Operating System —— Three Easy Pieces》,讲述3个方面:1)虚拟化:虚拟CPU,单个CPU使用像在运行多个CPU;虚拟存储器,各个程序像有自己私有的内存空间。2)并发:并发需要处理的问题。3)持久化:文件存储。设计目标:1)抽象:方便使用,不需关注太多细节。2)高性能3)提供保护2 虚拟CPU通过时分共享,一个进程运行一定的时间,然后切换给另一个进程。2.1 进程创建进程,操作系统要为进程分配内存,...

2021-05-13 19:58:10 819

原创 《Linux内核设计与实现》学习【12】—— 设备与模块

  4种内核成分:设备类型,模块,内核对象,sysfs。1 设备类型类型特点例子字符设备一个个字符方式访问键盘块设备以块为单位,对数据随机访问flash网络设备打破了“一切皆文件”的原则网卡其他设备类型:  杂项设备——简化的字符设备  伪设备——虚拟的,例如/dev/null(空设备), /dev/zero(零设备)2 模块(1)构建模块方式  1)放在内核源码树中  2)放在内核代码外  此时,写个Makefile较简单KVERS

2020-10-22 15:36:48 109

原创 《Linux内核设计与实现》学习【11】—— 页高速缓存和页回写

1 缓存  linux为了提高对磁盘的访问速度,通过把磁盘中的数据缓存到物理内存中,把对磁盘的访问变为对物理内存的访问。  两个重要因素:  1)访问磁盘的速度要远低于访问内存的速度,若从处理器L1和L2高速缓存访问则速度更快。  2)数据一旦被访问,就很有可能短时间内再次访问。1.1 缓存策略3种策略:  1)不缓存:不缓存写操作,当对缓存中的数据进行写操作时,直接写入磁盘,同时使此数据的缓存失效  2)写透缓存:写数据时同时更新磁盘和缓存  3)回写:先写到缓存,并将页面标记为“脏”,

2020-10-22 15:31:47 140

原创 《Linux内核设计与实现》学习【10】—— 进程地址空间

  进程地址空间:系统中每个用户空间进程所看到的内存。1 地址空间  进程地址空间由进程可寻址的虚拟内存组成。特点:  1)平坦的:地址空间范围是一个独立的连续区间  2)寻址范围:4GB虚拟内存(32位地址空间中),可以被合法访问的地址空间称为内存区域。如果一个进程访问了不在有效范围中的内存区域,或以不正确的方式访问了有效地址,那么内核就会终止该进程,并返回“段错误”信息。  3)内存区域可包含的对象:可执行文件代码的内存映射称为代码段。(text section)可执行文件的已初始化全局

2020-10-21 16:47:55 88

原创 《Linux内核设计与实现》学习【9】—— 块I/O

1 块设备特点:  1)能够随机访问数据  2)最小的可寻址单元是扇区,扇区的大小是2的整数倍,一般是 512字节。扇区和块:  扇区——物理设备的最小可寻址单元  块——逻辑上的最小寻址单元2 缓冲区头调入块到缓冲区中,每个缓存区对应一个buffer_head描述符,称作缓冲区头。弊端:  1)对内核来说,操作页面更为简单  2)每个缓冲区头只能表示一个 [块],所以内核在处理大数据时,会分解为对一个个小的 [块] 的操作,造成不必要的负担和空间浪费。3 bio  块I/O的基本

2020-10-20 16:15:49 70

原创 《Linux内核设计与实现》学习【8】—— 虚拟文件系统

1 VFS文件系统虚拟文件系统(VFS)为用户空间程序提供了文件和文件系统相关的接口,使应用通过统一的系统调用访问各种存储介质。虚拟文件中的4个主要对象:文件、目录项、索引节点和安装点。2 文件特性superblock:记录此 filesystem 的整体信息,包括inode/block的总量、使用量、剩余量, 以及档案系统的格式与相关信息等;inode:记录文件的属性,一个文件占用一个inode,同时记录此文件的资料所在的 block 号码;block:实际记录文件的内容,若文件太大时,会占

2020-10-20 12:24:33 82

原创 《Linux内核设计与实现》学习【7】—— 内存管理

1 概念(1)页内核把物理页作为内存管理的基本单位,用struct page表示系统中的每个物理页(2)区由于硬件的限制

2020-10-20 12:21:14 86

原创 《Linux内核设计与实现》学习【6】—— 定时器

1 时间  HZ:系统定时器节拍频率  jiffies:自系统启动以来产生的节拍总数  回绕问题:unsigned long timeout = jiffies + HZ/2; /* 0.5秒 */if (timeout > jiffies) { /* 没有超时 .... */} else { /* 超时了 ... */}  若jiffies超过最大值,重新变为0,则判断出错。内核提供了宏来帮助比较#define time_after(a,b) \ (typeche

2020-10-18 11:55:49 128

原创 《Linux内核设计与实现》学习【5】—— 内核同步

1 基本概念  临界区:访问和操作共享数据的代码段  竞争条件:多个执行线程处于同一临界区中同时执行  同步:避免并发和防止竞争条件2 造成并发执行的原因  (1)中断:中断随时会发生,也就会随时打断当前执行的代码。  (2)软中断和tasklet:软中断和tasklet也会随时被内核唤醒执行,也会像中断一样打断正在执行的代码  (3)内核抢占:内核具有抢占性,发生抢占时,如果抢占的线程和被抢占的线程在相同的临界区,就产生了竞争条件  (4)睡眠及用户空间的同步:用户进程睡眠后,调度程序会唤

2020-10-18 10:14:20 124

原创 《Linux内核设计与实现》学习【4】—— 中断

1 上/下半部将中断处理程序分为两部分:  1)上半部:做严格时限的工作  2)下半部:允许稍后执行的工作2 使用注册/* * irg - 表示要分配的中断号 * handler - 实际的中断处理程序 * flags - 标志位,表示此中断的具有特性 * name - 中断设备名称的ASCII 表示,这些会被/proc/irq和/proc/interrupts文件使用 * dev - 用于共享中断线,多个中断程序共享一个中断线时(共用一个中断号),依靠dev

2020-10-17 20:41:12 386

原创 《Linux内核设计与实现》学习【3】——系统调用

1 作用用户–>系统调用–>硬件。作用:  1)为用户空间提供了一种硬件的抽象接口  2)保证安全性,内核可以根据权限、用户类型等对需要的访问进行裁决2 源码分析  以arm平台代码为例。  应用程序调用open、read等,会通过swi指令,陷入到内核态,进入异常向量vector_swi,在arch/arm/kernel/entry-common.S中ENTRY(vector_swi) /*保护用户态的现场*/ sub sp, sp, #S_FRAME_SIZE st

2020-10-04 12:46:16 290

原创 《Linux内核设计与实现》学习【2】—— 进程调度

1 简介(1)调度程序工作  1)将哪个投入运行  2)何时运行及运行多长时间(2)I/O消耗型和处理器消耗型  I/O消耗型:大部分时间处理IO请求  处理器消耗型:大部分时间在执行代码(3)优先级两种:  1)nice值:范围是-20~+19,值越大优先级越低  2)实时优先级:范围是0~99,值越大优先级越高。任何实时进程的优先级大于普通进程(4)完全公平调度(Completely Fair Scheduler,CFS)  理念:每个进程获得1/n的处理能力  做法:每个进

2020-10-04 11:17:55 87

原创 《Linux内核设计与实现》学习【1】—— 进程管理

1 进程与线程  进程是处于执行期的程序,线程是进程的执行单元。进程是操作系统资源分配的基本单位,而线程是处理器任务调度和执行的基本单位进程线程资源开销每个进程都有独立的代码和数据空间,程序之间的切换会有较大的开销同一类线程共享代码和数据空间,每个线程都有自己独立的运行栈和程序计数器(PC),线程之间切换的开销小包含关系可包含多个线程进程的一部分内存分配进程之间的地址空间和资源是相互独立的同一进程的线程共享本进程的地址空间和资源2 描述符及结构进程描

2020-10-01 18:51:44 76

原创 Makefile学习

1 程序处理  从源文件到最终的可执行文件的处理,一般流程为:预处理、编译、汇编、链接。各阶段作用过程作用生成文件预处理展开头文件/宏替换/去掉注释/条件编译.i文件编译检查语法,生成汇编代码.s文件汇编转换成机器码.o文件链接链接函数、全局变量等,最后将多个.o文件链接生成一个可执行文件elf文件2 Makefile基本规则2.1 基本规则target(目标) ... :prerequisites(依赖) command(命令)t

2020-09-24 09:14:03 315

原创 Git学习

1 常用版本工具集中式:版本库放在中央服务器上,需要从服务器上存取。常用工具SVN等分布式:每个电脑有一个完整的版本,为了方便协同工作,有充当服务器的电脑,即使没有这个服务器,分布式工具依然能够使用。常用工具Git等2 Git基本概念关系工作区:就是在个人电脑里能看到的目录。暂存区:一般存放在 .git 目录下的 index 文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)。本地仓库:存放本地的版本。远程仓库:对应服务器,存放所有提交的版本。版本库:工作区有一

2020-09-23 16:29:22 54

原创 嵌入式Linux应用调试【2】—— 打印用户态oops

修改内核,使得应用程序出错时,也能打印oops。1 pc值1.1 源码打印的oops,有“Unable to handle kernel paging request”等描述,在内核代码中搜索,找到在arch/arm/mm/fault.c中,__do_kernel_fault()static void __do_kernel_fault(struct mm_struct *mm, unsigned long addr, unsigned int fsr, struct pt_regs *re

2020-09-22 20:31:37 236

原创 嵌入式Linux应用调试【1】—— strace、gdb

1 stracestrace可记录执行过程中的系统调用、接收到的信号。(1)移植tar -xjf strace-4.5.15.tar.bz2cd strace-4.5.15/patch -p1 <../strace-fix-arm-bad-syscall.patch //在arm./configure --host=arm-linux CC=arm-linux-gcc make //生成strace命令文件将生成的stra

2020-09-22 20:27:50 262

原创 嵌入式Linux驱动学习——串口

1 框架1.1 概念终端:只有输入、显示部件并能连接到计算机的设备,早期设备,现在没有了。虚拟终端:由硬件终端演化出来的软件概念,用计算机的软件来模拟以前硬件的方式。控制台:console, 一种特殊的终端,能够显示系统信息,一般只有一个。1.2 终端驱动框架tty核心:对整个tty设备的抽象,对用户提供统一的接口tty线路规程:对传输数据的格式化tty驱动:面向tty设备的硬件驱动当从用户空间进行读写时,流程如下:2 源码分析由上述框架,关注tty核心、tty线路规程和tty驱动

2020-09-22 11:17:43 344

原创 嵌入式Linux驱动学习 —— IIC

1 IIC  IIC,串行总线,两条数据线:数据线SDA,时钟线SCL。多主机的半双工通信方式。  传输波形示意图:  信号类型:  (1)空闲信号:SDA和SCL同时处于高电平。  (2)起始信号:SCL为高,SDA由高到低的跳变。  (3)结束信号:SCL为高,SDA由低到高的跳变。  (4)响应信号:在第9个时钟接收方接收该字节成功,便会输出一个ACK应答信号,当SDA为高电平,表示为非应答信号NACK,当SDA为低电平,表示为有效应答信号ACK。2 AT24C08  MINI24

2020-09-12 13:12:08 439

原创 嵌入式Linux驱动学习 ——USB

1 USB基本概念1.1 传输类型(1)控制传输(control)  是每一个USB设备必须支持的,通常用来获取设备描述符、设置设备的状态等等。一个USB设备从插入到最后的拔出这个过程一定会产生控制传输(即便这个USB设备不能被这个系统支持)。(2)中断传输(interrupt)  支持中断传输的典型设备有USB鼠标、 USB键盘等等。中断传输不是说我的设备真正发出一个中断,然后主机会来读取数据。它其实是一种轮询的方式来完成数据的通信。USB设备会在设备驱动程序中设置一个参数叫做interval,

2020-09-10 13:36:41 827

原创 嵌入式Linux驱动学习——按键定时器防抖

1 定时器(1)全局变量  jiffies:记录了系统启动以来,经过了多少tick,初始值为0。一个tick代表多长时间,在内核的CONFIG_HZ中定义。比如CONFIG_HZ=200,则一个jiffies对应5ms时间。  HZ:系统定时器每秒产生中断的频率,/arch/arm/include/asm/param.h中定义。(2)函数//include/linux/timer.hstruct timer_list { struct list_head entry; unsigned lo

2020-09-10 09:53:14 264

原创 嵌入式Linux驱动学习——同步互斥、阻塞

  学习原子操作和互斥信号量的使用、阻塞/非阻塞在驱动中的应用。1 问题  当多个应用程序同时对一个设备文件进行写操作时,可能出现问题。修改程序,使得只有一个应用程序使用驱动程序。2 原子操作2.1 原子操作函数  保证了变量操作的原子性。atomic_t v = ATOMIC_INIT(0); atomic_read(atomic_t *v); void atomic_inc(atomic_t *v); void atomic_dec(atom

2020-09-10 09:52:23 146

原创 嵌入式Linux驱动学习—— 异步通知

1 异步通知机制  之前的按键处理,使用阻塞和poll方式,这样应用层需要等待事件到来。而异步方式,应用层可以去处理其他事情,当有事件发生时,主动通知应用层。  例如:kill -9 pid,发信号9给pid对应的进程,杀死进程。  写一个测试程序,主函数一直处于休眠状态,当接收到信号后,打印。#include <stdio.h>#include <signal.h>void my_signal_run(int signum) //信号处理函数{ s

2020-09-10 09:51:22 125

原创 嵌入式Linux驱动学习 —— poll机制

1 IO模式Linux下的五种IO模型:1)阻塞IO(blocking IO):读数据,若没有,一直阻塞,直到有数据后返回;2)非阻塞IO (nonblocking IO):读数据,不管有没有,直接返回;3)IO复用(select 和poll) (IO multiplexing):同时监听多路数据,只要有一路有数据或超时返回;4)信号驱动IO (signal driven IO (SIGIO)):很少用;5)异步IO (asynchronous IO (the POSIX aio_functio

2020-09-10 09:50:09 224

原创 嵌入式Linux项目实践——数码相框1

文章目录1 框架2 显示文字2.1 文字编码方式2.2 英文字母显示2.2.1 概述2.2.2 程序2.3 freetype理论2.3.1 介绍2.3.2 在PC上运行2.3.3 在LCD上运行1 框架(1)需求分析  1)上电,LCD显示界面  2)根据配置文件,停留在当前界面,或者自动播放下一幅  3)点击,出现对话框,选择手动/自动播放  4)滑动:上——放大,下——缩小,左——上一幅,右——下一幅  5)左右移动速度较快,显示下下一幅(2)包含进程  1)输入进程:​  主控线

2020-08-24 20:50:34 970

原创 嵌入式Linux驱动学习【17】—— 驱动调试之僵死问题

1 问题  假设在驱动中,写入while(1),则加载模块后,一直无log输出,无法定位问题。2 定时器  当内核中断产生时,会做以下几步:  1)pc-4(计算返回地址值),然后将各个寄存器值存到sp栈里  2)获取中断号,获取sp地址,然后调用asm_do_IRQ()  为了解决上述问题,在定时中断中,若发现一个进程10s内不断获取的进程,则打印PC值等。在asm_do_IRQ中加入#ifdef 1 static pid_t pre_pid;

2020-08-24 10:30:42 160

原创 嵌入式Linux驱动学习【16】—— 驱动调试oops

1 问题在led驱动中,制造错误,在open中加入unsigned long * gpfcon = (unsigned long *)0x56000050;*gpfcon = 1;装载模块,并用测试程序打开时,出错,记录log。其中可以看到提示、PC值、栈回溯等信息。Unable to handle kernel paging request at virtual address 56000050pgd = c3ae0000[56000050] *pgd=00000000Internal

2020-08-24 09:54:21 334

原创 嵌入式Linux驱动学习【15】—— 驱动调试printk

1 设置打印  在uboot命令行设置打印的显示设备:(1)LCD:console=tty1(2)串口UART0:console=ttySAC0,1152002 源码分析2.1 命令行传参  内核/kernel/printk.c中__setup("console=", console_setup);  根据命令行传入的参数,调用console_setup。static int __init console_setup(char *str){ char buf[sizeof(conso

2020-08-23 21:44:38 289

原创 嵌入式Linux驱动学习【14】—— U盘自动挂载

1 源码流程  实现U盘的自动挂接,在/etc/mdev.conf文件里加入一行语句就能实现自动装载u盘。  如何调用到/etc/mdev.conf,以之前的驱动为例,创建设备device_create ---> device_create_vargs ---> device_register ---> device_add ---> kobject_uevent ---> kobject_uevent_envint kobject_ue

2020-08-23 12:16:45 281

原创 嵌入式Linux驱动学习【13】—— DMA

1 DMA1.1 概述  DMA(Direct Memory Access),不需要CPU控制,直接进行数据传输。S3C2440有4个DMA通道,源地址和目的地址可以是系统总线或外设总线,因此传输可以有4种情况:    系统总线/外设总线 <===> 系统总线/外设总线  请求源:  工作模式:  1)查询模式:当DMA请求XnXDREQ为低电平时,则DMA会一直传输数据,直到DMA请求拉高,才停止。  2)握手模式:如果 XnXDREQ 为高电平,DMA XnXDAC

2020-08-22 12:30:05 255

原创 嵌入式Linux驱动学习【12】—— 声卡

1 硬件  硬件原理图  与mini2440连接示意图2 音频基础(1)采样频率(sample rate):录音设备在一秒钟内对声音信号的采样次数。(2)通道数(channel):分为单声道mono;立体声stereo。两个声道,说明只有左右两边有声音传过来。(3)比特率(bitrate):也叫码率。针对编码格式,表示压缩编码后每秒的音频数据量大小。计算公式:比特率 = 采样率 x 采样精度 x 声道数。单位kbps。(4)量化位数:指每个采样点里传输的数字信号次数,一般有8位、16位、3

2020-08-21 18:23:03 769

原创 嵌入式Linux驱动学习【11】—— RTC

1 字符设备注册(1)2.4之前register_chrdev(unsigned int major, const char *name,const struct file_operations *fops);  缺点:注册字符设备,还会连续注册0~255个次设备号,使它们绑定在同一个file_operations。(2)2.4之后  静态注册(指定设备编号来注册)、动态分配(不指定设备编号来注册),以及有连续注册的次设备编号范围区间。/*指定设备编号来静态注册一个字符设备*/int reg

2020-08-21 11:49:05 183

原创 嵌入式Linux驱动学习【10】—— 虚拟网卡

1 网络设备驱动结构1.1 结构  (1)网络协议接口层向网络层协议提供统一的数据包收发接口,不论上层协议为 ARP 还是IP,都通过 dev_queue_xmit()函数发送数据,并通过 netif_rx()函数接收数据。这一层的存在使得上层协议独立于具体的设备。发送接收都需要sk_buff,sk_buff 结构体非常重要,定义于 include/linux/skbuff.h 文件,它的含义为“套接字缓冲区”  ( 2) 网络设备接口层向协议接口层提供统一的用于描述具体网络设备属性和操作的结构体n

2020-08-18 16:44:05 419

原创 嵌入式Linux驱动学习【9】—— Nor Flash

1 Nor Flash  原理图  与Nand Flash不同,Nor Flash有地址线、数据线,能直接读取数据,但是不能直接写入数据,需要有命令才行。当进行写时,一般要解锁->命令->数据,当写完毕,要reset,退出当前模式。  Nor Flash规范:  1)jedec:用来帮助程序读取Flash的制造商ID和设备ID,通过读ID来匹配linux内核中drivers/mtd/chips/jedec_probe.c里的jedec_table[]数组,来确定norflash的各个参

2020-08-18 11:26:42 423

空空如也

空空如也

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

TA关注的人

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