
嵌入式从入门至出神入化
以嵌入式基础为线索,逐步深入嵌入式开发各个环节,掌握嵌入式常用性能体验优化思路,打造完整嵌入式工作流,提升工程化编码能力和思维能力。
优惠券已抵扣
余额抵扣
还需支付
¥129.90
¥299.90
购买须知?
本专栏为图文内容,最终完结不会低于15篇文章。
订阅专栏,享有专栏所有文章阅读权限。
本专栏为虚拟商品,基于网络商品和虚拟商品的性质和特征,专栏一经购买无正当理由不予退款,不支持升级,敬请谅解。
普通网友
这个作者很懒,什么都没留下…
展开
-
深入探究Linux内核锁机制——单片机应用
相对于自旋锁而言,它采用了睡眠等待的方式,当发现资源已被占用时,会主动放弃CPU,将线程休眠,并将等待队列中的其他线程唤醒。自旋锁是最简单粗暴的锁机制,它采用忙等待的方式,当资源被其他进程使用时,锁会处于忙等待状态,直到资源被释放。Linux内核锁分为三类:自旋锁、信号量和互斥锁。其中,自旋锁和互斥锁都是针对临界区的保护,信号量则广泛应用于进程和线程之间的同步。上述代码块演示了Linux内核三种不同的锁实现方式,自旋锁、信号量和互斥锁,它们都能够确保资源在多线程应用中的同步性。原创 2023-06-11 01:19:26 · 156 阅读 · 0 评论 -
单片机蓝牙系统设计
接下来根据芯片选定相应的蓝牙模块,常见的有HC-05和HC-06等。#define TIMER_TICK (65536-FOSC/4/BAUD/TIMER_DIV) //定时器初值。//设置蓝牙名称为"STC_Bluetooth"#define TIMER_DIV 4 //定时器分频系数。#define BAUD 9600 //串口波特率。//发送初始化AT指令。//设置波特率重载值。//设置波特率重载值。原创 2023-06-11 01:12:50 · 626 阅读 · 0 评论 -
探究CCF的单片机应用
在开始之前,我们需要准备一些工具和环境。最后,我们需要下载CCF提供的单片机库函数文件,其中包括头文件和源文件。除了上述的GPIO控制函数和延时函数,CCF库函数还提供了许多其他的常用功能,例如ADC模数转换、串口通信、LCD显示等。在这个程序中,我们使用了CCF提供的GPIO_SetBits和GPIO_ResetBits函数来设置P1口的输出高低电平。此外,我们还使用了CCF提供的Delay函数来实现简单的延时功能。综上所述,CCF提供了众多方便的单片机库函数,为单片机开发者们带来了很大的便利。原创 2023-06-11 00:54:33 · 90 阅读 · 0 评论 -
设备资源管理在单片机中的DRM应用
通过 DRM 技术,可以保证单片机的设备资源的利用率,提升系统的性能和可靠性。例如,我们需要使用 STM32F4 的 ADC 模块和 PWM 模块,在硬件上需要将这两个模块与对应的引脚连接,并完成相应的设置。在这里,我们只实现了设置和获取设备状态的函数,实际开发中还需要根据具体需求添加相应的函数。设备资源在单片机中具有重要的作用,但是如何进行高效地管理这些设备资源却是一项很大的挑战。在进行实际的 DRM 操作前,我们需要先定义一个设备资源表,用来记录系统中所有的设备资源,以及它们的状态和使用情况。原创 2023-06-11 00:39:38 · 176 阅读 · 0 评论 -
定时控制系统设计——基于单片机
当定时器计时到达一定时刻时,我们通过控制继电器的开关状态,实现定时开关功能。上述代码中,定时器计时达到20次后(即每1秒一次),继电器的开关状态会发生改变。通过本文介绍的方法,我们可以快速便捷地实现定时控制系统,满足家居环境中对于定时开关等多种需求。如果您有相关的项目需求,请参考本文提供的方案进行设计实现。在现代化家居中,人们对家电控制的需求越来越高,尤其是对于定时开关这一功能,更是日益普及。最后,我们需要将设计的程序烧录到单片机中,连接相应的硬件设备即可完成定时控制系统的实现。原创 2023-06-11 00:29:38 · 285 阅读 · 0 评论 -
优化Linux系统下的延迟工作机制——单片机控制
上述代码中,我们定义了一个名为my_work的延迟工作,在init_module()函数中初始化,并通过调用setup_timer()函数设置了一个名为my_timer的定时器,该定时器每隔1000毫秒触发一次,执行my_timer_function()函数。在my_timer_function()函数中,调用了schedule_delayed_work()函数来启动my_work延迟工作,在my_work_function()函数中编写需要延迟执行的代码即可。原创 2023-06-11 00:23:02 · 113 阅读 · 0 评论 -
SPI子系统驱动框架详细解析
MISO(主输入从输出线)由从设备输出数据;SS(从设备选择线)由主设备控制,用于选择特定的从设备进行通信。在单片机系统中,SPI总线通常用于连接多个外设,如EEPROM、温度传感器、LCD等,以实现数据交换和控制。为了简化SPI子系统的驱动开发,许多MCU厂商提供了通用的SPI驱动框架。本文介绍了基于STM32的SPI驱动框架实现方法,并提供了相应的源代码。在SPI片选控制中,需要通过GPIO口输出控制信号,从而选择特定从设备进行通信。在SPI数据读写中,需要按照特定的时序来控制SPI接口完成数据传输。原创 2023-06-11 00:13:03 · 462 阅读 · 0 评论 -
如何使用dump_stack分析函数调用关系——单片机版
从输出结果可以看出,my_init函数调用了function_1函数,function_1函数又调用了function_2函数,最终导致了dump_stack函数的执行。在单片机的Linux内核中,dump_stack函数可以输出当前的函数调用栈信息。在上述代码中,my_init函数会调用function_1函数,而function_1函数会调用function_2函数,最终输出函数调用栈信息。通过使用dump_stack函数,我们能够清晰地了解程序运行时的函数调用关系,方便问题的定位和排查。原创 2023-06-10 02:46:03 · 244 阅读 · 0 评论 -
Pin控制器的设计与实现
本文介绍了一种基于STM32F103C8T6单片机的Pin控制器实现方法,该控制器可以实现多个GPIO引脚的读取和写入、不同输出方式的设置以及输入上下拉电阻的设置等功能。在嵌入式系统开发中,我们需要频繁地使用各种外设,而外设与CPU通信的接口往往就是单片机上的GPIO引脚。因此,对GPIO引脚的控制和管理成为了嵌入式开发中的核心问题之一。本文将介绍一种基于单片机的Pin控制器实现方法。我们将选用其中的16个GPIO引脚来实现本控制器。下面我们通过一个简单的LED闪烁程序来测试我们的Pin控制器。原创 2023-06-10 02:36:12 · 214 阅读 · 0 评论 -
队列的概念及在单片机中的应用
在上述代码中,我们定义了一个Element结构体作为队列元素的数据类型,并通过Queue结构体描述了队列的基本信息。此外,我们还提供了初始化和销毁队列的函数以确保队列的正确使用。队列是一种特殊的线性表,它只允许在表的一端进行插入操作,而在另一端进行删除操作,其实现方式为先进先出(FIFO)的方式,即最先插入的元素最先被删除。在单片机编程中,也经常需要使用队列来解决相关问题,因此掌握队列的实现方法非常有必要。/* 定义队列元素的数据类型 *//* 初始化队列 *//* 入队操作 *//* 销毁队列 */原创 2023-06-10 01:08:52 · 242 阅读 · 0 评论 -
使用Keil编写STM32单片机开发
在下载完成后,可以通过Keil提供的调试功能对程序进行调试。在STM32单片机的开发过程中,我们通常选择Keil作为集成开发环境。接下来,连接STM32单片机并确定下载方式(如使用ST-LINK或J-Link等调试工具),选择相应的下载工具和端口,然后点击Keil菜单栏中的“Flash”按钮进行下载操作。在弹出的对话框中,选择合适的单片机型号和工程存放路径,并勾选需要的Startup文件和库文件,然后点击“OK”按钮即可。需要注意的是,在程序中需要包含STM32相关的头文件,并正确配置相关的GPIO参数。原创 2023-06-10 01:00:34 · 1581 阅读 · 0 评论 -
Linux内核漫谈之mmap全面解析
mmap是Linux内核提供的一个非常重要的系统调用,它可以将磁盘上的文件映射到内存中,然后通过访问该内存来读写文件内容。在单片机中,mmap同样也有非常好的应用场景。总结一下,mmap在Linux内核中是一个非常重要的系统调用,它可以将磁盘上的文件直接映射到进程的虚拟地址空间中,从而方便我们进行文件读写操作。首先,我们需要明确一点,mmap并不是一个普通的内存分配方式,它直接将磁盘上的文件映射到了进程的虚拟地址空间,因此,我们在操作mmap时需要非常小心谨慎,否则会导致程序崩溃或数据丢失等问题。原创 2023-06-10 00:53:56 · 480 阅读 · 0 评论 -
使用tcpdump和Wireshark工具进行单片机开发
除了使用tcpdump和Wireshark以外,我们还可以使用一些支持网络通信的编程语言来进行单片机的网络开发。然后,它等待并接收来自目标设备的响应,并打印出该响应的内容和源地址。为了方便调试和故障排除,我们可以使用tcpdump和Wireshark这两个工具来进行网络数据包的捕获和分析。通过使用tcpdump、Wireshark以及支持网络通信的编程语言,我们可以更轻松地进行单片机网络开发,并且快速定位、解决网络故障。上述命令会抓取网卡eth0上的端口号为1234的UDP数据包,并将其显示在终端上。原创 2023-06-10 00:45:38 · 145 阅读 · 0 评论 -
微信消息提醒SDK,简单快速接入,告警服务轻松搞定
今天,我们将介绍一个基于单片机的微信消息提醒SDK,帮助开发者简单快速地接入微信消息提醒功能,并实现告警服务。同时,它还提供了可自定义的消息模板,方便用户根据自己的需求进行二次开发。除了文本和图片消息,SDK还支持其他类型的消息,包括语音、视频、图文等。最后,我们还需要在微信公众平台上进行相应的配置,以确保消息能够被正确地发送和接收。通过以上的步骤,我们就可以通过微信消息提醒SDK实现一个简单的告警服务,并快速地将其集成到设备控制系统中。同时,开发者还可以根据自己的需求进行二次开发,实现更加复杂的功能。原创 2023-06-10 00:35:40 · 539 阅读 · 0 评论 -
I2C通讯协议详解及单片机应用
I2C(Inter-Integrated Circuit)总线是一种串行通讯总线,由飞利浦公司在20世纪80年代开发。初始化时需要指定I2C地址,并通过Wire库初始化I2C总线。"的消息并延时1秒。I2C总线的通讯协议分为两种模式:标准模式和快速模式。标准模式下,总线速率最高可达100kbps,快速模式下可达到400kbps。总之,I2C通讯协议是一种方便快捷、应用广泛的串行通讯方式。在单片机开发中,我们可以使用各种I2C设备,如AD转换器、OLED显示屏等,来完成我们的各种任务。原创 2023-06-10 00:27:20 · 197 阅读 · 0 评论 -
单片机控制USB OTG状态切换
USB On-The-Go(简称USB OTG)是指支持设备间直接通信,而不需要连接至主机电脑的USB标准。作为一种新型的USB应用模式,USB OTG通过配置奇偶端口实现主从设备角色的动态切换。在本篇文章中,我们将介绍如何使用单片机来控制USB OTG的状态切换,并提供相应的源代码。本篇文章介绍了如何使用单片机来控制USB OTG状态切换,实现主从设备角色的动态切换。通过上述步骤中给出的源代码,读者可以很容易地在自己的项目中集成该功能。然后,我们需要实现USB设备拔插检测的程序。-USB OTG线缆。原创 2023-06-10 00:19:02 · 809 阅读 · 0 评论 -
单片机平台设备与驱动实现
首先,我们需要根据数据手册了解硬件的寄存器和寄存器位,以便在代码中可以进行相应的配置。1.数据手册和寄存器位:在编写驱动程序之前,我们需要仔细阅读数据手册,了解硬件的详细信息,包括寄存器和寄存器位,以便能够正确地配置硬件。总而言之,实现单片机上的设备驱动程序需要我们对硬件有足够的了解,并且需要编写相应的代码。在实际应用中,我们需要根据具体的硬件设备和需求来编写相应的驱动程序。3.电平转换:在编写驱动程序时,我们需要了解硬件的输入和输出电平范围,并且进行电平转换,以便让单片机能够正确地控制硬件设备。原创 2023-06-10 00:10:42 · 258 阅读 · 0 评论 -
如何控制单片机的时钟频率?
要控制单片机的时钟频率,我们需要了解两个关键因素:晶振的频率和分频的系数。通常情况下,我们使用外接的晶振作为时钟源,晶体的频率决定了系统的基本频率。然后,我们使用分频器来将基本频率分频为我们需要的较低频率。在这段代码中,我们首先开启了外部晶振的使用,然后将时钟分频器设置为1,即不分频。在单片机中,时钟频率的控制是非常重要的一项功能。通过合理地控制时钟频率,我们可以实现对系统运行速度、功耗、精度以及可靠性的有效掌控。总之,掌握好单片机的时钟频率控制技术,可以帮助我们更好地优化系统性能。原创 2023-06-09 21:06:07 · 713 阅读 · 0 评论 -
IP协议代码分析与实现
它的作用是将数据包从源地址传输到目的地址,保证数据的可达性和传输的正确性。IP协议的接收部分主要根据协议类型将数据包传递给相应的协议处理函数进行处理。在接收到数据包后,先计算接收到的IP头的校验和,如果校验和不为0,则说明数据包中存在错误。IP协议的发送部分主要构造IP协议头,并计算校验和后将整个数据包发送出去。以上就是IP协议的源代码分析和实现原理的简要介绍。IP协议的源代码主要分为两部分:发送和接收。发送部分主要负责数据包的构造和发送,接收部分主要负责数据包的接收和处理。IP协议代码分析与实现。原创 2023-06-09 20:49:25 · 389 阅读 · 0 评论 -
DTS架构下单片机设备与驱动匹配流程详解
设备和驱动的匹配是由设备树框架提供的。当系统启动时,系统会遍历设备树,将每个设备节点和所有驱动节点逐一进行匹配,匹配成功后就会执行驱动程序的probe函数进行初始化。在设备树中,每个设备都由一个设备节点(Device Node)来描述,每个设备驱动程序也有一个驱动节点(Driver Node)来描述。在DTS(Device Tree Source)架构下,设备和驱动程序之间的匹配是由设备树(Device Tree)来实现的。总而言之,在DTS架构下,设备和驱动程序之间的匹配是由设备树完成的。原创 2023-06-09 20:39:27 · 544 阅读 · 0 评论 -
单片机系统代码修改标准
在单片机系统代码编写中,为了保证代码的可读性、可维护性和可扩展性,必须要遵循一定的代码规范。本文将介绍单片机系统代码修改的一些标准和规范。总之,编写单片机系统代码时,一定要遵循以上规范和标准,保证代码的可读性、可维护性和可扩展性。单片机系统代码修改标准。原创 2023-06-09 20:31:08 · 199 阅读 · 0 评论 -
深度学习框架Mnn介绍及其在单片机上的简单应用
在以上示例中,我们调用了Mnn提供的Interpreter、Tensor和Session等类,使用输入Tensor传递数据,使用输出Tensor获取推理结果,并最终释放相关资源。本文介绍了Mnn的编译、模型转换和单片机应用等步骤,并提供了相应的源代码供读者参考。Mnn是一款轻量级的深度学习框架,能够支持多种平台(包括单片机),具有较高的性能和灵活性。在单片机上使用Mnn进行深度学习推理时,需要先将Mnn模型上传到单片机中,并在程序中调用相应的接口进行推理。model.mnn表示转换后的MNN模型。原创 2023-06-09 20:24:28 · 987 阅读 · 0 评论 -
优化Regmap的使用方法,助您轻松应对单片机编程
在单片机编程中,寄存器映射(regmap)是必不可少的一部分。它通过将一个或多个寄存器映射到单一地址来简化处理器与外部设备之间的通信。以下是一个基于STM32F103系列单片机的例子,演示如何通过寄存器映射读取和写入GPIO端口。以上是一个简单的寄存器映射例子,通过优化代码结构和使用宏来获取GPIO状态,可以让代码更加简洁、清晰。希望这篇文章能够对初学者提供帮助,更好地理解和应用单片机编程中的寄存器映射技术。优化Regmap的使用方法,助您轻松应对单片机编程。原创 2023-06-09 20:14:30 · 107 阅读 · 0 评论 -
安卓系统开机流程解析
应用程序进程启动:最后,Android 系统会启动应用程序进程,并将它们运行在独立的安全沙盒中。Linux 是 Android 操作系统的最底层部分,在启动过程中,它将执行设备的基本硬件初始化和其他初始化任务。init 进程启动:完成 Linux 内核启动后,会启动一个名为 init 进程的系统进程。启动 Zygote 进程:Zygote 进程是一个特殊的进程,它是应用程序进程的孵化器。总之,以上是 Android 设备开机的完整流程,从硬件初始化到启动操作系统,每一个步骤都是非常重要的。原创 2023-06-09 19:57:47 · 450 阅读 · 0 评论 -
I2C 总线子系统原理与实现详解
I2C(Inter-Integrated Circuit)是一种通信协议,通常应用于连接微控制器和各类外设。本文将深入介绍 I2C 总线子系统的原理与实现,并提供相应的源代码示例。以上是 I2C 子系统的基本原理与实现,希望能够对大家有所帮助。SCL:时钟线,用于同步数据传输速率,由主设备控制。SDA:数据线,双向传输数据,由主设备和从设备共享。从机发起通讯(Slave Transmit)主机向从机发送数据,从机进行响应。从机向主机发送数据,主机进行响应。I2C 总线子系统原理与实现详解。原创 2023-06-09 19:49:29 · 100 阅读 · 0 评论