嵌入式系统与单片机|技术阅读
登录|注册

您现在的位置是:嵌入式系统与单片机 > 技术阅读

技术阅读

  • C语言的回调函数原来这么简单

    2024-06-24

    了解开发语言的朋友应该都会对回调函数有所了解,在很多的程序开发语言中都能看到回调的身影。很多场景下,当某个条件成立以后我们希望代码执行某些指定的部分,这个时候可以考虑使用回调函数的方式,这样做思路更加的清晰,也能使代码结构的逻辑更加清晰,结构更加好。那回调函数到底是什么呢?它又是怎么实现的呢?这是本次想要简单分析的一个主题。但是在说回调函数之前,我觉得很有必要先说明一下 “函数指针” 这个概念,它是回调函数能够实现的重要基础。1、函数指针学习过C语言的伙伴都知道,C语言中的灵魂 — 指针。可以毫不犹豫地说,要检...

  • 单片机的内存分配你清楚吗?

    2024-06-24

                                                             单片机开发也是嵌入式开发中的一个大群体,有许多的的人是进行单片机逻辑开发的,也有些人是单片机+嵌入式实时操作系统,当然也有单片机+linux+人工智能技术的。当然,不管你是什么样的组合方式,只要你最终开发的产品中有使用到MCU,进行程序开发时,都应该会涉及到内存的分配问题。只要是开发程序过程中有过动态申请内存的朋友,对malloc、free估计是不会陌生的。很多时候单片机的内存分配是会让人感觉到头疼的,有些单片机的内存很大,可以肆无忌惮的...

  • 嵌入式常用的通信协议传输原理的动态演示

    2024-06-24

  • 一种小数据量可以使用的排序算法

    2024-06-24

    选择排序是一种比较直观和简单的排序算法,它和冒泡排序算法都是很经典,很常用的排序算法。选择排序顾名思义就是在于 “选择” 这个字眼上,算法的原理就是在需要排序的数据中选择一个数据作为基准,然后用剩下的数据和这个基准进行比较,如果其他的数据比这个基准数据要小(大),就交换数据的位置。选择排序的算法实现的步骤如下:(按升序排列)1) 先拿第一个数据作为基准,跟剩余的数据进行比较,将最小的数据放到最开始的位置;2) 然后在将第二个数据作为基准,再跟剩下的数据进行比较,得到第二最小的数据;3) 依次类推,完成数据的升...

  • linux的线程的同步手段 — 条件变量

    2024-06-24

    在多线程开发中,有时候有些线程可能只需要在某种条件成立时才去执行,并不想要这个线程一直被调度,也不想要一直去查询某个条件是否成立了。基于这样的一种想法,有没有这样的一种方式,在某个条件没有成立的时候,这个线程平时就被阻塞挂起,等到这个条件成立了,通知一下这个线程条件已经成立了,可以去执行相关的操作了。话说到这个份上了,答案肯定是有的,那就是线程同步的其中一种手段 — 条件变量。条件变量用于自动阻塞线程,直到某个条件满足或者特定的事件发生为止。本文不多条件变量做很多的深入分析,只分享一下条件变量的一些api函数...

  • 关于 .c / cpp 文件编译的过程

    2024-06-24

    一份代码的编译过程有四个阶段:预处理、编译、汇编、链接。这是将一份我们写好的代码通过编译器编译成可执行文件的过程,这几个过程的说明如下:1)预处理预处理就是将要包含(include)的文件插入原文件中、将宏定义(#define)展开、根据条件编译(#if...#endif)命令选择要使用的代码,最后将这些东西输出到一个 “.i” 文件中等待进一步处理。在 C/C++源文件中,以 “#” 开头的命令被称为预处理命令,如包含命令 “#include”、宏定义命令 “#define”、条件编译命令 “#if”、“#ifdef” 等。2)编译编译就是把 C/C++代码(比如上述的“.i”文...

  • linux 中的压缩和解压操作

    2024-06-24

    关注+星标公众号 “嵌入式之入坑笔记”,不错过精彩内容哦!前言:在开发中,很多时候会遇到某些文件要进行压缩的操作,比如文件较大不方便传输的时候,可能会考虑对文件进行压缩,以减少文件传输的时间。比如在网络中传输文件的时候,就会考虑先将文件进行压缩,然后传输压缩的文件,这样可以减少文件传输所需要的带宽和时间,在网络接收到文件之后再解压,就可以得到文件了。文件的压缩有两种方式:有损压缩和无损压缩。有损压缩会对文件的数据有一定的破坏,一般对于重要的文件我们不会考虑这样的方式。无损压缩不会影响文件,所以对于压缩我们最...

  • 大小端是什么?如何判别?

    2024-06-24

    关注+星标公众号 “嵌入式之入坑笔记”,不错过精彩内容哦!1、到底什么是大小端呢?首先我们需要知道,数据是可以存放在内存中的。在计算机系统中,内存的最小存放单元是字节,即一个地址对应一个字节,可以保存一个字节(8Bit)的数据,但是在计算机系统中又不可能全部都是一个字节的存储方式,还有一些8位、16位、32位的系统,它们还会有2个字节、4个字节的变量。所以就有了数据在内存中存放顺序的说法,也就是大小端的由来。下面举个例子说明一下大小端的原理。比如现在有一个由2个字节组成的16位整数0x1234,那么它在内存中存放的方式就有:(1...

  • 有关BMP位图的原理和解析

    2024-06-24

    1、BMP是什么?BMP是 Bitmap(位图)的简称,是windows显示图片的基本格式。在windows下,任何格式的图片文件(包括视频播放)都要转化为位图才能显示出来,各种各样格式的图片文件也都是在位图格式的基础上采用不同的压缩算法生成的。BMP位图可以实现不作任何变换地保存图像像素域的数据,是取得RAW数据(原始数据)的重要来源。2、像素点的三种颜色 R、G、B一般在我们的生活中见到的图像很多是以24位图像为主,每个颜色点由R、G、B三种颜色混合组成,一张图片就是由很多个这样的颜色点组成。如果这三种颜色各用8个bit来表示,那么这样的图像称为...

  • 有关ARM的NVIC向量中断控制器

    2024-06-24

    学习或者了解过ARM的朋友应该都会知道NVIC这么个东西,这个东西也是ARM中非常重要的东西,它是ARM不可分离的部分,搭配着内核共同完成着对中断的响应。1、那到底NVIC是个啥东西呢?NVIC:简称嵌套向量中断控制器。它管理着包括内核、外部异常等的所有中断的响应和处理。为了可以方便说明NVIC的原理和使用方法,本文以STM32F103作为参照说明NVIC的基本组成和使用原理。STM32F103的内核使用的是Cortex-M3,是32bit的微处理器。它有专门的异常响应系统(NVIC)用于支持系统异常和外部异常中断。Cortex-M3的异常响应系统支持16个系统异常、240个外部异常...

  • 总结几个常用的Git命令的使用方法

    2024-06-24

    1、  Git的使用越来越广泛现在很多的公司或者机构都在使用Git进行项目和代码的托管,Git有它自身的优势,很多人也喜欢使用Git。我之前在公司最开始用的是SVN进行代码的托管,后面因为新项目的开展,为了更好的管理项目代码和同事之间协作开发,所以也使用起了Git。因为之前都是使用SVN,用的是客户端的方式进行的代码托管,简单也易用。接触了Git之后感觉Git命令较多,可以用很多的工具进行阅览整个Git仓库的详情,感觉更有特色,用起来也更加的有趣,慢慢的喜欢上了Git这个工具。接下来分享一些我个人在使用Git过程中最常用到的Git命令,也简单分...

  • 有关文件IO操作的错误(error)提示

    2024-06-24

    在编程中,我们一般都是要讲究一定的使用规范的。按照一定的规范编写代码,返回运行提示,在代码运行出现问题时能方便我们能快速的定位到问题的所在。特别是在使用库函数或者系统调用的API的时候,我们最好也要关注函数的返回值所能给我们提供的信息,充分利用好这些返回值以及返回值所代表的含义,对我们的错误查找是有很大的便利的!本文记录一下文件IO操作时的一些错误提示,通过函数的调用之后的返回值去查找对应的问题。有关文件IO的 errno 变量在linux系统中对于常见的错误都进行了统计,这些不同的错误已经被系统进行了编号,并且每个错误类...

  • Ubuntu 中使用gcc/g++编译C/C++

    2024-06-24

    对于习惯了使用windows进行开发的朋友们,如果想要编译C语言,只要要在windows中安装一个可以编译的IDE即可。或者直接自己加载编译的工具链,使用Cmd命令行也可以完成C语言的编译。但是如果想要在linux环境中编译C语言,安装编译工具也是一样可以对C语言进行编译的。还可以把在windows中编写的C语言代码拿到linux中去编译。本文分享ubuntu中安装gcc编译器,并用gcc编译器编译C语言。1、安装gcc编译器在ubuntu中安装gcc可以使用 sudo apt install gcc 进行安装,如下指令:sudo apt install gcc安装过程如下:由于我之前已经安装过gcc了,所以在此执...

  • STM32最小系统的组成详解

    2024-06-24

    经常使用STM32开发的工程师对于它的开发环境的最小系统是必须要有所了解的,特别是硬件工程师在设计硬件的时候对这个最小系统就要更加的深入了解了,如果最小系统的搭建都有问题,那以后的使用很难避免不出现问题。话不多说,进入正题说说STM32的最小系统的基本组成!1、STM32最小系统硬件组成包括哪些?STM32的最小系统的硬件组成主要有:电源电路、复位电路、时钟电路、调试接口电路、启动电路。电源 : 一般是3.3V输入作为STM32芯片的工作电压,实际中很多采用LDO将5V转换为3.3V进行供电,另外电路上还要加多个0.01uf去耦电容对输入电压进行滤波...

  • 开启linux的网络服务, FTP、SSH和NFS服务

    2024-06-23

    在使用linux中开发的时候,我们可以选择启用一些网络服务方便我们进行开发,加快开发的进度。现在很多用linux进行开发的工程师,他们大多都是在windows系统上安装虚拟机,然后在虚拟机中安装linux系统,然后在里面完成项目的开发的。这种方式往往需要经常的和windows之间进行文件的传输,这时候使用网络上的一些传输服务就可以很方便的进行。比如常用FTP、SSH、NFS这三个常用的网络服务,基本都要用到的!本文分享的就是这三个网络服务的启用和配置的记录,作为一个备忘吧。1、  FTP、SSH、NFS它们是什么东西?(1)  FTPFTP指的是文件传输协议,...

  • 模拟滤波器和经典的低通滤波器

    2024-06-23

    关注+星标公众号 “嵌入式之入坑笔记”,不错过精彩内容哦!前言:绝大多数的电路系统在设计的时候都是需要考虑抗干扰能力的,这种干扰的来源是多样性的,可能来自于电源,也可能来自于线路电磁干扰,甚至周围的设备产生的电磁都可能对系统带来干扰。所以如何设计一个抗干扰的系统用于滤除干扰带来的影响,就变得很重要了。打个比方,一个有源系统使用的是外部蓄电池的方式进行供电,这个蓄电池它输出的电压一般都不是很纯洁的,除了电池的恒压输出外,往往还会掺杂一些变化性的杂波。这些杂波在整个传输的过程中会出现波动。如果输入到系统的时候不...

  • 面试必考 - 结构体内存对齐,还有人不会?

    2024-06-23

    关注+星标公众号 “嵌入式之入坑笔记”,不错过精彩内容哦!前言:很多人在编写代码实现功能的时候,或多或少都会接触到结构体的使用,在很多的编语言中,结构体都是很多数据结构的重要的组成部分。在嵌入式的项目开发中,很多时候芯片的内存资源都是有限的,为了代码更加的优化和高效,尽可能的合理使用内存资源,在使用结构体这类结构时,往往是要考虑结构所占的内存大小的。以此方便我们调整顺序,尽可能的节省内存资源。(土豪略过,不做讨论!)使用结构体,需要考虑结构的内存对齐问题,现在逐一展开讲讲!1、什么是内存对齐?我们都知道,定...

  • USB系列之-UVC+UAC扬声器+麦克风实例分享

    2024-06-23

    一. 前言 前面三篇文章分享了UAC的扬声器,麦克风,扬声器+麦克风的设备。而一般多媒体设备是音频和视频同时有的,所以本文继续分享UVC+UAC(扬声器+麦克风)的复合设备。UVC实例后面再单独分享详细介绍。二.描述符拓扑我们使用IAD可以方便的实现复合设备,前面已经实现了UVC和UAC则只需要把他们拼起来即可。我这里分享一个基于IAD的UVC+UAC描述符拓扑实例UVC一共两个接口控制接口0,一个输入终端,一个处理单元,一个输出终端。0带宽流接口1的alt 0, 实现了NV12,H264,MJPEG,Y800 4种格式,每种格式都有两种帧类型即两种分辨率。非9带宽流接口1的a...

  • STEP BY STEP设计一个USB调试助手之十:异步传输+FIFO实现解耦

    2024-06-23

    一.前言前面我们实现了异步传输的demo,能够进行数据收发测试。但是还不够,现在的实现不方便应用层使用。对于应用层来说只需要启动,关闭,读,写这几个接口,无需关心USB相关的逻辑。使用FIFO来实现应用层和底层驱动的解耦是一个不错的方式,我们前面也有系列文章分享了FIFO的实现见:https://mp.weixin.qq.com/s/MvL9eDesyuxD60fnbl1nag这一篇我们就在上一篇基础上增加FIFO,实现底层和应用的解耦,最后将我们之前设计的GUI和现在的框架合并起来,实现更加高效好用的最终版本。二.程序框架我们在上一篇框图基础上修改提供给应用层仅4个接口usbd...

  • STEP BY STEP设计一个USB调试助手之九:基于异步传输的简单USB测试工具

    2024-06-23

    一. 前言前面我们实现了批量和中断传输的功能,至此工具已经初步具备了实用价值,可以进行控制传输和批量/中断传输的测试了。但是目前是基于同步接口实现的,也就是点击按钮,进行传输,等待传输完再显示, 这样效率不高,也不适合应用。这一篇就来利用libusb的异步接口,实现新的收发框架,后面再将新的框架应用到我们的测试工具,所以本文先实现一个命令行的工具,先不带GUI,主要是测试异步框架,后面再应用的带GUI的测试工具中。二. 异步传输编程框架异步传输参考官方文档https://libusb.sourceforge.io/api-1.0/group__libusb__asyncio.html我这里...

  • STEP BY STEP设计一个USB调试助手之七:解析接口和端点信息

    2024-06-23

    一. 前言前面我们已经完成了控制传输部分的开发,现在继续进行端点相关的传输部分开发。先实现接口和端点信息的解析,以便用户选择某个接口下的某个端点进行收发。二. 接口参考libusb_get_active_config_descriptor()获取描述符信息,然后进行解析,注意使用完需要调用libusb_free_config_descriptor释放资源。2.1获取接口和端点信息使用变量s_interface_num记录接口数,一个接口下的不同alt接口算不同的接口。定义结构体 usbddev_interface_info_st记录接口和端点信息。定义全局数组 s_interface_info记录接口和端点信息,最大可记录MAX_INTERF...

  • STEP BY STEP设计一个USB调试助手之六:控制传输

    2024-06-23

    一. 前言前面实现了设备的打开与关闭的逻辑,现在来继续实现数据的收发。因为控制传输无需解析接口端点等信息,比较直接,打开设备之后就可以进行,所以先实现控制传输部分。二. 接口参考API: libusb_control_transferhttps://libusb.sourceforge.io/api-1.0/group__libusb__syncio.html#gadb11f7a761bd12fc77a07f4568d56f38usbdev.c中添加接口封装,不对外暴漏设备相关信息int usbdev_control_transfer (uint8_t bmRequestType, uint8_t bRequest, uint16_t wValue, ...

  • STEP BY STEP设计一个USB调试助手之四:获取设备信息

    2024-06-23

    一. 前言前面已经完成了libusb开发环境和搭建和界面的设计,现在开始就可以进行业务逻辑部分设计了。首先我们需要获取到当前的USB设备信息,然后用户选择对应的设备进行后续的操作。本文先完成获取设备信息这一步,获取到设备后可以通过下拉框进行选择。二. 界面修改考虑到用户可以随时获取设备信息,所以在设备打开前添加一个刷新设备的按钮。如下在设备这里的horizontal layout中添加一个按钮,layoutstretch改为1,16,4,4.我们的需求是按刷新设备按键时,设备的下拉框自动更新显示当前的设备信息。三. 获取设备信息根据以上信息我们需要能获取到设...

  • USB系列之-UAC扬声器+麦克风实例分享

    2024-06-23

    一.前言UAC的规格书可以从usb.org网站下载,目前有1.0,2.0,3.0三个版本,本文以1.0为例分享一个UAC扬声器的实例, 重点在于描述符拓扑。规格书《UAC1.0/USB_AV_Specification_Rev_1.0》定义了UAC设备类完整的信息,但是比较复杂,《UAC1.0\BasicAudioDevice-10\BasicAudioDevice-10.pdf》定义了其一个最小子集,一般我们实现其子集就够了。所以我们可以参考BasicAudioDevice-10.pdf的最简拓扑结构实现设备,然后具体的描述符,请求等细节可以参考USB_AV_Specification_Rev_1.0。二.拓扑BasicAudioDevice-10.pdf定义了需要支持的3个设备Headphone:耳机设...

  • USB系列之-UAC扬声器实例分享

    2024-06-23

    一.前言UAC的规格书可以从usb.org网站下载,目前有1.0,2.0,3.0三个版本,本文以1.0为例分享一个UAC扬声器的实例, 重点在于描述符拓扑。规格书《UAC1.0/USB_AV_Specification_Rev_1.0》定义了UAC设备类完整的信息,但是比较复杂,《UAC1.0\BasicAudioDevice-10\BasicAudioDevice-10.pdf》定义了其一个最小子集,一般我们实现其子集就够了。所以我们可以参考BasicAudioDevice-10.pdf的最简拓扑结构实现设备,然后具体的描述符,请求等细节可以参考USB_AV_Specification_Rev_1.0。二.拓扑BasicAudioDevice-10.pdf定义了需要支持的3个设备Headphone:耳机设...

  • STEP BY STEP设计一个USB调试助手之三:添加libusb库源码并测试

    2024-06-23

    一. 前言 前面我们完成了开发环境的搭建,界面的设计,这一篇正式开始业务部分开发。我们基于libusb来实现usb相关的操作。所以这一篇先添加libusb库到工程中,为了方便调试我们以添加源码的方式而不是添加库的方式。Libusb开发环境搭建还可以参考以下文章:《Windows下基于MSVC搭建libusb开发环境》https://mp.weixin.qq.com/s/fYLEeHXhKQ96zKCMFCrphQ《libusb开发之一-Linux下开发环境搭建》https://mp.weixin.qq.com/s/i9QOBc9hprwg6VGexh_Bhw《libusb开发之二-Linux下使用vscode开发》https://mp.weixin.qq.com/s/kxtcLUZKAS8DeVEGHx3bHw《libusb开...

  • STEP BY STEP设计一个USB调试助手之一:Qt开发环境搭建

    2024-06-23

    一. 前言 串口开发网上有大量的串口调试助手可以使用,自己也可以很快的设计一个基本可用的工具,可以方便进行数据的收发测试。同样的USB开发如果也有类似的工具则能大大方便USB的开发,可惜网上没有合适的USB调试助手。于是乎我们就自己来设计一个。我们在windows下基于Qt+MinGW+libusb来实现。 Libusb开发环境的搭建可以参考如下文章,本文介绍Qt开发环境的搭建。 《Windows下基于MSVC搭建libusb开发环境》https://mp.weixin.qq.com/s/fYLEeHXhKQ96zKCMFCrphQ《libusb开发之一-Linux下开发环境搭建》https://mp.weixin.qq.com/s/i9QOBc9hprwg6VGexh...

  • 分享MATLABR2023B安装以及进行Sigma-Delta ADC 仿真

    2024-06-23

    一.前言前面我们介绍了PDM编码和1bit sigma-deleta ADC。MATLAB具备丰富的工具箱,可以进行相关的仿真分析,比如Delta Sigma ToolBox。我们这篇就分享下MATLAB R2023B的安装以及体验下基于simulink的样例SigmaDeltaADConversionExample.m分析SigmaDeltaADC的原理。二.安装MATLAB2.1下载MATLAB链接:https://pan.baidu.com/s/1IuNKnhqEAqEd9MjVdQARLw?pwd=g1um 提取码:g1um 双击MATLAB R2023b Installation package.7z解压整个安装包存放的路径不要有中文名,后面安装路径也不能有中文名。2.2安装右键点击MATLAB R2023b Installation package\MATLA...

  • PDM系列文章之一- 前菜篇,假如来发明我们自己的PDM

    2024-06-23

    前言前面《UAC+PDM音频播放实践之-使用逻辑分析仪分析PDM信号》https://mp.weixin.qq.com/template/article/1711549811/index.html一文介绍了如何使用逻辑分析仪进行PDM分析。前面大概介绍了如何去判断一个PDM输出信号是否大致正确,涉及到了一些感性的理解,未涉及具体的原理。这一篇开始我们开始介绍PDM的原理。我们不一上来就摆公式,算法,而是依赖于自己的思考,问题,慢慢去引出相关概念,思想,原理。所以本篇前菜篇,都是感性的思考,不涉及严格理论,重点在引出问题,引出思考,引出思想。为什么有PDM?我们自己来发明PDM。学习一个新的技术...

  • 分享一个离线wiki项目-以后再也不用费尽心思去在线访问WIKI了。

    2024-06-23

    一.前言最近在搜集PDM的资料,很多链接都指向了WIKI的内容,但是WIKI无法直接访问。所以就只能迂回解决。刚好有开源的kiwix项目可以实现离线wiki。即下载数据库使用kiwix上位机进行浏览,非常方便,所以本文就分享下。二. kiwix介绍该项目地址为https://wiki.kiwix.org/wiki/Main_Page/zh以下内容翻译自首页Kiwix是一个离线的网页内容阅读器。这款软件的目的是让维基百科在不使用互联网的情况下可用,但它可能适用于所有HTML内容。Kiwix支持ZIM格式,这是一种带有额外元数据的高度压缩的开放格式。Kiwix是自由软件,这意味着你可以自由地复制、修改和...