- 博客(64)
- 收藏
- 关注
原创 u-boot、kernel和rootfs移植
使用命令setenv修改的是DRAM中的环境变量值,修改以后要使用saveenv命令将修改后的环境变量保存到flash中,否则uboot下一次重启会继续使用以前的环境变量值。不管用那种方法,只要能将 Linux镜像和设备树文件存到 DRAM中就行,然后使用 bootz命令来启动, bootz命令用于启动 zImage镜像文件.编译出u-boot.bin,增加头部生成最终的uboot镜像文件u-boot.imx。boot会读取环境变量bootcmd来启动Linux系统。有空格的环境变量要用单引号括起来。
2025-06-18 16:38:16
559
原创 I.MX6U的定时器
EPIT,Enhanced Periodic Interrupt Timer,增强的周期中断定时器,用于完成周期性的定时中断。EPIT的三个重要寄存器:计数寄存器(EPIT_CNR)、加载寄存器 (EPIT_LR)和比较寄存器 (EPIT_CMPR)EPIT定时器有两种工作模式: set-and-forget和 free-running。
2025-06-17 19:08:07
243
原创 Cortex-A7中断系统
中断服务函数的入口地址 称为 中断向量。中断向量表 是 一系列中断服务函数入口地址组成的表,中断向量表也是在代码的最前面。中断向量表是0x0000_0000开始存放的,通过中断向量表偏移就可以将中断向量表存放到任意地址处。
2025-06-16 19:29:01
793
原创 嵌入式Linux裸机开发
FTP,即 File Transfer Protocol,文件传输协议。在开发过程中,Ubuntu作为FTP服务器,Windows作为FTP客户端,使用FileZilla直接可以实现Ubuntu和Windows文件互传。NFS,即 Network File System,网络文件系统。在进行Linux驱动开发的时候需要NFS启动,通过网络将Ubuntu中的文件直接作为启动文件。SSH,即Secure Shell,安全Shell。用于在Windows下使用终端软件安全远程登录Ubuntu。
2025-06-16 15:42:30
364
原创 Linux 用户管理
在Linux系统中,账户、密码被存放在两个文件中:/etc/passwd和/etc/shadow。每个进程都以特定的用户运行,每个文件都属于特定的用户。用户相当于微信好友,usermod / gpasswd 修改存在账号。: 作为分隔符,6个 : 分7段。man 5 查看文件格式和规范。groupadd 添加组。groupdel 删除组。useradd 添加用户。userdel 删除用户。
2025-06-03 15:28:43
330
原创 C语言内存管理
当C语言代码中定义一个局部变量,编译器就会在栈中给该变量分配一段空间。当局部变量消亡时,对应栈会自动释放空间。堆内存是操作系统划归给堆管理器来管理的,可以用API(malloc和free)来使用堆内存。,所以==定义局部变量时不能定义太大!==比如,int a[10000];堆内存申请时必须给定大小,如果要变只能通过realloc()函数更改。栈是一种数据结构,是一种内存管理方式,C语言用栈来保存。堆也是一种内存管理方式,特点是随时申请、释放且。,相当于一端堵死的管子,只能从一个口出入。
2025-04-19 14:22:57
321
原创 Linux并发与竞争
并发指的是在同一段时间内,多个任务看似同时运行的现象。竞争是指多个线程或进程争夺相同资源时发生的冲突情况。竟态条件问题:竞态条件是指多个线程或进程在的情况下访问和修改共享资源时,操作的执行顺序影响到最终结果,从而导致不确定性和错误的情况。死锁问题死锁是指两个或多个线程或进程在,导致所有参与者都无法继续执行的情况。饥饿问题饥饿是指一个线程或进程,从而无法继续执行的情况。(主要原因是系统支持抢占)
2025-04-15 10:14:52
313
原创 电路中有符号数的表示
电路中的无符号数用信号线的高低电平来表示,1表示高电平,0表示低电平。因此,用3根信号线表示无符号数6,以RTL语言表述为3’b110。
2025-04-15 09:36:41
745
原创 Linux LED驱动(gpio子系统)
gpio子系统是linux内核当中用于管理GPIO资源的一套系统,它提供了很多GPIO相关的API接口,驱动程序中使用GPIO之前需要向gpio子系统申请。gpio子系统的主要目的就是方便驱动开发者使用gpio,驱动开发者在设备树中添加gpio相关信息,然后就可以在驱动程序中使用gpio子系统提供的API函数来操作GPIO。Linux内核向驱动开发者屏蔽掉了GPIO的设置过程,极大的方便了驱动开发者使用GPIO。使用gpio子系统时,需要更改设备树。
2025-04-14 19:31:12
1404
原创 Linux LED驱动(设备树)
之前的LED驱动直接在驱动文件中定义有关寄存器物理地址,然后使用io_remap函数进行内存映射,得到对应的虚拟地址,最后操作寄存器对应的虚拟地址完成对GPIO的初始化。但也可以先在设备树文件中创建相应的设备节点,再使用设备树向Linux内核传递相关的寄存器物理地址,再使用OF函数从设备树中获取所需的属性值,完成驱动程序的编写。
2025-04-14 19:06:34
479
原创 Linux LED驱动(非设备树)
Linux驱动加载成功以后会在devices目录(\dev)下生成一个文件,应用程序通过对这个文件进行相应的操作即可实现对硬件的操作。对 32 位操作系统而言,它的寻址空间(虚拟地址空间)为 4G(2的32次方)。操作系统将虚拟地址空间划分为两部分,一部分为内核空间,另一部分为用户空间。针对 Linux 操作系统而言,最高的 1G 字节(从虚拟地址 0xC0000000 到 0xFFFFFFFF)由内核使用,称为内核空间;
2025-04-14 16:40:18
857
原创 Linux图形化界面
桌面对于Linux系统来说,只是一个应用程序,所以是可以移植的。Linaro公司针对于半导体厂商推出的芯片,开发了ARM开发工具、Linux内核以及Linux发行版(包括Android及Ubuntu)。所以无需自己移植,可以直接使用该公司提供的Debian和Ubuntu的根文件系统。例如,
2025-04-10 17:53:59
385
原创 使用移植后的uboot、内核、设备树编译Linux系统
由于Xilinx官方提供的uboot、内核和开发板不完全匹配,所以需要用到开发板的外设时,会缺少相应的驱动,所以需要使用开发板商适配好的uboot、内核来编译Linux系统。Vivado硬件平台:正点原子Phosphor_7020内核:正点原子alientek-linux-4.14.0-xlnx-v2018.3.tar.gzuboot:正点原子alientek-uboot-2018.01-xlnx-v2018.3.tar.gz。
2025-04-10 16:10:42
265
原创 Petalinux最简开发
Petalinux工具是Xilinx推出的嵌入式Linux开发套件,包括了u-boot、Linux Kernel、device-tree、rootfs等源码和库,以及Yocto recipes,可以很方便的生成、配置、编译及自定义Linux系统。
2025-04-10 15:10:17
577
原创 Makefile快速编译
预处理,包括展开宏定义,并将包含的头文件插入到源代码中;链接,就是将多个目标文件,还有库文件链接在一起,最终生成可执行文件。.a archive,静态库文件。静态库是包含一组目标文件(.o ),可以在编译时将其直接链接到目标程序中,成为程序的一部分。.so shared object,共享对象文件,也被称为动态链接库。把a.c编译成a.o,并把依赖(include目录)写入文件a.d。.i intermediate,中间文件,预处理后的文件。[email protected]是一个以.开头的隐藏文件。
2025-04-08 10:12:32
392
原创 Linux系统网络编程
第一步:规定发送和接收方法规定连接建立后由客户端主动向服务器发出1个请求数据包,让服务器收到数据包后回复客户端一个回应数据包,这就是一个通信回合整个连接的通信就是由N多个回合组成的。第二步:定义数据包格式客户端#define SERADDR "192.168.190.174" ///ifconfig看到的89101001///注册学生信息1002///检验学生信息1003///获取学生信息30///回复OK31///反复错误int age;int cmd;
2025-04-05 16:18:04
456
原创 Linux系统线程
CPU时分复用,单核心CPU可以实现宏观上的并行,以满足多任务需求。但是,进程间切换开销大,进程间通信麻烦而且效率低。解决方案就是,线程技术保留了进程技术实现多任务的特性。线程的改进就是在线程间切换和线程间通信上提升了效率,并且多线程在多核心CPU上面更有优势。
2025-04-05 15:43:36
406
原创 Linux系统高级IO
异步IO就是操作系统用软件实现的一套中断响应系统。异步IO的工作方法是:我们当前进程注册一个异步IO事件(使用signal注册一个信号SIGIO的处理函数),然后当前进程可以正常处理自己的事情,当异步事件发生后当前进程会收到一个SIGIO信号从而执行绑定的处理函数去处理这个异步事件。以下方式只能先读鼠标再读键盘!因为程序被鼠标读阻塞住了!解决方法是并发式IO!使用mmap()函数将 LCD 显存的物理地址映射到进程的虚拟地址空间。用select函数实现同时读取键盘鼠标。程序中同时读取键盘和鼠标。
2025-04-05 14:58:54
238
原创 Linux系统进程
操作系统下的应用程序在main执行前也需要先执行段引导代码才能去执行main,但写应用程序时不用考虑引导代码的问题,编译连接时(准确说是链接时)由链接器将编译器中事先准备好的引导代码给链接进去,和应用程序一起构成最终的可执行程序。加载器是操作系统中的程序,当执行一个程序时(e.g., ./a.out,代码中用exec族函数来运行)加载器负责将这个程序加载到内存中去执行这个程序。
2025-04-04 20:02:20
1281
原创 Linux系统调试
proc目录下的文件大小为0,并不是一个真实的文件。proc文件系统给开发者一种调试内核的方法:通过实时的观察/proc/xxx文件,来查看内核中特定数据结构的值。在添加一个新功能的前后来对比,就可以知道这个新功能产生的影响对还是不对。/proc/cmdline: 保存uboot的环境变量。/proc/devices: Linux驱动。复杂程序:printf打印信息调试。框架体系:日志记录信息调试。
2025-04-04 09:57:30
126
原创 Linux系统时间
jiffies是linux内核中的一个全局变量,用来记录以内核的节拍时间为单位时间长度的一个数值。jiffies变量开机时有一个基准值,然后内核每过一个节拍时间jiffies就会加1。一个时间节拍的时间取决于操作系统的配置,Linux系统一般是10ms或者1ms。这个时间其实就是调度时间,在内核中用HZ来记录和表示。如果HZ定义成1000难么时钟节拍就是1/HZ,也就是1ms。
2025-04-04 09:31:30
264
原创 Linux文件属性
readdir函数调用一次就会返回一个struct dirent类型的指针,这个指针指向一个结构体变量,这个结构体变量里面记录了一。Linux获取文件属性的API也是调用stat命令实现的。个目录项(所谓目录项就是目录中的一个子文件)。
2025-04-03 19:50:44
352
原创 FPGA 以太网通信(三)
UDP(User Datagram Protocol Protocol),即用户数据报协议,是一种面向无连接的传输层协议。UDP和TCP协议都属于传输层协议,在网络传输中同一 IP 服务器需要提供各种不同的服务,为了区别不同的服务,一般使用不同的端口号来区分。TCP协议常用在对数据文件完整性较高的一些场景中,如文件传输等;UDP 常用于对通讯速度有较高要求或者传输数据较少时,比如对速度要求较高的视频直播。
2025-03-21 18:16:10
588
原创 FPGA 以太网通信(二)
ARP(Address Resolution Protocol Protocol),即地址解析协议,是根据IP地址获取MAC地址的一种TCP/IP 协议。
2025-03-20 16:16:26
930
原创 FPGA 以太网通信(一)
FPGA可以通过SMI接口 配置/读取 以太网PHY芯片的寄存器,从而配置PHY芯片的工作模式,获取PHY芯片的状态信息。
2025-03-20 10:41:07
469
原创 Zynq PS端外设(四)中断控制器
通用中断控制器是一个用于集中管理从 PS 和 PL 发送到 CPU 的中断,启用、禁用、屏蔽和优先化中断源的处理中心。所有中断源都由唯一的中断 ID 号标识,对应有它自己的可配置优先级和目标 CPU 列表。
2024-12-29 15:24:52
529
原创 Zynq PS端外设(三)GPIO
GPIO外设有4个Bank,Bank0/1通过MIO连接到PS的引脚上;Bank2/3通过EMIO连接到PL的引脚上。注意:Bank1的电平要改成GPIO寄存器。
2024-12-29 14:57:26
589
原创 Zynq PL端IP核(三)AXI DMA
Zynq提供了两种DMA ,一种是,通过GP口与PL端连接,另一种是,通过HP口与PS端连接。Zynq有4个HP接口,每一个HP接口都包含控制和数据FIFO,这些FIFO为大数据量突发传输提供缓冲,让HP接口成为理想的高速数据传输接口。AXI DMA IP内核在AXI4内存映射和AXI4 Stream IP接口之间提供高带宽直接储存访问,
2024-12-27 15:48:25
1663
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人