自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Verilog 中寄存器类型(reg)与线网类型(wire)的区别

在Verilog硬件描述语言中,​寄存器类型(Register Types)​和线网类型(Net Types)​是两类最基础且容易混淆的变量类型。理解二者的差异对编写可综合的RTL代码和避免仿真错误至关重要。本文将通过概念解析、代码示例和对比表格,彻底剖析二者的核心区别。理解寄存器与线网类型的区别是Verilog设计的基石。寄存器类型(reg)​描述数据存储行为,而线网类型(wire)​描述电路连接关系。过程块内操作使用reglogic模块端口和连续赋值使用wire组合逻辑中的中间变量可灵活使用reg。

2025-03-26 13:17:48 932

原创 FPGA 中 assign 和 always 区别

在FPGA设计中,assign与always是Verilog语言中最常用的两种赋值方式。虽然它们都能实现逻辑功能,但是底层机制和适用场景存在本质差异。本文将从技术原理、代码规范和工程实践三个维度深入分析两者的区别,帮助大家建立正确的设计思维。assign语句是连续赋值语句,其赋值行为如同物理导线连接,实时反应输入变化。assign 目标信号 = 表达式;该语句适用于组合逻辑描述,所有操作数变化时立即重新计算结果,适合简单逻辑门电路的硬件描述。always语句是过程赋值语句,通过敏感事件触发执行。

2025-03-15 16:34:21 716

原创 STM32 DMA 串口从机数据接收完成的判断方法

在STM32的开发过程中,使用DMA(直接内存访问)配合串口进行数据传输是一种高效的方式。然而,对于串口从机而言,准确判断一条数据接收完成是数据处理的关键缓解。本文将介绍几种常见的判断方法,帮助大家更好地理解和应用。总体来说,我更倾向于第三种方法,因为好多时候我们对接第三方协议不能够保证数据接收的长度以及对方提供结束符,IDLE中断的方式不管接收哪种数据都能接收完整,注意接收不要超出数组的长度就可以了。

2025-02-27 14:11:30 1233 2

原创 指针函数和函数指针的区别

指针函数是返回值为指针类型的函数,简单的来说,它本身是一个函数,只是这个结果是返回的指针类型,该指针可以指向各种数据类型,如整形、浮点型、结构体等。指针函数是一个函数,只是返回值为指针;而函数指针本质是一个指针变量,它指向的是函数。指针函数常用于返回动态分配的内存地址或数组等;函数指针常用于实现回调函数、函数表等,以提高程序的灵活性和可扩展性。

2025-02-26 09:45:54 654

原创 stm32 lwip tcp服务端频繁接收连接失效问题解决(tcp_recved)

tcp_recved 函数的主要作用是告知 lwIP 协议栈,应用程序已经成功处理了指定长度的数据,这样 lwIP 可以更新接收窗口的大小,允许发送方继续发送更多的数据。在 TCP 协议中,接收方会维护一个接收窗口,用于告知发送方自己当前能够接收的数据量。当应用程序处理完一部分数据后,需要调用 tcp_recved 函数来调整这个窗口大小,以保证数据的正常传输。

2025-02-13 17:34:00 1524

原创 CAN 通讯实战解析

CAN(Controller Area Network)即控制器局域网,是一种广泛应用于汽车电子、工业自动化、船舶、医疗设备等领域的串行通信协议。它由德国博世公司在 20 世纪 80 年代初为汽车电子控制系统而开发,旨在解决汽车中大量电子控制单元(ECU)之间的通信问题,提高通信的可靠性、实时性和抗干扰能力。

2025-02-11 17:34:57 807

原创 Linux IO 多路复用之 select 与 poll 的区别

在 Linux 系统编程中,IO 多路复用是一个至关重要的概念,它允许我们在一个线程中同时监控多个文件描述符的事件,从而实现高效的并发处理。在众多的 IO 多路复用技术中,select 和 poll 是比较常用的两种方式。今天,我们就来深入探讨一下 select 和 poll 之间的区别。select 和 poll 都是 Linux 中常用的 IO 多路复用技术,它们在功能上有相似之处,但在实现细节上存在诸多区别。在实际应用中,需要根据具体的场景和需求来选择合适的技术。

2025-01-22 15:22:44 762

原创 QT 中 UDP 的使用

