自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(153)
  • 资源 (8)
  • 问答 (2)
  • 收藏
  • 关注

原创 嵌入式硬件设计实例:基于STM32的流水灯原理图和PCB设计

本篇文章简单地介绍了一下嵌入式单片机的一个简单的最小系统的设计,其中涉及的知识还是很多的,如果做更复杂的PCB的话,如高频、强弱电、EMC,还有电容电阻的参数,阻值大小,容值大小等方面都需要有一些考虑。所以我是不赞成网上说的:嵌入式工程师软硬件都要会,要学很多东西。实际上,对于嵌入式软件工程师来说,硬件方面,只需要会示波器,万用表,看得懂简单的原理图就够了。具体我上面所说的这些细节,仅仅一个电容电阻的大小怎么选,又有几个人知道呢?就单单一个电源来说就有够学好几个月了,还有运放、EMC等等的知识。

2024-03-06 07:00:00 1464

原创 Linux内核学习(1):目录结构、配置、编译和常用Shell命令

Linux是一种开源的类Unix操作系统内核,它由LinusTorvalds在1991年创建。Linux操作系统是基于Unix设计理念的,旨在提供一个稳定、可靠、安全且高度可定制的操作环境。内核:Linux内核是操作系统的核心,负责管理系统的资源和提供基本的硬件控制。它是开源的,可以根据需要进行定制和修改。开源:Linux采用开源模型,意味着其源代码是公开可用的。这使得用户可以自由查看、修改和分发系统的源代码。多用户和多任务:Linux支持多用户环境,多个用户可以同时使用系统。

2024-02-22 07:00:00 890

原创 U-Boot学习(7):内核启动之bootz启动zImage源码分析

在上一节中,我们分析了,最后就是进入U-Boot的命令行中执行了,如果用户没有任何操作,则经过固定延时后将执行默认的bootcmd环境变量里的指令,那这里面肯定就是启动内核了。在中,我们知道最后执行的应该是bootz指令,那本节就来看一下这个指令如何启动内核的。

2024-01-31 07:00:00 968

原创 U-Boot学习(6):初始化之_main函数源码分析

ARM中函数使用到的全局变量,会在每个函数的最后留一段内存空间来保存使用到的变量的地址。如果我们要让重定位后的代码可以正常访问全局变量的话,我们只需要修改函数最后这段内存空间里对应的全局变量的地址,给这个地址加上重定位偏移即可。

2024-01-30 07:00:00 990

原创 U-Boot学习(5):系统初始化之start.S文件源码分析

最后程序就跳转到_main(在中)函数执行。我们知道U-Boot最后就是执行一个命令行程序,然后可以跳转到内核执行。这正是在_main中要完成的操作。下一篇文章我们继续分析。

2024-01-25 07:00:00 895

原创 位置无关码PIC详解:原理、动态链接库、代码重定位

本文解释了什么是位置无关代码,以及它如何帮助创建具有可共享只读文本段的共享库。位置无关代码(PIC)通过引入全局偏移表(GOT)和过程链接表(PLT)实现,解决了共享库加载时的重定位问题。GOT提供了数据和函数的间接引用,PLT实现了懒绑定,推迟函数地址的解析。当然这也伴随额外的内存加载和寄存器使用成本,但在权衡之下,现代的编译器都更倾向于使用PIC。

2024-01-23 07:00:00 1356

原创 U-Boot学习(4):u-boot.lds链接脚本分析

