自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 手把手教你在rk3568上进行linux系统移植

通过这次系统移植操作,对linux系统的启动过程和启动方式更加清晰了,也解决了驱动模块加载不正常的问题(之前zynq的移植以太网驱动是不正常工作的,估计也是这个原因)。但是uboot的制作方式正确性还没有验证,后续如果有机会会去验证一下(这里使用官方烧录工具失败)。不过对uboot的具体启动过程,内核的具体启动过程进行了什么操作还不得而知,后面可能也会看一些启动源码,进一步理解一下。

2025-05-12 11:45:51 2530 3

原创 手搓实时操作系统实践:从零构建属于自己的系统世界

目前只是实现了系统一些基础的功能,还有很多功能没有实现。当然实现的功能也存在缺陷,后续也会不断地改进各模块地性能,以及完善整个系统的功能。写这个项目也是觉得从零搭建一个系统很大程度上加深了我对系统的理解,也希望这些内容可以帮助到正在学嵌入式的你。最后如果有任何问题欢迎指出。

2025-04-24 20:48:33 1201

原创 linux驱动框架——i2c子系统驱动MPU6050

这篇文章会以驱动MPU6050为例讲解具体如何操作编译制作出来的驱动模型。

2025-04-23 10:31:00 1038

原创 linux驱动框架——i2c驱动模块的probe过程