UDP(User Datagram Protocol,用户数据报协议)是一种无连接的传输层协议。与 TCP 相比,UDP 在数据传输时不需要建立连接,也不保证数据的可靠传输、顺序到达以及不重复。这使得 UDP 具有较低的开销和较高的传输效率,适用于对实时性要求较高,而对数据准确性要求相对较低的场景,如视频流、音频流传输等。通过以上步骤和示例代码,我们可以在 QT 中实现基本的 UDP 通信功能。在实际应用中,还需要根据具体需求对代码进行优化和扩展,例如处理网络异常、实现更复杂的数据结构传输等。

2025-01-21 10:16:55 1182

原创 QT的TCP通讯

在网络编程领域,TCP(Transmission Control Protocol,传输控制协议)是一种广泛应用的可靠传输协议。QT 作为一个强大的跨平台 C++ 应用程序开发框架,提供了丰富的类库来支持 TCP 通讯的开发。本文将详细介绍如何使用 QT 进行 TCP 通讯,包括客户端和服务器端的实现,希望能帮助大家快速上手相关开发

2025-01-17 15:48:35 2177

原创 Qt多线程开发全解析

本文全面介绍了Qt多线程编程的相关知识,包括基础概念、使用场景、实现方式、线程间的同步与通信、实际案例以及注意事项等。通过学习本文,读者应该对Qt多线程开发有了一个较为深入的理解和掌握。在实际开发中,根据具体的需求和场景,选择合适的多线程实现方式,合理运用线程同步和通信机制,能够有效地提高应用程序的性能和响应性。希望本文能对广大Qt开发者有所帮助,让大家在多线程编程的道路上更加得心应手。

2025-01-13 09:24:07 885

原创 linux的线程同步(条件变量和锁)

互斥锁、条件变量、自旋锁和读写锁在Linux线程同步中各有特点和适用场景。互斥锁是最常用的同步工具,适用于大多数场景。条件变量用于在特定条件满足时通知线程。自旋锁适用于对锁的等待时间较短且不希望线程上下文切换的场景。读写锁则在对共享资源进行读和写操作时提高效率。

2025-01-03 14:10:51 1313

原创 Linux 线程详解

线程是进程内的一个执行单元,是进程内可调度的实体。一个进程可以包含多个线程,这些线程共享进程的资源,如内存空间、文件描述符等,但拥有各自独立的程序计数器、栈和寄存器等执行上下文。线程相较于进程,创建和切换开销更小,能更有效地利用多核处理器资源,提高程序的并发性能。

2025-01-02 16:39:42 1198

原创 Linux 父子进程详解

在 Linux 系统中,父子进程是进程管理的重要概念,它们之间存在着紧密的联系和特定的行为模式,这对于理解系统的运行机制和进程的并发执行至关重要。理解 Linux 父子进程的这些特性和行为,对于开发多进程程序、进行系统编程以及深入理解操作系统的进程管理机制都具有重要的意义,能够帮助程序员更好地利用进程的并发特性来提高系统的性能和资源利用率,同时确保程序的正确性和稳定性。

2024-12-31 11:39:41 1177

原创 Linux 信号集与信号掩码

信号集和信号掩码是Linux信号处理中的重要工具。信号集提供了一种方便的方式来组织和管理信号,而信号掩码则允许我们精确地控制进程对信号的接收。理解和掌握它们的概念和操作方法,能够帮助我们更好地编写健壮、高效的Linux程序,提升程序在复杂环境下应对各种事件的能力。

2024-12-30 14:46:13 1165

原创 Linux 的信号机制

Linux 信号机制作为操作系统内核与进程之间的重要通信手段,为系统的稳定运行、进程间的协作以及错误处理提供了高效、灵活的方式。深入理解信号机制的原理、产生方式、处理流程以及应用场景,对于开发高质量、健壮的 Linux 应用程序具有至关重要的意义,能够帮助开发者更好地利用系统资源,优化程序行为,提高系统的整体性能和可靠性。

2024-12-28 09:09:33 1462

原创 Linux 标准 I/O 库

Linux 标准 I/O 库是基于底层系统调用(如等)构建而成,但对程序员隐藏了许多复杂的细节,例如缓存管理、字符编码转换等。其核心对象是流(FILE *),通过流来进行各种 I/O 操作,常见的流包括标准输入流(stdin)、标准输出流(stdout)和标准错误流(stderr),它们在程序启动时自动打开并可用。fopen用于打开一个文件并返回相应的流指针。

2024-12-27 14:31:13 1024

原创 Linux 文件 I/O 基础

Linux 文件 I/O 基础操作虽然看似简单,但却是系统编程中不可或缺的部分。通过熟练掌握文件描述符、打开、读取、写入和关闭文件等基本操作,我们可以在 Linux 系统上进行各种复杂的文件处理任务,为进一步深入学习系统编程打下坚实的基础。希望这篇文章能帮助你对 Linux 文件 I/O 有一个初步的理解和掌握。