lds链接脚本基础与例子分析。SECTIONS {......secname和contents是必须的,前者用来命名这个段,后者用来确定代码中的什么部分放在这个段中。start:段重定位地址,也称为VMA,即运行地址。如果代码中有位置相关的指令,程序在运行时,这个段必须放在这个地址上。:虽然start指定了运行地址,但是仍可以使用BLOCK(align)来指定对齐的要求一这个对齐的地址才是真正的运行地址。(NOLOAD):用来告诉加载器,在运行时不用加载这个段。

2024-01-17 07:00:00 1108

原创 U-Boot学习(3):.config、defconfig文件对比及图形化配置Kconfig

1、在U-Boot的defconfig文件中,配置项之间存在依赖关系。当你在defconfig文件中启用或禁用某个配置项时,可能会触发相关的配置项引申或取消。在defconfig文件中,一些配置项可能有直接的依赖关系。这意味着启用或禁用一个配置项可能会导致与之直接相关的其他配置项的状态发生变化。这通常是通过配置项的名称来指定的。有些配置项可能存在间接的依赖关系。这意味着启用或禁用一个配置项可能会触发一系列的配置项状态变化,这些变化可能是由于其他配置项的依赖关系而产生的。所以在生成的.config。

2024-01-16 07:00:00 1218

原创 U-Boot学习(2):U-Boot编译和.config配置文件生成分析

上一节中,介绍了如何使用U-Boot。我们知道一个U-Boot可能要适配不同的硬件,所以不同的硬件就有不同的配置,配置后就可以编译U-Boot,最终生成镜像。U-Boot如何编译,以什么规则编译,编译后下载到内存中的哪里呢,这一切都在Makefile中。所以本节课就来分析一下U-Boot的Makefile的结构。

2024-01-11 07:00:00 1398

原创 U-Boot学习(1):简介及命令行指令详解

U-Boot是一个开源的引导加载程序,主要用于嵌入式系统和嵌入式设备。它被设计成通用的,能够在多种处理器架构上运行,如ARM、MIPS、x86等。U-Boot的主要功能是加载并启动操作系统内核,最常见的是Linux内核。当嵌入式设备上电或者复位时,处理器会从固定地址处的启动ROM(Boot ROM)中开始执行代码。启动ROM的主要任务是初始化系统的基本硬件,如时钟、内存控制器等,并加载U-Boot引导加载程序到RAM中。一旦U-Boot加载到RAM中,它就开始执行。

2024-01-10 07:00:00 1184

原创 嵌入式Linux:环境搭建之TFTP、NFS、SSH和FTP的安装和使用

NFS(网络文件系统,)是一种分布式文件系统协议,允许我们挂载远程的目录。这让我们能够管理不同位置的存储空间,多个客户端也可以更改这个空间。我们在开发的过程中,如果我们更改了Linux内核或者设备树,就需要重新将镜像烧写到NAND/SD/EMMC等设备中,然后由UBoot拷贝到RAM。这样就很麻烦,我们就可以在UBoot中利用NFS来从远程的主机(如Ubuntu)中加载内核和设备树到开发板的RAM中。

2024-01-09 07:00:00 1115

原创 ARM Cortex-A学习(3):MMU内存管理单元

本文大概地介绍了一下ARM中MMU的概念,主要是了解一下在Cortex-A核中有这样一个内存管理单元,它可以将虚拟地址转化为物理地址。对于具体地,内存是如何映射的,TLB表格是如何缓存的等知识,都与操作系统的实现有关,后续我们学到Linux再介绍。

2024-01-04 07:00:00 1290 1

原创 ARM Cortex-A学习(2):协处理器CP15详解

C0-C15,每组寄存器都包含多个寄存器。前面看到读写CP15寄存器有很多的参数,我们就可以通过提供不同的控制寄存器编号和操作码,来读取不同寄存器组下的不同寄存器。Functionc0c1c2c3Faultsc5/c6c7c8/c10c9L2 Controlc9c11Interruptsc12Process IDc13c15对于不同的Cortex-A核的不同ARM架构,CP15所包括的寄存器都会有一些区别,所以具体请查阅相关的ARM版本参考手册。下载地址。

2023-12-27 07:00:00 2011

原创 ARM Cortex-A学习(1):GIC(通用中断控制器)详解

GIC(通用中断控制器,)是一种用于处理中断的硬件组件,它的主要功能是协调和管理系统中的中断请求,确保它们被正确地传递给相应的处理器核心。

2023-12-26 07:00:00 1138

原创 I.MX6ULL启动详解:Boot配置、Bootable image启动头的组成

两个芯片虽然一个是Cortex-M,一个是Cortex-A,但是都是来源于NXP,所以有类似的BootROM代码,在启动的引导方式上是类似的,下面就来详细介绍一下。

2023-12-21 07:00:00 887

原创 I.MX RT1170双核学习(4):FreeRTOS之消息缓冲区(Message Buffer)双核通信详解

对于RT1170来说,它有两个内核,那两个内核如何通信呢?我们可以通过MU消息单元详解来实现这些功能,但它一次只能传输32位的数据。我们知道CM7和CM4有一些公共的内存可以访问,那我们可不可以借助这些公共的内存来实现数据的交互呢?答案当然是可以的,但是双核访问这些内存就需要进行互斥。FreeRTOS实现一个了消息缓冲区(),就是用来实现这个功能,这篇文章就来介绍一下。前面我们说了,我们采用共享内存来实现消息缓冲区,那一定需要一块同时能被CM7和CM4访问的内存。所以先来看看CM7和CM4共有的内存:这里我

2023-12-19 07:00:00 1997

原创 I.MX RT1170双核学习(3):多核管理之MCMGR源码分析详解

从上面状态机分析可知,CM7仅用了,而CM4仅用了。在CM4启动后,先发送一个消息给CM7,然后CM7开始传给CM4,最终CM7的状态都变为,表示CM7知道CM4已经启动了,就可以执行其它操作了。

2023-12-18 07:00:00 170

原创 I.MX RT1170双核学习(2):双核相互激活和启动流程

本文介绍了CM7和CM4相互激活的基本设置,在SDK中,有一个MCMGR)实现了多核之间的管理操作,除了实现本文所述的设置外,还有双核之间状态的同步。下一节就来剖析MCMGR中的源码实现。

