自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 【Nuttx】realloc流程

此处讨论的是nuttx的堆内存管理,其中内存管理模型如下图所示。

2023-04-10 22:19:03 216

原创 【FFmpeg】自定义编码器适配

首先是输入零拷贝,输入yuv是外部申请的,编码器只是使用,对于一个阻塞的编码器(即送帧后需要阻塞等待该帧编码完成),这个设计是相对简单的,只需要将frame的地址告诉编码器即可,从编码开始到结束只有一个yuv buffer,编码完成后意味这一帧也消耗完了;的实现,libx264的流程比较繁琐,总结为流程图如下,x264_encoder_encode为非阻塞接口,内部存在yuv的拷贝,调用后不一定会获取到一帧编码好的码流,但获取到之后,同样需要拷贝到输出pkt中。如果是simple流程,则调用的是。

2023-04-10 22:10:31 1184

原创 【FFmpeg】编码器流程分析

介绍ffmpeg编码器软件调用流程

2023-04-10 22:02:43 480

原创 算法与数据结构——c语言描述01:分治、求最大公约数、快速求幂

算法分析0. 介绍1. 数学基础2. 要分析的问题2.2 最大子序列和问题2.2 求最大公约数2.3 快速求幂算法总结0. 介绍由于工作和学习中上用不到,在算法和数据结构方面的基础基本没有,而由于要考公司的c语言工作级认证,发现没有这方面的知识是完全考不上的,所以回过头来学习算法和数据结构,书就直接上Mark Allen Weiss的《数据结构与算法分析——C语言描述》了,以下是一些自己写的例...

2020-03-28 22:12:19 753

原创 数字视频编码技术原理_笔记(5~8章)