2024-12-26 17:14:18 851

原创 Linux 的 Regmap API:简化设备寄存器访问

Linux 的 Regmap API 为设备驱动开发者提供了一个强大而灵活的工具,用于简化和统一硬件设备寄存器的访问。它不仅提高了代码的复用性和可维护性,还降低了开发难度,使得开发者能够更加专注于设备的功能实现而非底层硬件细节。无论是初学者还是经验丰富的开发者,掌握 Regmap API 都将有助于提升 Linux 驱动开发的效率和质量。在未来的驱动开发项目中,不妨尝试使用 Regmap API,让你的代码更加简洁、高效且易于维护。

2024-12-23 16:06:44 851

原创 Linux 的 pinctrl 和 gpio 子系统

通过对 Linux 的 pinctrl 和 gpio 子系统的深入探讨,我们可以看到它们在设备驱动开发中发挥着不可或缺的作用。pinctrl 子系统为芯片引脚的配置提供了强大的功能复用和电气特性控制能力,而 gpio 子系统则为开发者提供了便捷的 GPIO 引脚操作接口。两者的协同工作使得开发者能够高效地管理和控制芯片的引脚资源,实现与外部设备的稳定、可靠的通信和交互。

2024-12-20 10:57:21 1241

原创 深入理解 Linux 内核启动流程

Linux 内核的启动流程是一个复杂而精细的过程,它涉及到硬件设备的初始化、内存管理、进程管理等多个方面。通过了解这个过程,我们可以更好地理解 Linux 系统的工作原理,为系统的维护和优化提供帮助。

2024-12-19 15:29:04 1350

原创 C 语言二维数组与二级指针的深度剖析

二级指针是指向指针的指针。例如,int **p定义了一个二级指针p,它可以存储一个指向int类型指针的地址。二级指针在处理复杂的数据结构、动态内存分配以及函数参数传递等方面非常有用。它提供了一种间接访问和操作数据的方式,可以通过多次解引用来访问最终的数据。C 语言中的二维数组和二级指针是强大但又需要谨慎使用的工具。理解它们的本质、关系和正确使用方法,可以帮助我们编写更加高效、可靠的 C 语言程序。

2024-12-16 15:35:58 1099

原创 Qt 实现 UDP 广播的详细教程

通过以上步骤,我们可以在 Qt 中轻松实现 UDP 广播功能。UDP 广播在网络发现、设备间通信等场景下非常有用,可以大大简化网络通信的实现。在实际应用中,根据具体需求进行适当的调整和优化,以确保广播通信的稳定和安全。希望这篇文章对你在 Qt 中实现 UDP 广播有所帮助!如果你有任何问题或建议,欢迎在评论区留言。

2024-12-13 16:13:22 1275 9

原创 信号量与互斥信号量的区别

信号量侧重于资源计数和任务同步。它可以用于多个任务对多个资源的访问控制,或者用于协调任务之间的执行顺序,不强调资源的互斥访问。互斥信号量主要用于实现对共享资源的互斥访问,确保同一时刻只有一个任务能够访问特定的共享资源,同时也关注优先级反转等问题。

2024-12-12 16:47:43 1231

原创 STM32输入捕获详解

STM32 的输入捕获功能是一个非常强大的工具,可以帮助我们准确地测量外部信号的参数。通过合理地配置定时器和相关寄存器,以及编写中断服务函数,我们可以轻松地实现输入捕获功能。在实际应用中,我们需要根据具体的需求选择合适的定时器和捕获通道,并注意处理定时器溢出等情况,以保证测量结果的准确性。希望本文对大家理解和使用 STM32 的输入捕获功能有所帮助。

2024-12-11 23:10:30 2154

原创 STM32 新手入门教程

STM32 微控制器以其强大的性能、丰富的外设和广泛的应用场景,成为了嵌入式开发领域的热门选择。对于新手来说,STM32 的学习可能会有一定的挑战,但只要掌握了正确的方法和步骤,就能够快速入门并开始自己的嵌入式开发之旅。本文将为新手提供一个全面的 STM32 入门教程,帮助大家快速上手。STM32 的学习需要一定的时间和耐心,但只要掌握了正确的方法和步骤,就能够快速入门并开始自己的嵌入式开发之旅。本文为新手提供了一个全面的 STM32 入门教程,希望能够帮助大家快速上手。

