自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 【Linux】IMX6ULL 音频驱动-2

【代码】【Linux】IMX6ULL 音频驱动-2。

2022-09-29 16:02:50 208 1

原创 【Linux】IMX6ULL 音频驱动-电源管理

platform_driver电源管理。#snd_soc_pm_ops跳转。

2022-09-29 14:50:39 285

原创 【Linux】IMX6ULL 音频驱动-1

【代码】【Linux】IMX6ULL 音频驱动-1。

2022-09-29 11:30:37 210

原创 【嵌入式算法】字符串匹配KMP算法

摘要:改进的字符串匹配算法–KMP算法

2022-02-08 16:15:11 135

原创 【嵌入式算法】数据流与环形队列

摘要:对生产-消费模型的数据处理,使用环形队列管理,提高内存利用率。1、应用场景所谓生产-消费模型,即数据的产生和利用是异步处理,先”生产“了,然后才有”消费“。对嵌入式系统一般是数据接收与解析,数据缓存与发送。因为时序或者空间要求,两者需要异步处理;对于这种数据流,采用环形队列,先进先出的方式保存。2、环形队列队列是一种常用的数据结构,按照“先进先出”的原则进行操作的,环形队列是数据元素存储一轮后,再从头部开始入队,首尾相接,是一个装载固定数量元素的闭环。typedef struct{

2022-02-08 16:14:47 144

原创 【嵌入式算法】排序算法

关键字:冒泡排序、选择排序、插入排序、标准库函数qsort摘要:嵌入式系统中尤其涉及数据采集的,需要对数据进行简单处理后再进行业务层功能,考虑到硬件的资源限制,对于数据排序,一般只是应用这四种简单的排序算法。本文讲解不同算法进行从小到大的升序排列的过程。1、冒泡排序冒泡排序(bubble sort)是一种C语言入门级的简单排序算法,重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序错误进行交换。重复地检查对比直到没有相邻元素需要交换,也就是说该元素列已经排序完成。算法的名字由来是因为越小(大

2022-01-29 16:16:51 377

原创 【嵌入式算法】矩阵转置与压缩

在整个物联网系统中,嵌入式设备作为数据采集、过滤、缓存、传输的节点,前面系列文章分别介绍了嵌入式设备相关的各种数据过滤、校验和压缩存储算法。缓存和传输阶段,考虑到嵌入式设备的存储空间和传输带宽限制,数据包的压缩还可进一步优化。以嵌入式终端环境数据采集为例,以10秒间隔采样温度、湿度、气压、风速、四项环境数据,正常情况下,数据在短时间内都是小幅波动或者维持不变。假如采集结果(瞎编的,表意为主)如下表:数据按字节流存储到文件或者传输出去,占30字节。unsigned char source_data[3

2022-01-27 14:43:42 180

原创 【嵌入式算法】行程编码

1、行程编码嵌入式设备采集的数据,变化比较平缓,长时间趋于稳定的状态,其采样结果会有大量连续且相同的数值,对应这些数据,常规的压缩算法在硬件资源有限的嵌入式设备无法运行,代码空间和RAM要求不能满足的情况下,简单有效的行程编码不失为一种最佳选择。行程编码(Run Length Encoding,RLE), 又称游程编码,主要思路是将一个相同值的连续串用一个代表值和串长来代替。例如字符串“AAABBBBCCCCCJJJJJJ”,可以用“3A4B5C6J”来记录,原本长度18字节的字符串使用8个字节即可无损

2022-01-27 14:43:17 2127

原创 【嵌入式算法】MD5的应用与实现

1、MD5概念MD5信息摘要算法(MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value),用于确保信息传输完整一致。输入任意长度的数据经过处理,输出都是128位的信息(数字指纹)。不同的输入得到的不同的结果,在有限范围内是唯一的,毕竟字符的组合是无限的,大于2^128种。MD5加密过程是一个有损的加密过程,几乎不能还原出原始数据。2、MD5算法(C语言版)md5.h#ifndef MD5_H#de

2022-01-27 14:42:53 273

原创 【嵌入式算法】空间向量夹角公式及其应用

有些设备正常工作时需按合适的方位安装,比如GPS天线必须朝向天空才能保证信号最佳,温湿度传感器监测口必须朝向被测目标才能及时响应。软件需求是在安装角度异常时提醒用户改变位置。那设备如何感知当前方位呢?需要一颗加速度传感器硬件支持,辅以算法实现。1、重力加速度根据物理常识,地面上任何物体静止时都受到1g的重力加速度,且方向是竖直向下。因为倾斜角的不同,1g的加速度按向量分解到xyz三轴:acc_x=1g.sinθ.cosϕacc_y=-1g.sinθ.sinϕacc_z=1g.cosϕ符号.代

2022-01-27 14:42:26 1602

原创 【嵌入式算法】CRC校验算法

数据传输过程中差错不可避免,接收方在收到数据后,先对数据的准确性进行校验,异常数据特殊处理。校验的方式有很多,常见的有CRC循环冗余校验。CRC算法检错能力强,效率高,是信息通信领域最为普遍的校验方式。CRC校验算法应用广,且实现算法简单,但其背后的涉及的纠错码的代数理论,不是一般人可以理解的。所以,在不理解循环校验原理的基础上,贸然分析算法流程是不明智的,根据源码倒推实现流程,也不会明白为什么要这样执行?一般关注CRC以应用为主,以及为什么都是CRC16算法,得出的结果却不同。本文的意图只是这个。1、C

2022-01-27 14:42:04 502

原创 【嵌入式算法】AES加密/解密算法

需要与外界进行数据交互传输的电子产品,为保证数据安全,一般会对明文进行加密处理。总的来说就是将真正需要传输的内容转换成无法理解的数据,接收方通过预先定义的方式还原,防止第三方截取篡改。比如欧盟对数据隐私有严格的条例GDPR标准。加密算法很多,对于简单的嵌入式产品,使用对称加密算法,即加密和解密使用相同的秘钥,方便快捷。AES就属于这种,虽然存在一定风险,但对于个人消费产品已满足安全需求。1、秘钥类型AES加密按秘钥的长度分为128位(比特)、192位和256位,一般记为AES-128、AES-192和

2022-01-27 14:41:41 967

原创 【嵌入式算法】线性插值拟合算法

对于线性变化的物理量可以根据简单的换算得出测量值与实际物理量的关系,但是实际大多数被检测物理量与转换后的数字量之间不是严格的线性关系。比如热敏电阻的阻值与温度,锂电池的电压与剩余电量,不可能按步进1ohm的阻值或者0.01v的电压建立很大一张对应表。一般情况下会标定有限个参考点,通过软件算法拟合去估算实际值。已知(x0,y0)和(x1,y1),在这两个值之间插入节点,按线性函数g(x)=ax+b,计算得出g(x)=y0+(y1-y0)*(x-x0)/( x1-x0)插值节点x0与 x1的间距越小,则f(

2022-01-27 14:41:15 572

原创 【嵌入式算法】正态分布过滤疏忽误差

测量系统中误差分为系统误差、随机误差、疏忽误差三种。系统误差一般是硬件精度或缺陷导致;随机误差是偶然产生,诸多外界因素微小变化共同导致,它服从统计规律的;疏忽误差则无规律可循,且明显和事实不符合。疏忽误差的样本值偏离了总体的平均值,在样本足够多且服从正态分布的情况下,通过一系列数理统计算法过滤坏样本。均值到左一和右一个标准差之间的定积分值是68% ,均值到左二和右二个标准差之间的定积分值是95% ,均值到左三和右三个标准差之间的定积分值是99.7% 。一般情况下认为,某个采样值与均值的差值大于3倍标准差

2022-01-27 14:40:50 146

原创 【嵌入式算法】滑动平均滤波法

算数平均滤波需要多次采样后才能得出一个有效值,如果被检测量变化较快,多次采样后才输出一次有效值,表现就是系统反应迟钝。将当前采样值与之前连续的历史采样值进行平均,这样每次采样结束即可得出有效值。因为参与计算的历史值个数固定且内容不断前移覆盖更新,类似滑动的数据块窗口,因此成为滑动平均滤波算法。假如窗口为6,即每次使用最近5个历史值与当前最新值求算数平均值,输出一个有效值;下个周期再覆盖最早时间的点做同样操作。类似环形数组,求最近6个值的平均值。#define SUM_WIN_SIZE 6int

2022-01-27 14:40:18 675

原创 【嵌入式算法】算数平均滤波法

随机干扰随着数据样本的增加,其统计平均值越趋于零,对被检测物理量进行连续多次采样,然后求其算数平均值作为有效采样值,就可以抑制随机干扰。以检测电池电压为例,因为负载变化,比如开启大功率模块,电池电压瞬时值会下降,关闭时会有个小的回升。假设期望1分钟更新一次,需要在这个频率的基础上按倍提高检测频率,如每15秒采集一次,取4次的平均值作为1分钟一次的有效值。#define SAMPLE_NUM 4int vBat[SAMPLE_NUM];//假设已经通过其他方式采集到了4次电压值,且缓存在vBat数

2022-01-27 14:39:34 345

原创 【嵌入式算法】差值滤波补偿法

现实中的物理量都是连续的模拟量,其变化需要一定时间,且在短时间内的变化量有一个合理的限度。例如气温,短时间内前后两个采样值的差值必定有个最大范围,基于这个条件可以对其中明显受到干扰的无效值进行剔除。本次的无效采样值排除后,再根据前面数据的变化趋势,预测一个合理的数据替代本次的问题值,而不是直接使用上次的结果。1、 什么样的采样值为无效值根据物理量的检测范围,和在采样间隔内最大的变化可能来定义,如气温检测,可定义温度在正负50度之间,如果采样间隔是1分钟,那气温在1分钟内最多变化5度。实际应用需要根据使用

2022-01-21 12:50:29 243

原创 【嵌入式C语言系列】关键字详解【typedef】

typedef用法typedef工具是一个高级数据特性,利用typedef可以为某一类型自定义名称。这方面与#define类似,但是两者有三处不同:与#define不同,typedef创建的符号只受限于类型,不能用于值;tyedef由编译器解释,不是预处理器;在其受限范围内,typedef比#define更灵活;使用typdef时要记住,typedef并没有创建任何新类型,它只是为某个已有的类型增加了一个方便使用的标签。假设要用BYTE表示1字节的数组,只需要像定义个char类型变量一样定

2022-01-21 08:39:57 354

原创 【嵌入式C语言】预处理器和预处理指令

预处理指令#define、#include、#ifdef、#else、#endif、#ifndef、#if、#elif、#line、#error、#pragma调试__FILE__ //表示编译的源文件名__LINE__ //表示当前文件的行号__FUNCTION__ //表示函数名__DATE__ //表示编译日期__TIME__ //表示编译时间printf("file:%s,line:%d,date:%s,time:%s",__FILE__,__LINE__,_

2022-01-21 08:39:35 205

原创 【嵌入式C语言】关键字详解【void与void*】

void表示的是无类型,不能声明变量或常量,但是可以把指针定义为void类型,如void* ptr。void* 指针可以指向任意类型的数据,在C语言指针操作中,任意类型的数据地址都可转为void* 指针。因为指针本质上都是unsigned int。常用的内存块操作库函数:void * memcpy( void *dest, const void *src, size_t len );void * memset( void *buffer, int c, size_t num);数据指针为void

2022-01-21 08:39:04 522

原创 【嵌入式C语言系列】关键字详解【enum】

enum用法C语言中用来修饰枚举类型变量的关键字。在C语言中可以使用枚举类型声明符号名称来表示整型常量,使用enum关键字可以创建一个新的“类型”并指定它可具有的值(实际上,enum常量是int类型,因此只要能使用int类型的地方就可以使用枚举类型)。enum [枚举类型名] { 枚举符 1, 枚举符 2, ... 枚举符 n,};enum color{ red, green, blue, yellow};enum常量在上面的例子中,red, greeb, blue

2022-01-20 15:37:10 465

原创 【嵌入式C语言系列】关键字详解【struct】

struct用法此声明描述了一个由n个数据类型的成员组成的结构,它并未创建实际的数据对象,只描述了该对象由什么组成。C的结构的声明格式如下:struct [结构体名] { 类型标识符 成员名 1; 类型标识符 成员名 2; ... 类型标识符 成员名 n;};struct关键字,它表明跟在其后的是一个结构,后面是一个可选的标记,后面的程序中可以使用该标记引用该结构,因而我们可以在后面的程序中可以这样声明:struct [结构体名] 结构体变量;在结构体声明中用一对花括号括起来的

2022-01-20 15:36:28 509

原创 【嵌入式C语言系列】关键字详解【volatile】

volatilevolatile原意是“易变的”,在嵌入式环境中用volatile关键字声明的变量,在每次对其值进行引用的时候都会从原始地址取值。由于该值“易变”的特性所以,针对其的任何赋值或者获取值操作都会被执行(而不会被优化)。由于这个特性,所以该关键字在嵌入式编译环境中经常用来消除编译器的优化,可以分为以下三种情景:修饰硬件寄存器;修饰中断服务函数中的非自动变量;在有操作系统的工程中修饰会被多个应用修改的变量;修饰硬件寄存器以STM32F103的HAL库函数中GPIO的定义举例,如下为

2022-01-20 15:35:36 2049

原创 【嵌入式C语言系列】关键字详解【作用域和static】

作用域和static块作用域块作用域:一对花括号 “{}” 括起来的代码区域void fun(void){ for (int i = 0; i<10; i++) { ... }}/*变量i的作用域则在for循环体内,当循环结束后,变量就会被释放,可见其作用域缩小了.这样的好处是增加了安全性和灵活性。*/局部变量局部变量:变量被定义在函数体内,其有效范围是在被定义的函数内,函数执行完毕后变量即被释放。局部变量会在每次声明的时候被重新初始化(如果在声明的时候有初始化赋值

2022-01-20 15:34:45 488

原创 【嵌入式C语言系列】关键字详解【const】

constconst修饰变量const修饰变量,功能是对变量声明为只读特性,并保护变量值以防被修改。const修饰变量,还起到了节约空间的目的,通常编译器并不给普通const只读变量分配空间,而是将他们保存在符号列表中,无需读写内存操作,程序执行效率也会提高。const int i = 5;int const i = 5;const修饰数组const修饰数组,表明此数组具有只读性,一旦被更改程序会出错。const int array[5] = {0,1,2,3,4};int

2022-01-20 15:32:43 606

原创 【嵌入式C语言系列】数据类型

2022-01-20 15:12:39 213

原创 【嵌入式C语言系列】位运算

按位与运算符(&)参与运算的两个操作数,每个二进制位进行“与”运算,若两个都为1,结果为1,否者为0。例如,1011&1001,第一位都为1,结果为1;第二位都为0,结果为0;第三位一个为1,一个为0,结果为0;第四位都为1,结果为1。最后结果为1001。按位或运算符(|)参与运算的两个操作数,每个二进制位进行“或”运算,若两个都为0,结果为1,否者为1。例如,1011 | 1001,第一位都为1,结果为1;第二位都为0,结果为0;第三位一个为1,一个为0,结果为1;第四.

2022-01-20 15:10:13 3529 2

原创 【嵌入式C语言系列】指针

指针初始化指针变量指针是一个值为内存地址的变量。正如char类型变量的值是字符,int类型变量的值是整数,指针变量的值是地址。创建指针变量,首先要声明指针变量的类型。int *pi; // pi 是指向 int 类型变量的指针char *str; // str 是指向 char 类型变量的指针float *pf, *pg; // pf, pg 都是只想 float 类型变量的指针// 定义的同时进行初始化int a = 5; int *p = &a;// 先定义后初始化in

2022-01-20 14:54:54 1182

4G5G测试脚本F03X-chat-connect

4G5G测试脚本F03X-chat-connect

2022-10-21

4G5G测试脚本 F03X F03X

4G5G测试脚本 F03X F03X

2022-10-21

AMIXER工具_Linux音频驱动

AMIXER工具_Linux音频驱动

2022-09-28

空空如也

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

TA关注的人

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