2023-12-14 07:00:00 194

原创 I.MX RT1170双核学习(1):双核通信之MU消息单元详解

在I.MX RT1170中,它有CM7和CM4核,而消息单元(MU)模块使SoC内的两个处理器能够通过MU接口传递消息以进行通信和协调。

2023-12-13 07:00:00 195

原创 单片机(STM32,GD32,NXP等)中BootLoader的严谨实现详解

Bootloader的主要任务是引导加载并运行应用程序,我们的软件升级逻辑也一般在BootLoader中实现。本文将详细介绍BootLoader在单片机中的实现,包括STM32、GD32、NXP Kinetis等等的所有单片机,因为无论是什么样的芯片,它实现的逻辑都是一样的。

2023-12-12 07:00:00 3636

原创 Linux socket编程(12):Unix套接字之socketpair、sendmsg和recvmsg详解

在上一篇文章中,我们对Unix套接字编程有一个基本的了解。socketpairsendmsg和recvmsg,它们为实现本地进程间通信提供了便捷的方式。

2023-12-07 07:00:00 549

原创 Linux socket编程(11):Unix套接字编程及通信例子

Unix套接字是一种用于在同一台计算机上的进程间通信的一种机制。它是Linux和其他类Unix系统中的一项特性,通过在文件系统中创建特殊的套接字文件,进程可以通过这些套接字文件进行通信。

2023-12-06 07:00:00 397

原创 Linux socket编程(10):UDP详解、聊天室实现及进阶知识

与TCP不同,UDP是一种无连接的、不可靠的传输协议。相比于TCP,UDP更加轻量级,没有连接的建立和断开过程,也没有复杂的流控制和拥塞控制机制。UDP直接将数据包发送到目标地址,不保证数据的顺序和可靠性,因此在某些实时性要求较高、可以容忍少量数据丢失的应用场景中表现得更为适用。

2023-12-05 07:00:00 268

原创 Linux socket编程(9):IO复用之poll和epoll详解

在之前的文章中,我们学习了,但是select有监听描述符个数的限制,而且select的效率并不高,所以这篇文章就来学习效率更高的poll和Linux特有的epoll方法。