2024-12-09 15:47:26 1780

原创 QT 中 QString 转换为 Unicode 和 ASCII 的方法

在 Qt 开发中,经常会遇到需要将QString中的字符转换为特定编码格式的需求。本文将介绍如何将QT 中 QString 转换为 Unicode 和 ASCII 的方法。在 Qt 开发中,将QString转换为不同编码格式的需求是很常见的。通过了解QString的内部编码方式以及QChar等相关数据类型的使用方法,可以方便地实现将QString转换为 Unicode 和 ASCII 的操作。同时,在进行这些转换时,需要注意字节序、编码完整性等问题,以确保转换结果的准确性和可靠性。

2024-12-08 17:43:42 1705

原创 Linux U-Boot 启动流程详解

Linux U-Boot 的启动流程是一个复杂但又非常重要的过程,它涉及到硬件初始化、软件加载和控制权传递等多个环节。通过深入理解 U-Boot 的启动流程,开发人员可以更好地进行嵌入式系统的开发和调试工作,解决在启动过程中可能遇到的各种问题。同时,对于不同的硬件平台和应用需求,开发人员还可以对 U-Boot 进行定制和优化,以满足系统的特定要求。

2024-12-05 17:06:14 1144

原创 lwip raw、netcoon、socket三种接口编程的区别

在嵌入式网络编程中,LWIP(Lightweight IP)是一个轻量级的 TCP/IP 协议栈,广泛应用于 STM32 等微控制器平台。LWIP 提供了多种编程接口,其中 RAW、NETCONN 和 Socket 是比较常用的三种。本文将详细介绍这三种接口编程的区别,帮助开发者更好地选择适合自己项目的编程方式。LWIP 是一个开源的轻量级 TCP/IP 协议栈,专门为嵌入式系统设计。它具有占用内存少、运行效率高、可移植性强等特点,非常适合在资源有限的微控制器上使用。

2024-12-03 16:32:36 1768

原创 STM32 中 FATFS 文件系统代码分析

FATFS 是一个开源的 FAT 文件系统模块,用 C 语言编写,可以移植到多种嵌入式系统中。小巧高效:代码量小,占用内存少,运行速度快。易于移植:完全用 C 语言编写,不依赖于特定的硬件平台,可以很容易地移植到不同的微控制器上。功能丰富:支持文件的创建、打开、读写、关闭、删除等操作,还支持目录的创建、删除、遍历等操作。兼容性好:与 Windows 系统的 FAT 文件系统兼容,可以在 Windows 系统上直接读取和写入 STM32 上的文件。

2024-12-02 10:35:46 1413

原创 LWIP和FATFS 实现 FTP 服务端

LWIP 是一个开源的轻量级 TCP/IP 协议栈,它具有占用内存少、可裁剪性强等特点,非常适合在嵌入式系统中使用。LWIP 支持多种网络接口,包括以太网、Wi-Fi 等,可以方便地与各种硬件平台进行集成。本文介绍了如何使用 LWIP 实现一个简单的 FTP 服务端。通过本文的介绍,你可以了解到 LWIP 和 FTP 的基本概念,以及如何使用 LWIP 实现 FTP 服务端的步骤。在实际应用中,你可以根据自己的需求对 FTP 服务端进行扩展和优化,以满足不同的应用场景。

2024-11-28 15:44:12 1839 1

原创 Linux IIC 驱动详解

IIC(Inter - Integrated Circuit)总线是一种广泛应用于集成电路之间通信的串行总线协议。在 Linux 系统中,IIC 驱动提供了一种标准的方式来实现与 IIC 设备的通信。理解 Linux IIC 驱动对于开发基于 IIC 接口的设备驱动程序至关重要。

2024-11-25 09:02:54 1016

原创 Linux INPUT 子系统详解

Linux INPUT 子系统为输入设备的管理和处理提供了一种统一的框架,使得不同类型的输入设备可以以相同的方式被操作系统识别和处理。通过深入了解 INPUT 子系统的架构、工作原理和使用方法,可以更好地进行输入设备驱动开发和应用程序开发,提高系统的可扩展性和可维护性。同时,随着技术的不断发展,INPUT 子系统也在不断演进和完善,为用户提供更加丰富和便捷的输入体验。

2024-11-22 10:41:39 1022

原创 Linux 的设备与驱动

深入理解 Linux 设备与驱动是进行 Linux 内核开发和设备驱动开发的基础。通过了解设备的分类、驱动的结构和工作流程,以及掌握一些关键技术点,可以更好地开发、调试和优化设备驱动程序,提高系统的性能和稳定性。同时,随着技术的不断发展,Linux 设备与驱动也在不断演进和完善,开发者需要不断学习和探索新的技术和方法,以适应不断变化的需求。