匹配上了后,就执行相应的probe函数,并把当前的设备节点dev当作参数传入。(会。

2025-04-21 21:22:30 1416

原创 Linux驱动框架——字符设备驱动节点的创建

具体实现如下。这样在用户空间中进行系统调用时,比如 read\write\ioctl等,就会调用和cdev绑定的具体实现的文件操作函数。

2025-04-21 10:52:24 1014

原创 Linux内核机制——内存管理

本文介绍了Linux系统中一个非常重要的机制——内存管理。以及MMU如何实现虚拟地址到物理地址的转换;虚拟地址申请方式和物理地址缺页处理方式——伙伴系统。另外还介绍了内核态独特的kmalloc和vmalloc以及面向内核对象的基于Slab分配器的内存分配方式。

2025-04-18 15:08:32 1615

原创 C++面试考点:类(class)

(hiding),

2025-04-16 21:42:45 866

原创 ZYNQ xc7z100ffg900型号SoC PS端Linux系统移植详细教程

由于项目需要被临时委派进行ZYNQ开发板ARM核的Linux系统移植,在此之前没有接触过任何ZYNQ相关的任何内容,可以说是从0开始给ZYNQ移植系统。由于该ZYNQ开发板不是商业开发板,资料不全,再加上网上对于Zynq的Linux系统移植教程不够详细(在2024.2版本下),所以只能自己一点点摸索着做,好在花了4天时间也是成功完成移植,进入了Linux系统(看完这篇文章,你就会ZYNQ上的Linux系统移植了。

2025-03-24 17:34:54 851

原创 嵌入式c语言学习记录

FILE * 指针变量标识符;FILE为大写,需要包含<stdio.h>;FILE是系统使用typedef定义出来的有关文件信息的一种结构体类型,结构中含有文件名、文件状态和文件当前位置等信息。

2024-12-12 11:32:31 595

原创 RT-Thread启动过程 :从汇编开始的启动流程

这个系列参考了《嵌入式实时操作系统RT-Thread设计与实现》,会详细介绍RT-Thread的启动流程,即是如何从零开始在开发板上运行起一个RTOS内核的。本文将会以开发板为例展开进行详细介绍。这五大部分。在这一小节中,本文将讲述通过wsl烧录RT-Thread的基本流程。并在最后讲解startup_ch32v30x.S文件的执行过程。

2024-12-12 11:31:56 1883

原创 7、抢占式调度

在这一章中有一个需要注意的地方,即由于任务切换是由系统决定的,因此对于上一个任务的上下文保存过程放在了trap_vector中,并且switch_to函数的返回方式变为mret(中断处理要求使用mret)。即调用mret时,mstatus中的MIE位会被MPIE位替换。此时需注意start.S启动代码对于mstatus寄存器的赋值,把MPIE位赋值为1即可,这样调用mret后自动开启全局中断。

2024-12-07 11:04:11 341

原创 6、RISC-V架构下的定时器中断

本章涉及到CLINT寄存器。如何通过该寄存器的值控制定时器实现中断。

2024-12-07 11:03:40 724

原创 5、RISC-V架构下的PLIC控制器及外部中断处理

这一章的中断处理,讲的是处理。在中断处理中涉及到外设PLIC外部中断控制器。以及用于开启全局中断的CSR状态寄存器mstatus和mie。

2024-12-06 10:08:34 1180

原创 4、RISC-V架构下的trap处理

***原第4章为多任务,无过多新内容***/trap处理中涉及到CSR寄存器mtvec、mepc、mcause。

2024-12-06 10:08:19 773

原创 3、上下文切换

在这一章中了解到了程序上下文切换的详细过程。即保存通用寄存器、加载下一个线程的上下文、切换到下一个线程。

2024-12-05 14:02:01 493

原创 2、内存管理

首先定义程序将使用的内存区域。每个区域都可以指定起始地址、大小和访问权限。通常会定义FLASH和RAM两个区域。其中ENTRY( _start )即在指示程序入口地址。

2024-12-05 14:01:16 609

原创 1、操控UART寄存器实现输出功能

在这一章里,重点需要了解如何通过寄存器操控GPIO、UART,使得MCU通过UART总线输出字符,实现打印功能。

2024-12-04 16:26:17 1338

原创 0、从零开发一个简易RTOS系统

跟着[完结] 循序渐进,学习开发一个RISC-V上的操作系统 - 汪辰 - 2021春视频走完了开发一个简易操作系统的全流程。从中学到了一个简易操作系统启动的顺序、如何编写汇编启动文件、ld链接文件的作用以及如何指导程序在mcu的ram中的布局,以及如何使用通用寄存器、外设寄存器、状态控制寄存器等。 在第 0 章 Bootstrap 中,我们需要深入理解 的工作原理,确保能够准确解析并理解 文件中每一行指令的具体作用。同时,还需掌握开发板 MCU 如何定位程序的入口地址的机制,以便更好地理

2024-12-04 11:29:44 1654

原创 Linux设备驱动中的异步通知与异步I/O学习s

的意思是:一旦设备就绪,则主动通知应用程序,这样应用程序根本就不需要查询设备状态,这一点非常类似于硬件上”中断“的概念,比较准确的称谓是”信号驱动的异步I/O“。信号是在软件层次上对中断机制的一种模拟,在原理上,一个进程收到一个信号与处理器收到一个中断请求可以说是一样的。信号是异步的,一个进程不必通过任何操作来等待信号的到达,事实上,进程也不知道信号到底什么时候到达。

2024-09-26 15:24:37 800

原创 Linux设备驱动中的阻塞与非阻塞I/O学习

阻塞和非阻塞I/O是访问设备的两种不同模式,驱动程序可以灵活地支持用户空间对设备的这两种访问方式。阻塞操作是指在执行设备操作时若不能获得资源则挂起进程,直到满足可操作的条件后再进行操作。被挂起的进程进入休眠状态,被从调度器的运行队列移走,直到等待的条件被满足。而非阻塞操作的进程在不能进行设备操作时并不挂起,它或者放弃,或者不停的查询,直至可以进行操作为止。

2024-09-25 14:37:49 838

原创 Linux中的并发控制学习

名为my_mutex的互斥体并初始化它。

2024-09-23 11:48:18 907

原创 DMA学习

DMA是一种无需CPU的参与就可以让外设与系统内存之间进行双向数据传输的硬件机制。使用DMA可以使系统CPU从实际的I/O数据传输过程中摆脱出来,从而大大提高系统的吞吐率。DMA方式的数据传输由DMA控制器(DMAC)控制,在传输期间,CPU可以并发执行其他任务。当DMA结束后,DMAC通过中断通知CPU数据传输已经结束,然后由CPU执行相应的中断服务程序后进行处理。

2024-09-19 15:08:48 1258

原创 PCI总线学习(二):PCI总线驱动

Linux设备驱动开发》中讲到,PCI只是一种总线,具体的PCI设备可以是字符设备、网络设备、USB主机控制器等,因此一个通过PCI总线与系统连接的设备的驱动至少包含两部分:PCI设备驱动和设备本身的驱动。对于这句话我的理解是,PCI驱动指实现对PCI设备的探测、移除、挂起\恢复等功能的代码部分。而设备本身的驱动指的是file_operations结构体实现的open、release、read、write等功能的代码部分。其中pci_driver的结构如下所示。其中的probe函数。

2024-09-11 16:14:56 1938

原创 PCI总线学习(一):PCI总线结构

PCI总线结构是一种树形、层次式的体系结构。。PCI桥在PCI总线结构中占据着重要的地位,它将父总线与子总线连接在一起。:用于连接CPU与PCI根总线,第1个根总线的编号为0。它是一个特殊的PCI桥设备,将树顶端的CPU与根PCI总线连接起来。:用于连接PCI主总线与次总线。PCI桥所处的PCI总线称为“主总线”(即次总线的父总线),桥设备所连接的PCI总线称为“次总线”(即主总线的子总线)。:用于连接旧的ISA总线。下图展示了CPU、PCI总线和PCI设备的连接关系,。

2024-09-11 14:37:06 1940

原创 linux开发板引脚中断编程

是指CPU在执行程序的过程中,出现了某种突发事件,使得CPU不得不暂停当前正在处理的事务,转而去处理突发事务,处理完毕后CPU又返回原程序被中断的位置继续执行。中断根据分类,又可以分为内部中断和外部中断、可屏蔽中断和不可屏蔽中断、向量中断和非向量中断。:中断源来自CPU内部(软件中断指令、溢出、除法错误等)。例如操作系统从用户态切换到内核态需借助CPU内部的软件中断。:中断源来自CPU外部,由外设提出请求。:可以通过屏蔽字被屏蔽,屏蔽后,该中断不再得到响应。:不能被屏蔽。

2024-09-05 14:10:57 1273

原创 记一次wsl启动不了的问题(已解决)

在网上搜了许久,重启电脑也没有用。后来看到说可能是存储空间不足,再去看了下,发现D盘只剩25MB了,清了下空间wsl就可以正常启动了。wsl本来用着好好的,突然就崩了。

2024-09-04 11:32:39 1390

原创 USB驱动(1)——libusb获取鼠标输入数据及代码解读

学习usb驱动的难度比i2c、spi等又上升了一个台阶。因为它包含了太多内容。需要设置设备、配置、接口、端点四类描述符(),它们之间的关系可以简单概括为下图。每个设备有不同的工作模式,不同的工作模式就可以理解为对应不同的配置。每种工作配置下,又可以又很多种usb接口设备(鼠标、键盘等等)同时工作。每个接口通过其下面的不同端点与主设备通信。端点又分为输入端点、输出端点、控制端点等等。每类结构体下又有很多字段需要配置,以上还仅是usb驱动的一部分内容。USB驱动内容多到难以入手,看别人的驱动源码也不知所云。

2024-09-02 11:40:07 4037

原创 UART协议详解(工作原理+上板测试)

(Universal Asynchronous Receiver Transmitter)也称作通用异步收发器,是一种广泛应用于嵌入式领域的串行、异步、全双工通信协议。UART的应用场景非常广泛,比如上位机和下位机之间的通信、外接各种模块,比如GPS或者蓝牙模块等等。UART作为串行通信,利用一条传输线将数据按bit进行顺序传送,特点是通信线路简单,利用简单的线缆就可以实现通信,降低成本,适用于远距离通信,但传输速度较慢的场合。

2024-08-23 17:36:55 1501

原创 SPI协议详解(协议+上板实测)

SPI()又名串行外围设备接口。是一种高速的、全双工、同步的通信总线。SPI总线主要应用于EEPROM,FLASH,实时时钟,AD转换器等。在芯片中只占用四根管脚,节约了芯片管脚数目也为PCB布局节省了空间。正是出于这种简单易用的特性,现在越来越多芯片上都集成了SPI技术。

2024-08-16 14:43:41 2372

原创 I2c协议详解(时序+上板实测)

I2c是一种串行通信总线,支持多主从架构。其使用两根信号线进行通信:一根时钟线SCL,一根数据线SDA。I2c将SCL处于时SDA拉低的动作作为开始信号,SCL处于时SDA拉高的动作作为结束信号;传输数据时,SDA在SCL低电平时改变数据,在SCL高电平时保持数据,每个SCL脉冲的高电平传递一位数据。要求两根信号线都使用的配置,以实现所有节点SDA、SCL信号线上的线与逻辑关系。

2024-08-15 11:37:39 5444

原创 DHT11读写时序详解(时序+上板实测)

DHT11有两种,一种三线制,一种四线制。其中都包括1个VDD,1个GND,和1个DATA串行数据引脚。不同的是四线制其中一个引脚悬空。

2024-08-13 10:58:27 2518

原创 嵌入式c语言学习记录

定义:链表是一种物理存储上非连续,数据元素的逻辑顺序通过链表中的指针链接次序,实现的一种线性存储结构。特点:链表由一系列节点(链表中的每一个元素称为节点)组成,节点在运行时动态生成,每个节点包括两个部分:一个是存储数据元素的数据域。另一个是存储下一个节点地址的指针域。链表的构成:链表由一个个节点构成,每个节点一般采用结构体的形式组织,例如:int num;}STU;链表节点分为两个域,数据域和指针域。

2024-01-12 15:10:18 289

原创 嵌入式c语言结构体,共同体,枚举学习记录

结构体变量的定义和初始化(1)在定义结构体变量之前首先得有结构体类型,然后定义变量(2)在定义结构体变量的时候,可以顺便给结构体变量赋初值,及结构体的初始化(3)结构体变量初始化的时候,各个成员顺序初始化。

2024-01-10 10:09:17 610

原创 嵌入式c语言字符串处理函数学习记录

头文件:#include<string.h> 函数定义:size_t函数功能:测字符指针s指向的字符串中字符的个数,不包括‘\0’返回值:字符串中字符的个数。

2024-01-05 16:32:37 533 1

原创 嵌入式c语言内存分配,malloc、calloc、realloc学习记录

数组的长度是预先定义好的,在整个程序中,但是在实际的编程中,往往会发生这种情况,即,而无法预定。为了解决上述问题,C语言提供了一些内存管理函数,这些内存管理函数可以按需内存空间,也可把不再使用的空间回收再次使用。动态分配内存就是在堆区开辟空间。

2024-01-03 10:09:38 1167

原创 嵌入式c语言指针与函数学习记录

在运行程序的时候,操作系统会将虚拟内存进行分区:1、堆:在动态申请内存的时候,在堆里开辟内存。3、静态全局区:1)、未初始化的静态全局区:静态变量(定义的时候,前面加static修饰),或全局变量,没有初始化的,存在此区。2)、初始化的静态全局区:全局变量、静态变量、赋过初值的,存放在此区。5、文字常量区:存放常量的。当一个进程被创建的时候,或者程序运行的时候都会分配虚拟内存,虚拟内存和物理内存之间存在映射关系。常见的外存设备:硬盘,flash,rom,u盘,光盘,磁带。常见的内存设备:ram,DDR。