2023-12-04 07:00:00 132

原创 Linux socket编程(8):shutdown和close的区别详解及例子

close和shutdown。但这两种函数在使用时有着不同的行为和效果。在网络编程中,正确地选择和使用这些操作至关重要,因为它们直接影响着通信的结束和资源的释放。本文将介绍close和shutdown函数,然后举一个实际的例子来说明shutdown的使用。

2023-11-30 07:00:00 356

原创 Linux socket编程(7):I/O系统调用(读/写/连接)的超时处理

在网络编程中,对套接字的I/O的系统调用(如readwriteconnect)进行超时处理是至关重要的,特别是在需要响应及时的实时数据或避免无限期阻塞的情境下。setsockopt和select。setsockopt允许直接设置套接字的发送和接收超时时间,而select提供了一种多路复用的机制,使得在等待多个套接字就绪时能够设置超时。

2023-11-28 07:00:00 647

原创 Linux socket编程(6):IO复用之select原理及例子

在之前的网络编程中,我们遇到了一个问题:客户端需要一边监听来自stdin的键盘输入,一边监听来自服务端的消息服务端要一边获取来自客户端的消息,一边accept新的设备连接也就是我们希望在一个或多个I/O条件准备就绪时,能够得到通知。在前面的文章中,我们使用Linux中的fork。但在Linux中还有一个I/O多路复用的概念,它由select和poll函数实现,这篇文章就来介绍一下多路复用的概念。

2023-11-27 07:00:00 458 2

原创 GPIO模式详解:推挽/开漏/浮空/上拉/下拉/施密特(迟滞)输入

一个GPIO引脚主要有两个缓冲区,即输入和输出。输入和输出由使能引脚ENABLE控制:每个输入/输出缓冲区都有一个PMOS和NMOS晶体管以及一个非门。

2023-11-23 07:00:00 2879 1

原创 Linux socket编程(5):三次握手和四次挥手分析和SIGPIPE信号的处理

在我之前写的中,通过抓包分析了TCP传输的三次握手和四次挥手的过程。在这一节中,将分析在Linux中的三次握手和四次挥手的状态和过程,另外还有一个在我们编程过程中值得注意的SIGPIPE信号的处理。

2023-11-22 07:00:00 621

原创 Wireshark抓包:理解TCP三次握手和四次挥手过程

TCP是一种面向连接、端到端可靠的协议,它被设计用于在互联网上传输数据和确保成功传递数据和消息。本节来介绍一下TCP中的三次握手和四次挥手。

2023-11-21 07:00:00 1102 2

原创 Linux socket编程(4):服务端fork之僵尸进程的处理

僵尸进程()是操作系统中的一种特殊进程状态,它通常出现在一个子进程终止,但其父进程尚未能够处理该子进程的终止状态。特点僵尸进程不执行任何代码,它们仅仅是一个进程描述符和一些状态信息,如退出状态码,占用少量系统资源。如果大量的僵尸进程积累,可能会导致系统资源耗尽。解决方法当子进程终止时,父进程可以使用wait()或waitpid()等系统调用来等待子进程的退出状态信息,从而释放子进程的资源,同时告知操作系统可以回收子进程的进程表项另一种方法是使用信号处理程序,在父进程中注册SIGCHLD。

2023-11-20 07:00:00 391

原创 Linux socket编程(3):利用fork实现服务端与多个客户端建立连接

上一节,我们实现了一个,在这个例子中,客户端连接上服务端后发送一个字符串,而服务端接收到字符串并打印出来后就关闭所有套接字并退出了。上一节的代码较为简单,在实际的应用中,客户端和服务端需要像一个聊天室一样能够收发信息,但这样就引出了一些问题:1、服务端程序需要既能accept新的客户端请求,又能实时获与已经建立连接的客户端发来的消息2、客户端程序需要既能从stdin获取用户输入,又能实时获取从服务端发来的消息下面就来解决这两个问题。

2023-11-15 07:00:00 633 1