2024-11-19 10:43:49 1103

原创 Linux misc 驱动详解

misc 驱动是 Linux 内核中一种特殊的字符设备驱动,用于那些不适合用其他更特定类型驱动(如块设备驱动、网络设备驱动等)来表示的设备。这些设备通常具有一些特殊的特性或者功能,不能简单地归为常见的设备类型。

2024-11-18 10:40:32 1270

原创 Linux中platform的使用

Linux platform 是一种虚拟总线,主要用于连接那些不直接连接到传统物理总线(如 PCI、USB 等)上的设备。它提供了一种统一的框架,使得设备和驱动可以在系统中进行动态匹配和管理。作用在于简化设备驱动的开发,提高代码的可维护性和可移植性。通过 platform 总线,设备和驱动可以独立开发,然后在运行时进行匹配,减少了对特定硬件平台的依赖。

2024-11-15 13:45:05 1147

原创 STM32 独立看门狗(IWDG)详解

STM32 的独立看门狗是一种非常重要的可靠性机制,可以在系统出现故障时自动复位系统,确保系统的正常运行。在使用独立看门狗时,需要注意喂狗时间、时钟源稳定性和中断处理等问题,以确保独立看门狗能够正常工作。希望本文对大家理解和使用 STM32 的独立看门狗有所帮助。

2024-11-14 09:16:22 2160

原创 FreeRTOS 低功耗 Tickless 模式深度解析

FreeRTOS 的低功耗 Tickless 模式为嵌入式系统提供了一种有效的功耗管理方法。通过合理地配置和使用 Tickless 模式,可以显著降低系统的功耗,提高响应速度,延长电池寿命。在实际应用中,开发者需要根据硬件平台的特性和应用场景的需求,进行适当的配置和编程,以充分发挥 Tickless 模式的优势。希望本文对读者理解和使用 FreeRTOS 的 Tickless 模式有所帮助。

2024-11-13 10:20:26 1005

原创 Linux 中自旋锁与信号量的区别

自旋锁是一种忙等待锁,当一个线程试图获取一个被占用的自旋锁时,它会一直循环(“自旋”)在那里,不断地检查锁是否可用,直到锁被释放为止。自旋锁的实现通常基于原子操作,例如在多处理器系统中,通过原子的测试和设置操作来实现锁的获取和释放。信号量是一种睡眠锁,当一个线程试图获取一个被占用的信号量时,它会被挂起,进入睡眠状态,直到信号量被释放并且该线程被唤醒为止。信号量通常使用一个计数器来表示可用资源的数量。当一个线程获取信号量时,计数器减一;当一个线程释放信号量时,计数器加一。

2024-11-12 09:08:19 857 2

原创 FreeRTOS 信号量的使用

信号量是一种用于任务间同步和资源管理的机制。它可以被看作是一个计数器,用于控制对共享资源的访问。当一个任务需要访问共享资源时,它可以尝试获取信号量。如果信号量的值大于零,任务可以成功获取信号量并访问资源;如果信号量的值为零,任务将被阻塞,直到信号量的值大于零。实现任务之间的同步、控制对共享资源的访问、防止资源竞争和死锁等问题。二进制信号量只有两种状态:可用(1)和不可用(0)。它通常用于实现任务之间的同步,例如一个任务等待另一个任务完成某个操作后再继续执行。

2024-11-11 10:04:02 1018

原创 C 语言指针与链表的使用

指针是一个变量,它存储的是另一个变量的内存地址。通过指针,我们可以间接访问和操作内存中的数据。指针的主要作用包括:动态内存分配、函数参数传递、实现复杂的数据结构(如链表、树、图等)。链表是一种动态的数据结构,它由一系列节点组成,每个节点包含一个数据元素和一个指向下一个节点的指针,链表的起点为头节点,尾节点的指针域为NULL。链表的特点是可以动态地增长和缩小,不需要预先知道数据的数量。与数组相比,链表的优点是插入和删除元素的操作更加高效,不需要移动大量的数据。

2024-11-09 09:58:45 1411

STM32 实现 TCP 服务器与多个设备通信

STM32 实现 TCP 服务器与多个设备通信

2024-12-08

LWIP和FATFS 实现 FTP 服务端

LWIP和FATFS 实现 FTP 服务端

2024-11-28

空空如也

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

TA关注的人

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