- 博客(174)
- 资源 (5)
- 收藏
- 关注
原创 一文搞懂设备树基础语法
目录1、设备树的引入设备树语法1、设备树的引入首先需要了解Linux系统平台总线设备驱动模型的框架在这篇博客中我概述了如何快速通过平台总线设备驱动模型来编写驱动程序。在这个模型中,我们提供了通用的硬件驱动程序,对于不同的单板,我们只需要提供对应的board_xxx.c提供对应的硬件资源即可。那么出现一个问题,对于同一款芯片我们有成千上万的单板,因此就会存在成千上万的单板程序在内核当中。另外一个问题是,当你需要在单板中更改硬件资源,就需要重新编译对应的单板文件。总结起来:#mermaid-svg-8Qx
2021-07-05 21:12:02
3536
2
原创 数据结构和算法系列第2篇---栈的基本操作
目录前言一、栈的相关定义二、栈的顺序存储结构及实现三、栈的链式存储结构及实现栈的链式存储结构---进栈操作栈的链式存储结构---出栈操作实战运用1、回文链表2、有效的括号前言在软件应用中,栈这种后进先出数据结构的应用非常普遍。因此栈也成为了广大程序猿必须要掌握并且能够熟练运用的一种数据结构。一、栈的相关定义允许插入和删除的一端称为栈顶,另一端为栈底。栈又称为后进先出的线性表。简称LIFO结构二、栈的顺序存储结构及实现栈的结构定义typedef int SElementType;typedef
2021-07-05 14:02:56
434
原创 Beyondcompare4
2.进入目录/home/igs/.config/,删除整个文件夹:bcompare。点击enter Key…Ubuntu版BeyondCompare4 注册码失效解决方法。3.进入beyondcompare安装目录。1.找到bcompare所在位置。当注册码失效时,会出现以下界面。
2026-06-30 14:49:10
364
原创 heap4 内存管理部分源码分析
FreeRTOS 要求分配的内存块起始地址按 portBYTE_ALIGNMENT(通常是 8 字节)对齐。每个内存块前面需要存储管理信息(BlockLink_t 结构体),大小为 xHeapStructSize。如果 a > (SIZE_MAX - b),则 a + b 会溢出。分配后的内存块结构:[HeapStruct | 用户数据]剩余空闲块结构:[HeapStruct | 剩余空闲内存]原理:检查 a + b 是否超过 size_t 的最大值。空闲块结构:[HeapStruct | 可用空闲内存]
2026-01-12 14:44:07
434
原创 项目代码总结
sizeof( BlockLink_t ) 为8,portBYTE_ALIGNMENT 为8,portBYTE_ALIGNMENT_MASK 为 0x0007,则 计算出来的xHeapStructSize 为 8。C 库函数 struct tm *localtime(const time_t *timer) 使用 timer 的值来填充 tm 结构。这是一个经典的宏参数展开技巧,主要作用是确保宏参数被完全展开后再进行字符串化。timer:指向 time_t 类型变量的指针,用于存储时间值。
2026-01-09 10:49:29
288
原创 cmbacktrace
在 C 语言中引用链接脚本符号时加 & 是因为这些符号代表的是地址值而非实际变量。通过使用取地址操作符,我们可以获取这些符号表示的地址,从而在程序中使用这些预定义的内存位置。在 C 语言中,当我们引用链接脚本中定义的符号时,通常需要加上 &(取地址符),这是因为链接脚本中定义的符号本质上代表的是一个内存地址,而不是一个具有存储空间的变量。链接脚本中定义的符号(如 _estack = .;这样我们就得到了链接脚本中定义的 _estack 的地址值。1、在C 中引用 链接脚本中的符号,为什么要加 &
2025-08-21 14:09:51
464
原创 音频单位dbFS的理解
dBFS(decibels relative to full scale)是描述音频信号在数字系统中的幅度的单位。因此,在录音和混音过程中,工程师们通常会密切监控dBFS值,以确保音频信号处于理想的范围内。范围:dBFS 的值是负的,范围从-∞到0dBFS,其中0dBFS表示满刻度(Full Scale),即最大可能的信号电平。参考点:dBFS是相对于系统的最大值进行度量的,因此它没有“绝对”的物理意义,只在数字系统内具有相对意义。dBFS:用于数字音频系统内,描述相对于最大可能值的信号电平。
2025-07-30 16:19:29
955
原创 32位 DMIC 数据 其中高八位为符号位扩展位的理解
它们只是原始符号位 S[23] 的副本,没有提供新的信息。DATA[31:24] (高 8 位): S[23] S[23] S[23] S[23] S[23] S[23] S[23] S[23] (即符号位 S[23] 被复制了 8 次)DATA[23:16]: S[23] S[22] S[21] S[20] S[19] S[18] S[17] S[16] (原始最高字节)DATA[7:0] (低 8 位): S[7] S[6] S[5] S[4] S[3] S[2] S[1] S[0]
2025-07-17 17:38:48
561
原创 audio 调试
tdm 发送中断中做了gpio的翻转,正常1ms 翻转一次,产生一个方波,但是图中有红色方框中的问题,即频繁进入了tdm 发送中断,方波正常的前提是clk是准确的,但是当AR1 也操作clk 就会有问题,如果AR1 拉高clk,mcu 需要拉低clk,clk 可能就会快速的0 1 翻转。因此推断AR1 做了master 一段时间的结论由此而来。
2025-07-16 18:18:32
304
原创 音频调试经验总结
agmplay /data/1648_Sweep_-6db_log_stereo_15s.wav -D 100 -d 100 -i MI2S-LPAIF_VA-RX-PRIMARY -skv 0xA1000001 -svol 1 // 其中skv 参数指的是 高latence (buffer 比较大,适用不需要快速响应的播放场景,如音乐)安卓指令后加上 & 代表 该指令的应用程序开始在后台运行,下一条指令可以开始执行,如果不加的话,则串行执行所有指令。
2025-07-02 12:02:17
478
原创 DMA之 Trigger input和 Trigger Output 概念
例子: DMA将一组数据从内存搬运到SPI发送数据寄存器后,DMA的 Trigger Output 可以连接到SPI的“开始传输”触发输入,告诉SPI:“数据已经准备好了,你现在可以开始发送了”。理解DMA(直接内存访问)中的 Trigger Output(触发输出) 和 Trigger Input(触发输入) 的关键在于明确“谁”在触发“谁”,以及信号流动的方向。DMA传输的启动/继续: 本质上,DMA传输(无论是从外设到内存,内存到外设,还是内存到内存)需要由一个事件来启动或继续下一个数据块的传输。
2025-06-28 14:54:35
670
原创 数字音频之PDM
当数字信号为0时,输出为Vref-。反之,模拟信号的幅值越小,对应数字信号0的密度就越大。ΔΣ调制的英文是Delta-Sigma Modulation,译为三角积分调制,也可写作Sigma-Delta (ΣΔ) Modulation,缩写为SDM。通过以上过程,模拟信号就变成了二进制的调制信号,而且调制器输出中“1”的密度正比于模拟输入信号的幅值,如果输入电压上升,比较器将产生更多数量的"1",反之亦然。PDM(脉冲密度调制)与PCM(脉冲编码调制)都是模拟信号的数字化方法,也代指调制后产生的数字信号。
2025-06-28 11:58:01
2698
原创 通过PC 指针、反汇编工具定位设备运行现场的方法
查看ambiq 平台 apollo4 blue plus的运行现场,怎样通过Jlink commander 反汇编工具、通过堆栈指针、程序计数器等查看当前设备的运行现场,请详细介绍下方法,最好有指导例程。若需进一步优化调试流程,建议结合IDE(如Keil或VSCode+GDB)进行源码级调试。Cortex-M 设备的指令地址通常是 2 或 4 字节对齐的,若反汇编结果出现非对齐指令,可能是数据段被误解析。工具(属于 GNU 工具链的一部分)可以反汇编 ARM Cortex-M 设备的固件文件(如。
2025-04-03 10:50:13
1169
原创 链接脚本ld
链接脚本实质上是一个规则文件,程序员用来指示链接器工作的,当我们编写了多个C文件,调用了大量库,如何编译成一个可执行文件呢?这是链接脚本文件就会发挥他的作用了:将多个目标文件(xx.o)、库文件(xx.a)、动态库(.so)等等链接成一个可执行文件。ilm (rxa!FLASH (wxa!MEMORY表示对内存分布的定义,拿sram (rxa!w) : ORIGIN = 0x1c000000, LENGTH = 256K来说:sram是内存块的名字rxa!
2023-08-31 23:58:50
688
原创 整数0 强制转化为指针
>的优先级高于&。因此 &((type*)0)->member)的解释为先进行:(type*)0)->member 取得member成员的运算,然后再进行取地址& 运算int a;char b;}Msg;return 0;
2023-07-29 17:18:32
952
原创 链接脚本ld
一般而言,程序编译经历下图四个阶段,链接是编译的最后一步,无论是在PC上编译代码,还是在PC上使用嵌入式gcc工具交叉编译嵌入式代码,编译过程都是如下几步。
2023-04-09 21:31:14
904
原创 嵌入式C宏定义特殊字符的用法
1 '#'运算符作为预处理运算符,可以把记号转化为字符串举例:#include <stdio.h>#define INT_TO_STR(n) #n#define VERSION(major, minor) "V"INT_TO_STR(major)"."INT_TO_STR(minor)#define ENUM_TO_STR(e) (#e)typedef enum{ USER_BUTTON_0 = 0, USER_BUTTON_1, USER_BUT
2022-05-30 11:28:35
315
原创 Python使用总结 第一篇
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言一、python文件首行 #!user/bin/python3的作用二、枚举1.引入库2.读入数据总结前言提示:这里可以添加本文要记录的大概内容:工作内容涉及到关于python的使用,现在将涉及到的知识点做总结。提示:以下是本篇文章正文内容,下面案例可供参考一、python文件首行 #!user/bin/python3的作用表示用/usr/bin/python3 这个目录所代表的程序解释该python程序二、.
2022-05-03 14:38:14
1001
原创 字符串 指针的使用误区
误区使用字符串误区,代码如下误区1:char *get_xx_version() { int file_handle = open("/xxx/xxx.txt",O_RDONLY); char *xxx = NULL; int err = read(file_handle,xxx,8); close(file_handle); log_ota("ver = %s\n",xxx); return xxx;}结果:ver = NULL原因:NUL
2022-04-23 17:19:20
394
原创 通讯协议制定总结
文章目录前言比较好的帖子转载前言在进行程序设计时,难免会涉及通讯协议的制定,本文通过对工作中用到的通讯协议进行总结,可以为后期制定通讯协议积累经验。制定通讯协议时,要有规范的输出,比如在首页或者第二页要有作者、制定日期、版本、备注这些信息。最主要的是交互模式、通讯逻辑的设计。举例来讲: 比如一问一答、每条命令都需要接收方给出ACK应答确认消息,超时时间设置200ms,连续3次后超时报警。再比如Ymodem协议格式如下图所示帧格式一般取两个字节作为帧头,比如0x5a,0xa5比较好的帖子
2021-09-18 14:44:50
943
原创 总结串口常见收发数据的处理方法
文章目录前言1、普通的发送和接收1.1 普通串口初始化1.2 普通串口接收1.2 普通串口发送2、串口空闲中断+DMA2.1 初始化2.2 串口接收前言工作中经常会遇到需要进行串口进行数据收发的环节。在此总结下串口在接收数据时,常见的一些处理方法,框架、逻辑,目的是以后在做类似的串口数据收发时,能够有所启发。1、普通的发送和接收1.1 普通串口初始化串口初始化函数代码如下:oid UART_Init(void){ GPIO_InitTypeDef GPIO_InitStructure;
2021-09-18 11:29:54
6147
原创 嵌入式小结~持续更新
360公司嵌入式软件工程师电话技术面试总结:首相让做个人的技术栈介绍?个人感觉真实展现就可以。其次项目环节问答:OTA项目介绍1、是在NAND flash上还是在NOR flash上实现的?首先需要我们理解这两种FLASH的区别?目前Flash主要有两种NOR Flash和NADN Flash 。接口差别:NOR Flash带有SRAM接口,有足够的地址引脚来寻址,可以直接和CPU相连,CPU可以直接通过地址总线对NOR Flash进行访问,可以很容易地存取其内部的每一个字节。NAND
2021-09-07 16:02:04
1617
原创 带你玩转M1卡
文章目录本文参考来源前言M1卡指标工作原理存储结构块0~块2的存取控制表块3的存取控制表存取控制判断举例M1卡常见问题及处理建议:本文参考来源巨人的肩膀前言M1卡全称为NXP Mifare1系列,常用的有S50及S70两种型号。M1卡指标分为16个扇区,每个扇区为4块,每块16个字节,以块为存取单位每个扇区有独立的一组密码及访问控制。具有防冲突机制,支持多卡操作(实际使用意义不大)无电源,自带天线,内含加密控制逻辑和通讯逻辑电路。数据保存期为10年,可改写10万次,读无限次。工作频率
2021-09-03 17:44:50
3026
原创 FreeRTOS系列---事件标志组
文章目录前言事件组、事件位事件组和事件位的数据类型创建事件标志组事件组EventGroup_t 定义如下函数xEventGroupCreate()函数xEventGroupCreateStatic()设置事件位函数xEventGroupClearBits()函数 xEventGroupClearBitsFromISR()函数 xEventGroupSetBits()函数xEventGroupSetBitsFromISR()获取事件标志组值函数xEventGroupGetBits()函数xEventGroup
2021-09-02 15:11:02
911
原创 FreeRTOS系列第9篇---软件定时器
文章目录简介编写回调函数注意事项定时器服务任务定时器相关配置1、configUSE_TIMERS2、configTIMER_TASK_PRIORITY3、configTIMER_QUEUE_LENGTH4、configTIMER_TASK_STACK_DEPTH单次定时器和周期定时器创建软件定时器函数 xTiemrCreate()函数 xTimerCreateStatic()开启软件定时器函数 xTimerStart()简介软件定时器允许设置一段时间,当设置的时间到达之后就执行指定的功能函数,被定时器调
2021-08-29 10:28:04
1135
原创 面试过程中经常会问到的职业规划,该如何作答
前言在面试环节中,难免会被问到自己的规划,这里做出一些经验总结。面经★被问未来三年如何规划为了考察你的计划性和稳定性(关系到工作的效率和团队绩效,判断你的规划和公司岗位是否匹配,是否能够更好地发挥你的人才价值。面试不同岗位计划不同。(销售–赚钱的欲望,企图心,三年赚多少钱几年买房子;财务–踏实工作稳中求进,从专业知识进度谈多久考高级证书,注册会计师等)从四方面谈工作计划:1.个人专业(所学专业,多长时间–什么职位,达到什么能力,学习哪些新知识,给出明确时间和达成目标体现有计划性)2.个人性格
2021-08-12 16:32:24
565
原创 FreeRTOS系列第7篇---队列
文章目录1、前言2、队列简介2.1 数据存储2.2 多任务访问2.3 出队阻塞1、前言在实际的应用中,常常会遇到一个任务或者中断服务需要和另外一个任务进行“沟通交流”,这个“沟通交流”的过程其实就是消息传递的过程。在没有操作系统的时候两个应用程序进行消息传递一般使用全局变量的方式,但是如果在使用操作系统的应用中用全局变量来传递消息就会涉及到“资源管理”的问题。FreeRTOS 对此提供了一个叫做“队列”的机制来完成任务与任务、任务与中断之间的消息传递。2、队列简介队列是为了任务与任务、任务与中断之间
2021-08-11 21:39:11
1063
原创 const修饰指针详解
文章目录前言1、const int* p = &a;2、int *const p = &a;3、const int* const p = &a;前言在阅读一些系统的源码时,经常会看到const修饰符,同时在面试中,const也是经常考到的点,因此在此总结下const的作用,并且是必须要掌握的。当用 const 进行修饰时,根据 const 位置的不同有三种效果。原则是:修饰谁,谁的内容就不可变,其他的都可变。这三种情况,在实际编程中经常用到。1、const int* p
2021-08-11 14:00:24
449
原创 一文搞懂无刷电机和有刷电机
目录前言1、无刷电机1.1 无刷电机基本结构1.2 工作原理介绍2、有刷电机前言工作中会遇到无刷电机、有刷电机的使用。因此在此总结他们的区别和使用。1、无刷电机相比有刷电机,无刷电机更加耐用、更加静音,工作效率也会更高。它和有刷电机的最大区别是通过位置传感器来实现换向。通过霍尔元件的霍尔效应感知永磁体磁极的位置,根据这种感知适时切换线圈中电流方向,保证产生正确方向的磁力来驱动电机。1.1 无刷电机基本结构转子定子1.2 工作原理介绍在定子上有三组线圈,分别用ABC进行标识:当为
2021-08-06 16:36:33
8348
原创 FreeRTOS系列第6篇---内核控制函数
目录前言预览详解1、taskYIELD()2 临界段代码2.1 taskENTER_CRITICAL() 、taskEXIT_CRITICAL()2.2 taskENTER_CRITICAL_FROM_ISR() 、taskEXIT_CRITICAL_FROM_ISR()3、taskDISABLE_INTERRUPTS()、 taskENABLE_INTERRUPTS()4、vTaskStartScheduler()5 vTaskEndScheduler6 vTaskSuspendAll()前言Free
2021-08-02 21:17:02
855
原创 volatile与指针
目录前言使用环境前言volatile ˈ/välədl/ 在嵌入式工作中经常会使用到,因此掌握volatile的使用非常重要。使用环境多任务环境下任务之间共享标志。寄存器映射的硬件寄存器
2021-07-28 09:39:59
2246
【嵌入式音频处理】基于i.MX RT600 HiFi4的8通道数字麦克风音频采集与实时播放系统设计介绍了如何使用多通道dmic
2025-06-28
用于将bin文件转化为二进制数组的工具
2020-12-15
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