原创 Linux socket编程(2):socket函数介绍及C/S模型代码实现

上一节简单介绍了一下的概念,算是对socket有一个入门的了解。这一节就实现一个客户端-服务端的代码,从这个例子中来学习socket函数的使用。

2023-11-14 07:00:00 482

原创 Linux socket编程(1):套接字、字节序和地址结构体

计算机网络由多个层组成,每个网络层提供关于该层数据的不同限制。而套接字的本意是提供一种进程间通信的方法,使得在相同或不同主机上的进程能够以相同的规范进行双向的信息传送。如下图所示,套接字接口提供了对网络下层(1-4层)的统一API,并能套接字应用程序中实现上层(5-7层和应用格式)功能。套接字是一种通用的编程接口,可以用于与不同类型的网络协议进行交互,不仅仅限于IP协议,还有UDP、ICMP等。在实际应用中,套接字应用程序通常会依赖于IP协议来实现网络通信。在传输层,套接字支持两种特定的协议:TCP(

2023-11-13 07:00:00 422

原创 C++实战学习:输出类的抽象和实现详解

本文介绍了elftosb工程中的输出类LogLogger和Logger类:输出类中的底层,最终将调用这个类方法进行输出,它封装了一些格式化输出的函数,同时留出一个虚函数接口_log,即我们的输出方式有很多种,如标准输出、串口输出和网络输出等。类:继承Logger类,实现具体的_log输出方法,这里实现的是标准输出Log类:给用户实际调用输出的类,其中声明了一个变量,用户可以使用类方法setLogger进行设置这个Logger,然后调用Log类中的log输出函数,实际上就是调用s_logger的类方法。

2023-11-09 07:00:00 220 1

原创 C++总结(9):Lambda表达式详解

C++ Lambda表达式允许我们定义匿名函数对象,它既可以内联使用,也可以作为参数传递。它以更方便简洁的方式创建匿名函数,因为我们不需要在单独的类或结构中重载()运算符。一个基本的Lambda表达式可以是这样的:其中:这里关键字来自动推断lambda表达式的返回类型。上面的代码等价于:所以就像普通函数一样,我们可以直接调用。例:基本Lambda函数创建了lambda函数并将其分配给一个名为的变量,然后使用变量和运算符调用lambda函数。例:带参数的Lambda函数上面的Lambda函数等于:例

2023-11-08 07:00:00 397

原创 C++总结(8):STL容器适配器之stack、queue、priority_queue详解

容器适配器是C++标准库中的一种数据结构,用于提供特定接口以便于将不同类型的容器以一种统一的方式使用。它们是标准库的一部分,提供了一种通用的方式来操作底层容器,无论是栈(stack)、队列(queue)、还是优先队列(

2023-11-07 07:00:00 261

原创 C++总结(7):STL无序容器之unordered_set、unordered_map、unordered_multiset、unordered_multimap详解

前两节介绍了STL中的和,本节来介绍一下无序容器。无序容器与关联容器类似,但是关联容器是顺序排序的,而无序容器实现了未排序(哈希)的数据结构。

2023-11-06 07:00:00 7441

原创 C++总结(6):STL关联容器之set、map、multiset、multimap详解

(Sequence Containers)、关联容器(Associative Containers)、无序容器(Unordered Containers)和容器适配器(Container Adapters)。上一篇文章介绍了顺序容器,这篇文章就来详细一下关联容器。关联容器实现了可以快速搜索的排序数据结构,具有O(log n)的复杂度。它包括setmapmultiset和multimap。

2023-11-03 07:00:00 241

原创 C++总结(5):STL顺序容器之array、vector、deque、forward_list、list详解

容器是一个持有其他对象元素集合的容器对象,以类模板的形式实现,可以灵活地支持不同类型的元素。容器负责管理其元素的存储空间,并提供成员函数来直接或通过迭代器(类似于指针的引用对象)访问它们。C++中有多种种类的容器,包括:顺序容器()、关联容器()、无序容器()和容器适配器(这篇文章先来详细介绍一下顺序容器的用法。顺序容器实现了可以按顺序访问的数据结构,它包括array(静态连续数组)、vector(动态连续数组)、deque(双端队列)、(单向链表)和list(双向链表)。

2023-11-01 07:00:00 905

ARM Architecture Reference Manual ARMv7-A and ARMv7-R edition

ARM Architecture Reference Manual ARMv7-A and ARMv7-R edition

2024-01-12

ARM Cortex-A Series Programmer's Guide

ARM Cortex-A系列编程指南

2024-01-12

Cortex-A7 Technical Reference Manual

Cortex-A7 Technical Reference Manual

2023-12-10

ARM11、ARMv7和ARMv8/v9架构参考手册

此压缩包包括ARM11、ARMv7和ARMv8/v9的architecture reference manual.

2023-12-10

ARM GIC通用中断控制器规范手册

ARM GIC通用中断控制器规范手册

2023-12-10

Avoiding Read While Write Errors When In-Software Flash

Avoiding Read While Write Errors When In-Software Flash

2023-11-27

SDIO Simplified Specification Version 3.00

SDIO Simplified Specification Version 3.00

2023-10-22

SD Specifications Part 1 Physical Layer Specification

SD物理层协议规范

2023-10-18

IAR开发指南手册EWARM-DevelopmentGuide

EWARM_DevelopmentGuide.ENU

2023-09-05

AES加解密算法(Rijndael) C++代码

AES-128、AES-192、AES-256的加解密C++实现代码,加密方式包含CBC、ECB和CFB1。压缩包为Codeblocks工程。

2023-09-03

RT1176 DAP&JLINK SDRAM script.rar

RT1170的DAP和JLINK初始化SDRAM脚本

2023-05-29

cortex-m4f-lazy-stacking-and-context-switching.pdf

cortex-m4f-lazy-stacking-and-context-switching.pdf

2022-12-02

ARMv8-M Architecture Reference Manual.pdf

ARMv8-M Architecture Reference Manual.pdf

2022-12-02

ARMv7 Architecture Reference Manual.pdf

ARMv7 Architecture Reference Manual.pdf

2022-12-02

Bluetooth 16-bit UUID Numbers Document

Bluetooth 16-bit UUID Numbers Document

2022-11-24

Supplement to the Bluetooth Core Specification

Supplement to the Bluetooth Core Specification

2022-11-24

QT右键菜单栏的实现源码

QT右键菜单栏实现

2022-11-18

蓝牙规范手册Core-V5.0

蓝牙规范手册Core-V5.0

2022-11-18

QT实现背景图片上下拼接滚动

背景图片无限滚动效果

2022-05-07

STM32_PMSM_FOC_SDK_V3.2 全部课件资料

part1~11,压缩包是11个PDF,蒋建国培训视频对应的资料

2021-10-18

华为技术有限公司c语言编程规范 PDF

华为技术有限公司c语言编程规范 PDF

2021-03-06

gnu-ld链接脚本浅析.pdf

gnu-ld链接脚本浅析.pdf

2021-03-03

lena_gray_512.tif

图像处理最为经典的lena图片,tiff格式。

2020-09-28

STM32 ST-LINK Utility v4.5.0.rar

STM32 ST-LINK Utility 最新版v4.5.0 stlink setup stlink升级固件

2020-08-31

STM32 PWM的OCToggle模式输出频率和占空比动态调整的波形

STM32官方例程中,关于TIM的例程应该是最多的,其中提供了OCToggle模式例程,但是我看网上基本没有人拿这个应用到频率和占空比可调的程序中,而是采用每次重新设置一次定时器的方式改变,很明显这样效率的程序是不可能应用在实际项目中的。我这个文件就是一个简单实现的一个.c文件。TIM_Period必须设置成65535,因为是动态改变,且C语言加法是循环的,也就是最大值+1=最小值。到了边界的时候,65530+6=1。

2020-02-24

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

TA关注的人

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