2023-12-27 14:28:25 889

原创 嵌入式c语言编译,include,define学习记录

gcc -E hello.c -o hello.i 1、预处理gcc -S hello.i -o hello.s 2、编译gcc -c hello.s -o hello.o 3、汇编gcc hello.o -o hello_elf 4、链接预编译:将.c中的头文件展开、宏展开,生成的文件是.i文件。编译:将预处理之后的.i文件生成.s汇编文件。汇编:将.s汇编文件生成.o目标文件。链接:将.o文件链接成目标文件。

2023-12-27 11:31:20 952 1

原创 《分布式系统》期末复习总结

第二章:1.分布式系统的物理模型。2.分布式系统体系结构模型。2.1、C/S,P2P两种不同结构2.2、分层模型、层次化模型3.交互、故障、安全三种基础模型4.同步、异步两种不同的分布式系统。

2023-11-17 14:24:11 1395

原创 嵌入式C语言内存分区,不同变量、函数介绍学习记录

物理内存、虚拟内存。:实实在在的存储设备。:操作系统虚拟出来的内存。操作系统会在物理内存和虚拟内存之间建立一个映射关系。在32位系统下,每个进程的寻址范围是 4G,0x00000000 ~ 0xffffffff在32位系统中,,3G的用户空间和1G的内核空间,其中用户空间是当前进程所私有的,内核空间是一个系统所有的进程所公有的。在运行程序时,操作系统会将虚拟内存中的用户空间(3G)进行分区:(1)堆:在动态申请内存的时候,在堆里开辟内存。(2)栈:主要存放局部变量。

2023-11-13 11:48:32 152

原创 嵌入式C语言各关键字、类型转换、运算符优先级知识点学习记录

用于定义变量或者类型:char、short、int、long、float、double、struct、union、enum、signed、unsigned、void。字符型,用char定义的变量是字符型变量,。短整型,使用short定义的变量是短整型变量,。整型,用int定义的变量是整形变量,。长整型,用long定义的变量是长整型的,单浮点型(实数),用float定义的变量是单浮点型的实数,。双浮点型(实数),用double定义的变量是双浮点类型的实数,

2023-11-06 21:39:23 289

空空如也

空空如也

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

TA关注的人

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