5. 量化量化主要应用于从连续的模拟信号到数字信号的转换,其作用主要是将信号的连续取值近似为多个离散值,即量化相当于一个多对一的映射过程,通过量化降低了数据量。5.1 量化的基本原理5.1.1 基本概念对于输入的连续信号X,量化映射Q对[xk,xk+1)[x_k, x_{k+1})[xk​,xk+1​)区间内的所有输入信号都用yky_kyk​来近似表示,即:Y=Q(X)=yk,X∈[xk...

2019-04-21 11:18:34 981

原创 数字视频编码技术原理_笔记(1~4章)

书是高文的《数字视频编码技术原理》(第二版),简单做下笔记1. 概论1.1 色彩空间常用的色彩空间表示方法有RGB和YUV。RGB色彩空间是直接基于三原色来表达彩色图像,一个像素需要用三个样值表示,RGB三个基本色度对混合色度具有同样重要的作用,通常使用同样的精度来表示RGB的三个基本色度值。人的视觉系统(HVS)对亮度的感知比色度的感知更加敏感,因此将色彩空间分为亮度(Y)和色度...

2019-04-10 11:31:38 3702 3

原创 树莓派、51、arduino和树莓派几种常用芯片及开源硬件的比较

血统IDE语言价格硬件资源下载方式开发难度51KEILC3~10PWM/AD/SPI/UART串口简单stm32KEIL/IARC12PWM/AD/DMA/I2C/SPI/UART/CAN/USB串口/编程器较难arduinoarduino ide类C12PWM/AD/I2C/SPI/UART串口最简单树莓派li...

2019-02-13 21:16:15 9446

原创 ARM+Linux嵌入式开发05:【uboot-2017移植】重定位

概述上一节初始化好了串口和LED,我们可以用它们进行调试;也设置好了时钟和DRAM,为uboot的重定位做好准备。之前所做的所有工作都是在BL1中,也就是uboot的前16KB,而大部分uboot的代码还在SD卡中没有载入内存,没有载入内存的原因是之前我们使用的是内部SRAM,容量不足以放下整个uboot,而现在已经初始化好了外部DRAM,拥有了512MB内存,是完完全全够放下整个uboot,所...

2018-12-30 12:08:31 1085

原创 ARM+Linux嵌入式开发04:【uboot-2017移植】底层硬件初始化

概述上一节讲了uboot启动的第一阶段,其中会调用一个lowlevel_init函数对进行底层硬件初始化,然后完成重定位,这一节开始对底层硬件初始化作介绍,主要包括:LED灯,电源锁存,时钟,串口。LED灯打开board/samsung/x210/lowlevel_init.S文件,查看lowlevel_init()函数,首先是检查是否需要重定位:ldr r0, =0x0000ffff ...

2018-12-15 12:31:27 1389 1

原创 ARM+Linux嵌入式开发03:【uboot-2017移植】uboot启动第一阶段

概述上一章讲到210.bin是u-boot.bin的前16KB程序,也就是BL1,根据s5pv210的启动流程,这段程序的作用是初始化DRAM,然后将BL2载入DRAM当中,最后跳转到DRAM运行。要分析这段程序,就要了解uboot的启动过程以及源码构成。从上电到进入_main函数之前uboot启动总的来说可以分为两个大的阶段,第一个是从上电到进入_main()之前,这部分代码是在对芯片运行...

2018-12-09 11:37:33 1369

原创 ARM+Linux嵌入式开发02:【uboot-2017移植】s5pv210载入BL1

概述

2018-12-08 11:33:06 761

原创 ARM+Linux嵌入式开发01:【uboot-2017移植】s5pv210启动流程

概述在开始代码讲解之前,先看s5pv210的启动流程,因为uboot的初始化代码就是建立在芯片启动流程基础上的。三星系列芯片针对的都是手机、平板电脑等运行操作系统的设备,使用的是ARM-Cortex A系列架构,而不同于如STM32等单片机使用ARM-Cortex M系列架构,其中A系列针对是应用级处理器,M针对的是微控制器,下面引用一段博客的介绍1:ARMv7开始以Cortex来命名,并分...

2018-12-07 13:57:16 1243

原创 ARM+Linux嵌入式开发00:【介绍】硬件、uboot、Linux内核和根文件系统

概述从学嵌入式以来,还没有真正意义上的进行过uboot或Linux内核的移植,于是为了满足自己的好奇心和探索精神,打算将最新的uboot和Linux内核移植到开发板上,最近移植也接近了尾声,因此打算开一个深坑:写一篇较为完整的uboot+linux+rootfs移植的文章,如果有幸有人能读到,也是一种参考。平台介绍开发板九鼎x210(s5pv210)bootloader...

2018-11-30 21:39:46 1096

原创 将sd卡格式化为ext4格式并挂载

1. 介绍uboot加载内核时会从sd中读取内核镜像,和老版本的uboot不同,新版本的uboot支持文件系统,直接将内核镜像复制到sd卡中,然后uboot启动时就会访问sd卡的文件系统,找到内核镜像文件并加载。uboot支持什么文件系统是是由环境变量loaduimage决定的,这里我的环境变量为:loaduimage=ext4load mmc ${mmcdev}:${mmcbootpart}...

2018-11-19 14:50:56 8043 1

原创 uboot和linux kernel中创建defconfig文件

1. 介绍最近在移植uboot的时候我想根据当前的.config文件创建自己的defconfig文件到configs/目录中,开始以为是直接拷贝.config文件然后重命名即可,然后想了想uboot的Makefile文件中应该是有这个功能的,但是百度时没有人提到,最后翻墙用google终于发现确实有这个功能,于是在这里记录一下。2. 使用make命令创建defconfig文件总结一下现在的情...

2018-11-16 10:09:38 3006

原创 Linux驱动开发11:【设备树】nanopi的PWM驱动

介绍前两节利用设备树实现了nanopi的LED驱动和按键驱动,这一节来实现nonapi的PWM驱动。PWM驱动在内核中也有相应的实现,因此这里只是按照要求添加设备树文件即可。这一节和之前一样,首先修改设备树文件进行测试,然后分析内核相应的软件实现。添加设备树节点因为在sunxi-h3-h5.dtsi和sun8i-h3-nanopi.dtsi文件中已经定义了PWM节点// s...

2018-08-21 15:03:23 3559 3

原创 Linux驱动开发10:【设备树】nanopi的按键驱动

介绍这一节在nanopi上实现按键驱动,和LED驱动一样,通用的按键驱动在linux内核中已经实现好,我们只需要按照要求写好设备树即可,不用我们自己实现按键驱动。这一节中首先修改设备树并测试按键驱动,然后分析drivers/input/keyboard/gpio_keys.c文件,看按键驱动是如何实现的。添加设备树节点在sun8i-h3-neo-nanopi-air.dtsi文件中...

2018-08-20 10:53:04 1706

原创 Linux驱动开发09:【设备树】nanopi的LED驱动

介绍这节通过在nanopi的设备树中添加LED子节点,来实现一个LED驱动。由于linux内核支持LED驱动框架并且有通用的LED驱动,因此这里只需按照驱动要求添加设备树节点就可以了,不用我们自己重写LED驱动。这一节先在设备树中添加一个LED节点,重新编译设备树测试效果,然后对内核中drivers/leds/leds-gpio.c进行分析,看该LED驱动是如何实现的。添加设备树节点...

2018-08-18 10:22:48 2169

原创 Linux驱动开发08:【设备树】MPU6050驱动和i2c驱动

介绍上一节在nanopi设备树的I2C节点下增加了一个MPU6050的子节点,并在sysfs中查看到了该节点已经被正确解析,这一节我们来修改之前的MPU6050驱动,使之能够匹配到我们的设备树节点,然后再分析设备树节点是如何加载到i2c总线上的。MPU6050驱动的变更在之前的MPU6050驱动中,为了方便测试,我们是在模块的init函数中临时注册了一个i2c_client到i2c...

2018-08-17 09:00:30 2791

原创 Linux驱动开发07:【设备树】分析nanopi设备树,添加I2C子节点

介绍本节简单介绍一下设备树,然后对nanopi的设备树文件进行分析。为了真正地体会设备树的用法,我们在现有设备树的I2C节点中尝试添加一个mpu6050的子节点,然后在nanopi的文件系统中尝试访问该节点,以验证是否添加成功。下一节会修改mpu6050的I2C驱动,使之支持该节点。设备树简介设备树文件是一种板级描述文件,该文件由一系列的节点和子节点组成,用于描述CPU内部资源和板...

2018-07-25 09:58:18 3917 2

原创 Linux驱动开发06:【I2C驱动】写一个MPU6050驱动

介绍在上节中实现了不依赖于硬件的I2C总线驱动和设备驱动,这一节我们利用I2C框架来真正地驱动硬件,由于手上的I2C器件只有一个MPU6050,所以这里实现了一个MPU6050的I2C设备驱动程序,硬件平台是nanopi-air。注意因为nanopi已经实现了I2C总线驱动(具体实现在drivers/i2c/busses/i2c-mv64xxx.c),因此我们可以直接使用现成i2c_adapt...

2018-07-24 09:42:31 1613

原创 Linux驱动开发05:【I2C驱动】I2C总线驱动和设备驱动

介绍这里实现一种不涉及硬件的I2C总线和设备驱动,然后分析I2C驱动在系统中的注册过程。这里实现的驱动类似于之前的FIFO字符设备驱动,与之不同的是这里使用了I2C驱动框架,设备文件写入和读取将通过i2c_client传递到指定的i2c_adaper,然后在i2c_adapter中操作一段内存。这个驱动非常简单,甚至没有使用FIFO这种硬件结构,只能进行读和写,毕竟内存的操作不是中断,重点是熟...

2018-07-17 18:06:59 4360

原创 Linux驱动开发04:块设备驱动和网络设备驱动

介绍因为块设备驱动和网络设备驱动实际中用得较少,所以只给出驱动模板,因为我也没有具体测试,溜了溜了。块设备驱动模板struct xxx_dev { int size; struct request_queue *queue; /* The device request queue */ struct gendisk *gd; ...

2018-07-16 17:22:08 845

原创 Linux驱动开发03:Input子系统

介绍本章以”BTN_0”事件为例, 使用input子系统向内核注册一个”BTN_0”的输入事件,然后通过定时器定时触发来模拟按键按下的操作;在应用层中通过注册输入事件来接收驱动发出的事件。整个过程不涉及硬件,只是介绍Input子系统的框架。 Input子系统基于cdev提供接口,属于字符设备,所有使用input子系统构建的设备都使用主设备号13,同时输入子系统也支持自动创建设备文件,这些文件...

2018-07-16 17:05:52 530

原创 Linux驱动开发02:platform驱动框架的使用和分析

介绍platform驱动框架是利用总线(bus_type)+驱动(driver)+设备(device)模型建立的驱动框架。这个模型中总线只有一条,而驱动和设备可以有多个,驱动和设备全都挂接到总线上,总线完成驱动和设备的匹配工作,一旦驱动和设备相匹配,则会执行驱动中的probe函数将驱动注册到系统。同时驱动还可以调用设备中写好的资源(resource)来区别不同的设备,该驱动框架的好处是: ...

2018-07-12 15:12:45 2437

原创 Linux-0.11内核分析08:进程间通信

1. 管道机制管道文件的创建过程//创建管道实例#include <stdio.h>#include <unistd.h>int main(){ int n, fd[2]; pid_t pid; int i, j; char str1[1024]; char str2[512]; for(i=0; ...

2018-07-11 15:10:49 561

原创 Linux-0.11内核分析07:缓冲区与多进程操作文件

1. 缓冲块的进程等待队列A为一个读盘进程,目的是将hello.txt中的100字节读入buffer[100]中B为一个读盘进程,目的是将hello.txt中的200字节读入buffer[200]中C为一个写盘进程,目的是将hello.txt写入字符串”ABCDE”三个进程执行顺序为A–>B–>C,进程间没有父子关系// 进程A打开文件--- fs --- op...

2018-07-11 15:08:00 368

原创 Linux-0.11内核分析06:用户进程与内存管理

用户进程与内存管理1. 示例// str1.c#include <stdio.h>int foo(int n){ char text[2048]; if(n==0) return 0; else{ int i=0; for(i; i<2048; i++) text...

2018-07-11 15:06:05 666

原创 Linux-0.11内核分析05:文件操作

文件操作1. 安装文件系统// 示例mount /dev/hd1 /mnt// 对应操作--- fs --- super.c --- sys_mount() --- dev_i=namei("/dev/hd1")//获得hd1的inode | |- dev = dev_i->i_zone[0]//获取h...

2018-07-11 15:02:45 625

原创 Linux-0.11内核分析04:进程2的创建及执行

--- init --- main.c --- sched_init() | |- init() --- setup() --- int 0x80 | |- open("/dev/tty0") --- int 0x80 | |- dup(0)...

2018-07-11 15:01:04 515

原创 Linux-0.11内核分析03:进程1的创建及执行

进程1的创建及执行1. 函数调用关系 --- init --- main.c --- sched_init() | |- hd_init() | |- fork() --- int 0x80 | |- init() --- setup() --- int 0x80...

2018-07-11 14:58:44 851

原创 Linux-0.11内核分析02:设备环境初始化及激活进程0

设备环境初始化及激活进程01. 设置根设备、硬盘/*init/main.c --------------------------------------------------------------- */#define DRIVE_INFO (*(struct drive_info *)0x90080)#define ORIG_ROOT_DEV (*(unsigned s...

2018-07-11 14:53:20 529

原创 Linux-0.11内核分析01:从开机加电到执行main函数之前的过程

1. 启动BIOS,准备实模式下的中断向量表和中断服务程序(ISR)按下电源键,处理器(IA-32)进入16位实模式,从CS:IP=0xFFFF0处开始运行。BIOS程序在主板的一块ROM芯片中,该芯片无需初始化即可直接读取,被接在处理器的0xFE000-0xFFFFF地址处。BIOS程序的入口地址被设计为0xFFFF0,因此上电过后处理器实际上运行的是BIOS程序。BIOS程序将中断...

2018-07-11 14:48:19 483

原创 主机挂载开发板的NFS文件系统

介绍手上有一块nanopi,想在上面测试写好的驱动,但是开发环境在主机上,为了方便测试,需要使用NFS服务器将开发板文件夹挂载到主机上,这个文件夹相当于一个共享文件夹,只需将写好的驱动复制到该文件夹中,在开发板中就可以看到复制进去的文件了。 注意:这里是在nanopi上搭建NFS服务器,而不是在主机中搭建,好处是任意一台主机(即使没有安装NFS服务器)都可以挂载nanopi的文件夹,坏处是如...

2018-07-05 11:53:36 602

原创 Linux驱动开发01:字符设备、互斥锁、等待队列、定时器和异步通知

介绍这里是linux驱动最基础部分,我会用一个不使用任何驱动框架、不包含任何硬件操作的程序来实现一个字符设备驱动,其中会包含互斥锁、等待队列、定时和异步通知的使用,最后分析它们在内核中到底是如何运作的。代码和验证这是一个用内存模拟的字符设备驱动,在初始化时会分配一页的内存给fifo_dev.mem_entry,在写入函数中,向这段内存的添加内容,在读取函数中从这段内存头部读取内容,然后...

2018-06-29 12:37:20 1369

原创 快速配置vim+ctags+cscope

基本使用v:进入visual模式,使用上下左右对文本进行框选 v+d:visual模式下按d,剪切文本,并回到normal模式 v+y:visual模式下按y,复制文本,并回到normal模式 p:粘贴 yy:复制一行ctagsCtrl+]:跳转到函数定义 Ctrl+t:返回cscope~/.vimrc 设置如下:if has("cscope&amp

2018-06-02 11:59:36 747

原创 一种电源自动切换电路

这里记录一种简单、易实现的电源自动切换电路,如下图所示:这里Q1为P沟道mos管,Vgs(th) = -0.7V。P1为电池接口,输入电压为3.7V~4.2V,接在mos管的D级;4V4为USB接口经稳压管转换后的电压,接在mos管的G级,D6为肖特基二极管,正向压降为0.3V;VOUT为输出,经过开关P2接在mos管的S级。以下分析三种情况:当VBAT接入,4V4没接入时,G级被下...

2018-05-31 10:41:28 26141 14

原创 git的基本使用、分支创建和冲突解决

介绍记录在Ubuntu下使用git命令更新代码到github的过程在github上创建版本库在github上注册账号获取本机的ssh密钥 $ ssh-keygen -C 'xxx' -t rsa 其中xxx处为你的电子邮箱,可以和github的注册邮箱不一致。此命令会在~/.ssh文件夹下建立保存秘钥。如果~/.ssh已经有文件,则不用执行这一步。将ssh秘钥添加到g...

2018-03-08 11:17:55 474

原创 PX4开发(2):QGroundControl的使用及电调校准——准备起飞

1. 介绍上一节把固件烧写好了,接下来进行传感器的校准了,传感器校准要使用官方的地面站,也就是QGC(QGroundControl,官网下载点击这里)。安装好QGC后打开,然后将pixhawk使用USB线连接到电脑,QGC上就可以显示当前板子的状态。 我这里是校准好了的,所以有一个绿色的小点,没有校准应该是红色的,接下来进行传感器校准,校准可以参考这个视频。 因为我们已经烧写好固件

2018-02-01 14:04:46 20057 13

原创 PX4开发(1):ubuntu下pixhawk开发环境搭建

1. 介绍之前买了个330的四轴,最近想利用起来,所以买了个pixhawk来玩。pixhawk是开源的,所以想看看能不能在其基础上开发出什么。 要做开发首先要配置环境,由于官方推荐在linux环境下开发,所以这里介绍ubuntu下pixhawk的开发环境配置。 首先,网上能够找到很多ubuntu下配置环境的博客,但是因为年代比较久远了,其中有很多坑的,我都一一踩过了,下面直接给出我测试可行...

2018-01-09 19:57:08 15285 22

空空如也

空空如也

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

TA关注的人

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