自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 结构体对齐

结构体大小一定是最大类型的字节数的整数倍为32(注意最大为8字节对齐)

2022-05-31 16:45:00 190 1

原创 VCL和NAL

VCL和NAL1.VCL只关心编码部分,重点在于编码算法以及特定硬件平台的实现,VCL输出的是编码后的纯视频流信息,没有任何冗余头信息。NAL关心是是VCL的输出纯视频流如何被表达和封包以利于网络传输。封包目的别人知道怎么传输和解码(1)SODB:string of Data Bits(2)RBSP:Raw Byte Sequence Payload (3)NALU:Network Abstraction Layer Units关系:(4)SODB + RBSP trailing bits

2022-04-29 01:48:28 1674

原创 H264的一些基本概念

H264帧结构(1)为什么图像能编码图像冗余信息:空间冗余:指一副图片的冗余一副图片中的像素都是一样的。图像内部相邻像素之间存在较强的相关性多造成的冗余,图像内部相邻像素之间存在较强的相关性多造成的冗余。同一景物表面上采样点的颜色之间往往存在着空间连贯性,但是基于离散像素采样来表示物体颜色的方式通常没有利用这种连贯性。可借助其相邻像素的灰度值进行推断是否存在空间冗余,它是是静态图像中存在的最主要的一种数据冗余。 例如:图像中有一片连续的区域,其像素为相同的颜色,空间冗余产生。时间冗余:上一秒和下一秒

2022-04-27 23:52:34 300

原创 linux内核源码各个目录

1.arch目录里面用来区分不同硬件平台,有X86平台代码,有ARM平台的代码等2.boot目录是ARM平台启动相关代码,所以是通用的代码3.代表不同公司基于ARM芯片出的硬件平台,比如mach-s3c64xx三星的,imx飞死卡尔,例如arm/mach-omap1,即ti公司的soc,此soc的cpu核是ARM提供进入目录公司针对硬件平台加的代码,这些C代码主要实现ARM平台初始化代码,比如CPU初始化代码,SD卡初始化代码,在arm目录下不同公司平台的初始化代码4**.Documenta

2022-04-23 15:19:17 3293

原创 按键扫描函数

2022-04-20 23:53:26 751

原创 两个蓝牙模块之间的通信配对

COM 10为主COM 4 为从主机(1)恢复默认状态灯快闪,需重新进入AT模式(2)设置配对码AT+PSWD="1314"(3)然后主机模式AT+ROLE=1(4)然后绑定从机地址*从机*1.先恢复默认设置2.然后设置配对码必须和主机一样AT+PSWD="1314"3.然后从机模式AT+ROLE=04.获取从机蓝牙地址AT+ADDR?获取地址如下地址为00: 21: 11: 02:07:CA主机绑定从机地址(5)设置波特率

2022-04-20 22:40:05 4311 1

原创 四脚oled源码

.c#include <OLED.H>#define Uchar unsigned char#define Uint unsigned int#define Ulong unsigned long#define uchar unsigned char#define uint unsigned intunsigned char OLED_GRAM[128][8]={0};//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

2022-04-19 22:12:30 810

原创 STM32的DMA

把外设的数据寄存器的地址写到CPARx寄存器如果数据从内部存储器来就要把地址写到CMARx寄存器方向目标宽度和源宽度不一致,最大量655352.存储器到存储器段(1)代码段(2)只读数据段 存放有初始值并且const修饰的全局变量(static的局部变量)static修饰的全局变量和函数起到隐藏作用(3)数据段 存放有初始值的全局变量(4)bss段 存放没有初始值的全局变量和初始值为0的全局变量(5)注释段存放于只读数据段中,加const修饰存储在片内的F...

2022-04-18 23:19:55 342

原创 USART的格式

硬件知识_UART硬件介绍1. 串口的硬件介绍UART的全称是Universal Asynchronous Receiver and Transmitter,即异步发送和接收。串口在嵌入式中用途非常的广泛,主要的用途有:打印调试信息;外接各种模块:GPS、蓝牙;串口因为结构简单、稳定可靠,广受欢迎。通过三根线即可,发送、接收、地线。通过TxD->RxD把ARM开发板要发送的信息发送给PC机。通过RxD->通过TxD->RxD把ARM开发板要发送的信息发送给PC机。

2022-04-16 19:27:49 687

原创 STM32的spi读写FLASH

初始化flash cs3.##########高位先读secpos得出哪个扇区,因为一个扇区就是4096个地址if(NumByteToWrite<=secremain)secremain=NumByteToWrite;//不大于4096个字节小于扇区剩余量(1)EN25QXX_Read(EN25QXX_BUF,secpos4096,4096);//读出整个扇区的内容(2)for(i=0;i<secremain;i++)//校验数据{if...

2022-04-15 18:00:58 1187

原创 32内存管理

malloc.c#include "malloc.h"//内存池(32字节对齐)__align(32) u8 mem1base[MEM1_MAX_SIZE]; //内部SRAM内存池//内存管理表u16 mem1mapbase[MEM1_ALLOC_TABLE_SIZE]; //内部SRAM内存池MAP//内存管理参数 const u32 memtblsize[SRAMBANK]={MEM1_ALLOC_TABLE_SIZE}; //

2022-04-08 23:36:46 115

原创 指针与数组

左值与右值(1)放在赋值运算符左边的就叫左值,右边的就叫右值。所以赋值操作其实就是:左值 = 右值;(2)当一个变量做左值时,编译器认为这个变量符号的真实含义是这个变量所对应的那个内存空间;当一个变量做右值时,编译器认为这个变量符号的真实含义是这个变量的值,也就是这个变量所对应的内存空间中存储的那个数。(3)左值与右值的区别,就好象现实生活中“家”这个字的含义。譬如“我回家了”,这里面的家指的是你家的房子(类似于左值);但是说“家比事业重要”,这时候的家指的是家人(家人就是住在家所对应的那个房子里面的

2022-04-08 22:20:29 294

原创 Linux内核驱动-Kconfig和Makefile

1.在linux编写驱动的过程中,有两个文件是我们必须要了解和知晓的。这其中,一个是Kconfig文件,另外一个是Makefile文件。如果大家比较熟悉的话,那么肯定对内核编译需要的.config文件不陌生,在.config文件中,我们发现有的模块被编译进了内核,有的只是生成了一个module。这中间,我们如何让内核发现我们编写的模块呢,这就需要在Kconfig中进行说明。至于如何生成模块,那么就需要利用Makefile告诉编译器,怎么编译生成这个模块。模仿其实就是最好的老师,我们可以以内核中经常使用到的网

2022-04-06 22:34:50 492

原创 Linux内核模块插入与删除实战

1、使用mkdir创建目录文件夹,名称自己取2、在自己创建的目录下,编写vm.c内核里面不能使用printf()函数印信息,内核只能使用printk()函数/* printk相当于printf的孪生兄弟,她们一个运行在用户态的,另一个则在内核态被人们所熟知的。但是根据不同的操作系统也会有不一样的效果,例如编写一个hello word 内核模块,使用这个函数不一定会将内容显示到终端上,但是一定在内核缓冲区里,可以使用dmesg查看效果。*/#include<linux/init.h>

2022-04-06 22:27:45 679

原创 Linux内核内存管理

Linux内核源码分析:内存管理子系统架构(用户空间、内核空间、硬件层面)一、虚拟地址布局/内存映射1、虚拟地址空间划分1)用户虚拟地址空间布局目前应用程序没有那么大的内存需求、所以ARM64处理器不支持完全的64位虚拟地址,虚拟地址的最大宽度是48位,如下图所示:2)内核地址空间布局ARM64处理器架构的内核地址空间布局如下图所示:2、物理地址空间物理地址是处理器在系统总线上看到的地址。使用精简指令集(Reduced Instructions Set Computer,RISC)的处

2022-04-06 22:21:49 1187

原创 sizeof的认识

指针、数组与sizeof运算符(1)sizeof是C语言的一个运算符(主要sizeof不是函数,虽然用法很像函数),sizeof的作用是用来返回()里面的变量或者数据类型占用的内存字节数。(2)sizeof存在的价值?主要是因为在不同平台下各种数据类型所占的内存字节数不尽相同(譬如int在32位系统中为4字节,在16位系统中为2字节···)。所以程序中需要使用sizeof来判断当前变量/数据类型在当前环境下占几个字节。1、char str[] = ”hello”; sizeof(str) sizeo

2022-04-05 14:35:55 425

原创 中断控制器处理流程

1. 一级中断控制器处理流程对于irq_desc,内核有两种分配方法:一次分配完所有的irq_desc按需分配(用到某个中断才分配它的irq_desc现在的内核基本使用第1种方法。假设GIC可以向CPU发出161019号中断,这些数字被称为hwirq。015用于Process之间通信,比较特殊。假设要使用UART模块,它发出的中断连接到GIC的32号中断,分配的irq_desc序号为16在GIC domain中会记录(32, 16)那么注册中断时就是:request_irq(16,

2022-04-01 00:31:35 439

原创 GIC的认识

GIC介绍​ ARM体系结构定义了通用中断控制器(GIC),该控制器包括一组用于管理单核或多核系统中的中断的硬件资源。GIC提供了内存映射寄存器,可用于管理中断源和行为,以及(在多核系统中)用于将中断路由到各个CPU核。它使软件能够屏蔽,启用和禁用来自各个中断源的中断,以(在硬件中)对各个中断源进行优先级排序和生成软件触发中断。它还提供对TrustZone安全性扩展的支持。GIC接受系统级别中断的产生,并可以发信号通知给它所连接的每个内核,从而有可能导致IRQ或FIQ异常发生。从软件角度来看,GIC具有

2022-03-31 23:50:26 883

原创 中断的硬件框架

中断的硬件框架1.1 中断路径上的3个部件中断源中断源多种多样,比如GPIO、定时器、UART、DMA等等。它们都有自己的寄存器,可以进行相关设置:使能中断、中断状态、中断类型等等。中断控制器各种中断源发出的中断信号,汇聚到中断控制器。可以在中断控制器中设置各个中断的优先级。中断控制器会向CPU发出中断信号,CPU可以读取中断控制器的寄存器,判断当前处理的是哪个中断。中断控制器有多种实现,比如:STM32F103中被称为NVIC:Nested vectored interrupt c

2022-03-31 23:12:27 515

原创 OLED操作

有数据输出引脚,时钟引脚,片选引脚,还有与GPIO相连DC引脚,用来分辨传输的数据还是命令本身。来驱动屏幕(1)用通过SPI接口来初始化SSDB06,然后把数据写入图像显示内存,显存里每一位数据对应屏幕每一个像素。7脚接口OLEDOLED只需要发数据给OLED所以只有MOSI。左边第一个第0位对应右边第一个数据,一页对应8行,地址应确定哪一页还有哪一列,发出数据每次写完列数增一内核有字库文件单片机中的OLED1.一页的显存大小下面每次画点完后再去调用。...

2022-03-27 22:25:23 939

原创 中断和优先级

《CM3权威指南》讲解的是Cortex-M3内核的整个体系,例如指令集、异常、 MPU等,《CM3编程手册》中则是关于STM32F10/20/21/L1系列使用到的Cortex-M3的内容。换句话说《CM3编程手册》 是《CM3权威指南》的一个子集,本章内容就是参考这两个手册,对于本章没提到的内容,读者可自行阅读这两个手册扩展学习。Cortex-M3内核有256种异常和中断,其中编号1~15是系统异常, 16~256是外部中断所如此多的中断, 导致了一些新问题。 比如两个中断同时发生,应该先执行哪个中断

2022-03-25 16:15:18 7844

原创 指针强转的知识

指针与强制类型转换变量的数据类型的含义(1)所有的类型的数据存储在内存中,都是按照二进制格式存储的。所以内存中只知道有0和1,不知道是int的、还是float的还是其他类型。(2)int、char、short等属于整形,他们的存储方式(数转换成二进制往内存中放的方式)是相同的,只是内存格子大小不同(所以这几种整形就彼此叫二进制兼容格式);而float和double的存储方式彼此不同,和整形更不同。(3)int a = 5;时,编译器给a分配4字节空间,并且将5按照int类型的存储方式转成二进制存到a

2022-03-22 13:51:44 321

原创 2440的DMA驱动

1.kmalloc 分配的虚拟地址连续,物理地址一定连续2.想用DMA必须分配连续的内存3. kmalloc特殊之处在于它分配的内存是物理上连续的,这对于要进行DMA的设备十分重要. 而用vmalloc分配的内存只是线性地址连续,物理地址不一定连续,不能直接用于DMA。定义源src 目的dst 源物理地址src_phys 目的物理地址dst_phys 大小定义宏4.在驱动的入口函数分配缓冲区(注意不能用vmalloc分配出来物理地址不一定连续)第一个源表示在系统总线上还是外

2022-03-07 23:17:44 261

原创 模拟信号量对buffer读写

1.demo2.c主要解决内存满了问题和读写速度不一致问题即读的比写的快。#include <stdio.h>#include <pthread.h>#include <string.h>#include "demo2.h"#define MAX_BUFFER_NUM 5#define MAX_DATA_LENGTH 1024 /* 设置句柄类 */typedef struct { char abyBuf[MAX_D

2022-03-02 15:49:08 385

原创 条件变量和信号量

1.pthread./pthread &显示进程号ps 查看进程号ps -T 查看线程号也可以进入进程的proc目录查看线程#include <pthread.h>#include <stdio.h>#include <unistd.h>#include <semaphore.h>static char g_buf[1000];static sem_t g_sem;static void *my_thread_func

2022-02-24 22:29:36 411

原创 DMA-搬运工

DMA-搬运工1.DMA(Direct Memory Access)直接内存访问,可以把数据从一个地方传输到另一个地方,不会占用我们的cpu。CPU根据代码内容执行指令,这些众多指令中,有的用于计算、有的用于控制程序、有的用于转移数据等。其中转移数据的指令,尤其是转移大量数据,会占用大量CPU。如果是把外设A的数据,传给外设B,这种情况其实不需要CPU一直参与,只需在A、B之间创建个通道,让它们自己传输即可。这就是DMA设计的目的,减少大量数据转移指令。DMA主要实现将A处的数据直接搬运到B

2022-02-15 12:38:55 1367

原创 基于固件库的spi

SPI结构体typedef struct{ uint16_t SPI_Direction; //方向 uint16_t SPI_Mode; //模式 uint16_t SPI_DataSize; //数据大小 uint16_t SPI_CPOL; //时钟极性 uint16_t SPI_CPHA; //时钟相位 uint16_t SPI_...

2022-02-14 20:26:00 419

原创 SPI通信协议

SPI(Serial Peripheral Interface,串行外设接口)是由摩托罗拉(Motorola)在1980前后提出的一种全双 工同步串行通信接口,它用于MCU与各种外围设备以串行方式进行通信以交换信息,通信速度最高可达 25MHz以上。SPI接口主要应用在EEPROM、FLASH、实时时钟、网络控制器、OLED显示驱动器、AD转换器,数字信号处理器、数字信号解码器等设备之间。SPI通常由四条线组成,一条主设备输出与从设备输入(Master Output Slave Input,MOS...

2022-02-13 23:00:47 10018

原创 基于固件库的软件i2c

软件i2c通过模拟i2c时序配置普通的gpio引脚,首先封装一个函数static void OLED_GPIO_Init(void){ GPIO_InitTypeDef GPIO_InitStructure; /* 定义一个gpio结构体 */ RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE); /* 打开gpioc使能时钟 */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO...

2022-02-13 00:17:46 974

原创 初识网络通信

网络通信1.IP和端口怎么表示源或者目的呢?请看下图:所有的数据传输,都有三个要素 :源、目的、长度。网络传输中的2个对象:server和client我们经常访问网站,这涉及2个对象:网站服务器,浏览器。网站服务器平时安静地呆着,浏览器主动发起数据请求。网站服务器、浏览器可以抽象成2个软件的概念:server程序、client程序。两种传输方式:TCP/UDP在一般的网络书籍中,网络协议被分为5层,如下图所示:应用层:它是体系结构中的最高层,直接为用户的应用进程(例如电子邮件、文件传输

2022-02-12 19:55:01 167

原创 socket通信

对TCP/IP、UDP、Socket编程这些词你不会很陌生吧?随着网络技术的发展,这些词充斥着我们的耳朵。那么我想问: 什么是TCP/IP、UDP? Socket在哪里呢? Socket是什么呢? 你会使用它们吗?什么是TCP/IP、UDP? TCP/IP(Transmission Control Protocol/Internet Protocol)即传输控制协议/网间协议,是一个工业标准的协议集,它是为广域网(WANs)设计的。

2022-02-12 19:36:48 723

原创 进程与线程

Linux多线程编程初探Linux线程介绍进程与线程  典型的UNIX/Linux进程可以看成只有一个控制线程:一个进程在同一时刻只做一件事情。有了多个控制线程后,在程序设计时可以把进程设计成在同一时刻做不止一件事,每个线程各自处理独立的任务。进程是程序执行时的一个实例,是担当分配系统资源(CPU时间、内存等)的基本单位。在面向线程设计的系统中,进程本身不是基本运行单位,而是线程的容器。程序本身只是指令、数据及其组织形式的描述,进程才是程序(那些指令和数据)的真正运行实例。线程是操作系统能够进行运

2022-02-12 19:33:23 970

原创 进程和线程

Linux系统学习——线程、互斥锁、条件篇一、Linux线程和进程概念解析典型的UNIX/Linux进程可以看成只有一个控制线程:一个进程在同一时刻只做一件事情。有了多个控制线程后,在程序设计时可以把进程设计成在同一时刻做不止一件事,每个线程各自处理独立的任务(1)进程与线程(2)使用线程的理由(面试笔记)可参考大佬解析:Linux多线程编程初探二、线程API解析:三、互斥锁API解析:互斥量本质为一把锁,加锁和解锁之间的代码都为互斥量互斥变量用 pthread_mutex_t 数据类型表

2022-02-12 19:31:09 623

原创 PC和开发板之间传输文件

1.在Ubuntu中安装、配置NFS如果你使用的是我们提供的Ubuntu,那么已经安装好了NFS服务。查看一下/etc/export的内容,就知道开发板可以挂载哪一个目录。如果该文件中没有指定目录,请继续往下看。如果你的Ubuntu未安装NFS服务,那么在确保Ubuntu可以上网的前提下,执行以下命令:sudo apt-get install nfs-kernel-server然后,还得修改/etc/exports,添加类似以下的内容,下面的例子里允许开发板通过NFS访问Ubuntu的/home/

2022-02-11 23:37:09 1585

原创 使用Buildroot编译文件系统

使用Buildroot构建根文件系统Buildroot简介制作根文件系统有归多种方法:① 使用Busybox手工制作Busybox本身包含了很了Linux命令,但是要编译其他程序的话需要手工下载、编译,如果它需要某些依赖库,你还需要手工下载、编译这些依赖库。如果想做一个极简的文件系统,可以使用Busybox手工制作。② 使用Buildroot自动制作它是一个自动化程序很高的系统,可以在里面配置、编译内核,配置编译u-boot、配置编译根文件系统。在编译某些APP时,它会自动去下载源码、下载它的

2022-02-11 22:57:13 2880

原创 硬件i2c

STM32的IIC特性及架构·通讯引脚·时钟控制逻辑·数据控制逻辑在stm32f103中文参考手册120页i2c重映射引脚时钟控制逻辑SCL线的时钟信号,由IIC接口根据时钟控制寄存器(CCR)控制,控制的参数主要位时钟频率。·可选择IIC通讯的“标准/快速”模式,这两个模式分别对应100/400Kbits/s的通讯速率。·在快速模式下可选择SCL时钟的占空比,可选T(low)/T(high) = 2或T(low)/T(high)=16/9模式。·CCR寄存器中12位的...

2022-02-11 17:46:33 5890

原创 裸机i2c框架

对于不同种i2c控制器提供通用的接口把i2c数据发送出去,还是从i2c设备里面读到数据我们模仿内核函数自已构造i2c_transferint i2c_transfer(p_i2c_msg msgs, int num)参数p_i2c_msg msgs/*构造信息结构体*/typedef struct i2c_Msg{ unsigned int addr; int len; int flags; int cnt_transferred; int err; ...

2022-02-10 23:21:46 313

原创 llc通信协议

1.IIC通讯协议(Inter----Integrted Circuit)是由Phiips飞利浦公司开发的,由于他引脚少,硬件实现简单,可拓展性强,不需要UASRT,CAN通讯协议的外部收发设备,现在被广泛使用在系统内多个集成电路IC(芯片)间的通讯。半双工的通讯方式 IIC通讯协议(Inter----Integrted Circuit)是由Phiips飞利浦公司开发的,由于他引脚少,硬件实现简单,可拓展性强,不需要UASRT,CAN通讯协议的外部收发设备,现在被广泛使用在系统内多个集成电路IC(芯片)

2022-02-10 14:10:11 7947 2

原创 stm32hal库工程模板搭建

使用HAL库需要为工程准备许多相关文件,也就是创建HAL库的工程模板。工程模块没有统一的格式, 通常是根据多年的开发经验和使用习惯总结出来的。各文件夹、文件说明如下: Core:存放从SDK文件夹抽取的部分可能会修改的核心文件; Driver: 存放用户编写的外设驱动文件; Main: 存放主函数文件; Project: 存放Keil工程文件,包含目标二进制文件; SDK:存放CMSIS和HAL库; Clean.bat:Windows脚本,用于清理Project里Keil生成的工

2022-02-08 22:24:34 1696

原创 回调函数的了解

在C语言中回调函数是函数指针的高级应用。所谓回调函数,一个笼统简单的介绍就是一个被作为参数传递的函数。从字面上看,回调函数的意思是:一个回去调用的函数,如何理解这句话呢?从逻辑上分析,要“回去”,必然存在着一个已知的目的地,然后在某一个时刻去访问;那么回调函数就是存在一个已知的函数体A,将这个函数体A的地址即函数名“A”(函数名即是这个函数体的函数指针,指向这个函数的地址)告知给另外某个函数B,当那个函数B执行到某一步的时候就会去执行函数A。带参数的回调函数#include<stdio.h&

2022-02-08 20:57:52 54

j3环视q111111

j3环视q111111

2024-07-05

模板i2c引脚的配置111

模板i2c引脚的配置111

2024-03-04

高通8155引脚配置大大大

高通8155引脚配置大大大

2024-03-04

ais-v4l2-proxy

ais-v4l2-proxy

2024-03-04

qnx ais server

qnx ais server

2024-03-04

capture.c

capture.c

2022-12-05

空空如也

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

TA关注的人

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