
嵌入式开发
文章平均质量分 89
以韦东山JZ2440V3为开发板,介绍嵌入式裸板开发、驱动开发、boot loader编写、内核修改和移植等过程。
Leon_George
一只始终飞翔在嵌入式Linux ARM开发中的黑鸟,对bootloader、跟文件系统和Linux内核裁剪,以及对Linux底层应用和驱动开发也有些许心得。有志同道合的同学请关注我哦。
展开
-
超长文解析Linux块设备驱动编写方法
块设备的初始化过程要比字符设备复杂,它既需要像字符设备一样在加载内核时完成一定的工作,还需要在内核 编译时增加一些内容。块设备驱动程序初始化时,由驱动程序的 init()完成。 块设备的初始化过程:初始化并注册 gendisk 结构struct gendisk (定义于 ) 在内核中代表一个单独的磁盘驱动器。事实上, 内核还使用 gendisk 来表示分区,所以物理上的一块磁盘,可以在内核中由多个逻辑上的磁盘(gendisk)来表示。每个 gendisk 中包含了本物理实体的全原创 2023-03-03 23:59:19 · 2360 阅读 · 0 评论 -
利用NTP协议获取并更新系统时间
Network Time Protocol(NTP)协议是用来使计算机时间同步化的一种协议,它可以使计算机对其服务器或时钟 源(如石英钟,GPS 等)做同步化,它可以提供高精确度的时间校正(LAN 上与标准时间差小于 1 毫秒,WAN 上几十毫秒),且可用加密确认的方式来防止恶毒的协议攻击。NTP 提供准确时间,首先要有准确的时间来源,这一时间应该是国际标准时间 UTC。NTP 获得 UTC 的 时间来源可以是原子钟、天文台、卫星,也可以从 Internet 上获取。这样就有了准确而可靠的时间源。原创 2023-02-12 23:29:47 · 787 阅读 · 0 评论 -
Linux下的网络编程看这篇就够了
【摘要】本文主要讲述了网络编程的基本概念,包括各种协议、地址、套接字等,重点叙述了套接字的地址结构、操作函数及其编程方法和示例。原创 2020-03-26 11:28:31 · 438 阅读 · 0 评论 -
经典生产者-消费者问题解析
摘要:生产者和消费者问题在现实系统中是很普遍的。例如在一个多媒体系统中,生产者编码视频帧,而消费者消费(解码)视频帧,缓冲区的目的就是减少视频流的抖动。又如在图形用户接口设计中,生产者检测到鼠标和键盘事件,并将其插入到缓冲区中。消费者以某种基于优先级的方式从缓冲区中取出这些事件并显示在屏幕上。生产者和消费者模式共享一个有n个槽位的有限缓冲区。原创 2020-04-09 14:35:33 · 10104 阅读 · 0 评论 -
嵌入式 Linux 驱动开发你想知道的都在这
关于嵌入式 Linux 驱动开发的方方面面,包括学习路径、学习方法,工作经验、书籍推荐等等。只要是你想问的,这里都有。转载 2023-02-09 22:24:34 · 931 阅读 · 0 评论 -
U-Boot常用命令介绍
U-Boot 上电启动后,按任意键可以退出自动启动状态,进入命令行。U-Boot 可支持几十个常用命令,通过这些命令,可以对开发板进行调试,引导 Linux 内核,还可以擦写 Flash 完成系统部署等功 能。掌握这些命令的使用,才能够顺利地进行嵌入式系统的开发。原创 2023-01-27 21:22:44 · 1115 阅读 · 0 评论 -
超长文全面解析设备树
本文从设备树的起源、概念、架构、语法、编译、常见接口及具体应用全面细致分析了设备树的种种,全文5万多字,写作过程中借鉴了不少优秀文章和博文并在文后予以了标注,若涉及侵权还请联系删除或授权。原创 2022-12-20 12:12:37 · 1461 阅读 · 0 评论 -
信号集操作函数一网打尽
本文详细讲述了信号集的概念,并分别列举了与其有关的各种操作函数,必要时举出了相关例子进行进一步阐述,旨在帮助大家更好的理解信号集操作函数的内在涵义和具体使用场景。原创 2022-12-07 22:04:16 · 217 阅读 · 0 评论 -
Linux开发常用ps命令选项详解
【摘要】本文介绍了在Linux应用/内核开发调试中,经常需要用到的两个选项组合,当然,如果你需要查看更多更详尽的选项说明,可以参考man说明文档,即命令行下输入`man ps`进行查看。原创 2022-12-04 11:37:34 · 650 阅读 · 0 评论 -
如何在Linux下自定义/编写 一个守护进程
本文主要讲述何为守护进程,以及如何自编或者利用现有程序将其伪装成守护进程。原创 2022-12-03 21:49:08 · 835 阅读 · 0 评论 -
超详细BootLoader原理分析
本文详细地介绍了基于嵌入式系统中的 OS 启动加载程序 ―― BootLoader 的概念、软件设计的主要任务以及结构框架等内容。原创 2022-11-24 23:02:51 · 2158 阅读 · 0 评论 -
场景化git操作学习手册(新手必会)
【摘要】旨在帮助大家在实际开发过程中遇到的各种场景下git相关命令的常见用法。原创 2022-11-01 19:20:54 · 171 阅读 · 0 评论 -
Linux设备模型剖析系列文章之七(kobj、kset)
【摘要】本文是Linux设备模型系列文章的最后一篇,补充讲解了kobj和kset的一些内容,主要阐述kobj/kset作为统一设备模型的基础,到底提供了哪些功能,在具体应用过程中,如device、bus甚至platform_device等是如何使用kobj/kset的。原创 2022-10-29 15:27:16 · 246 阅读 · 0 评论 -
Linux设备模型系列文章之六(设备资源管理)
【摘要】本文是Linux设备模型剖析系列文章之六,主要讲述了如何避免在内核驱动编程中解决繁琐的资源管理难题。相信每一个写过Linux driver的工程师,都在probe函数中遇到过上面的困惑:要顺序申请多种资源(IRQ、clock、memory、regions、ioremap、dma、等等),只要任意一种资源申请失败,就要回滚释放之前申请的所有资源。而设备资源管理帮我们解决了这个问题,本文就是围绕它来展开。原创 2022-10-29 15:24:12 · 215 阅读 · 0 评论 -
Linux设备模型剖析系列之五(class)
【摘要】本文是Linux设备模型剖析系列文章之五,讲述了class相关的概念及其在驱动编程中的应用。在设备模型中,Bus、device、device driver等等,都比较好理解,因为它们对应了实实在在的东西,所有的逻辑都是围绕着这些实体展开的。而本文所要描述的class就有些不同了,因为它是虚拟出来的,只是为了抽象设备的共性。原创 2022-10-29 15:16:23 · 256 阅读 · 0 评论 -
Linux设备模型剖析系列之四(BUS)
【摘要】本文是Linux设备模型剖析系列文章之四,主要讲述了BUS总线在Linux设备模型中的地位,BUS是一类特殊的设备,它是连接处理器和其它设备之间的通道(channel)。为了方便设备模型的实现,内核规定,系统中的每个设备都要连接在一个Bus上,这个Bus可以是一个内部Bus、虚拟Bus或者platform Bus。内核通过struct bus_type结构抽象Bus。下文会围绕该结构,描述Linux内核中Bus的功能,以及相关的实现逻辑。最后,会简单的介绍一些标准的Bus(如platform)。原创 2022-10-29 15:10:35 · 405 阅读 · 0 评论 -
Linux设备模型剖析系列之三(device和device driver)
【摘要】device和device driver是Linux驱动开发的基本概念。Linux kernel的思路很简单:驱动开发,就是要为指定的设备(device)开发指定的软件(device_driver),所以kernel就为设备和驱动定义了两个数据结构,分别是device和device_driver。下文将会围绕这两个数据结构,介绍Linux设备模型的核心逻辑,包括:设备及设备驱动在kernel中的抽象、使用和维护;设备及设备驱动的注册、加载、初始化原理;设备模型在实际驱动开发过程中的使用方法。原创 2022-10-29 15:01:53 · 308 阅读 · 0 评论 -
Linux设备模型剖析系列之二(uevent、sysfs)
【摘要】本文为Linux设备模型剖析系列文章之二,主要内容为对kobject中的uevent进行了讲解,包括其在内核中的位置(地位)和内部逻辑;而后还讲述了sysfs和kobjet之间的关系、attrbute的概念等问题。原创 2022-10-29 14:55:50 · 952 阅读 · 0 评论 -
如何避免内存泄漏
对于任何使用C语言的人,如果问他们C语言的最大烦恼是什么,其中许多人可能会回答说是指针和内存泄漏。这些的确是消耗了开发人员大多数调试时间的事项。指针和内存泄漏对某些开发人员来说似乎令人畏惧,但是一旦您了解了指针及其关联内存操作的基础,它们就是您在C语言中拥有的最强大工具。本文将与您分享开发人员在开始使用指针来编程前应该知道的秘密。本文内容包括:1.导致内存破坏的指针操作类型2...原创 2019-01-16 11:43:05 · 765 阅读 · 0 评论 -
论程序优化一般考虑的几个方向
写程序最主要的目标是使它在任何情况下都能正确工作,但在很多情况下,让程序运行的快也是一个重要的因素。编写高效程序要做到一下几点:必须选择一组适当的数据结合和算法;编写出编译器能有效优化的源代码;编写适合不同处理器架构和性能的代码。当然,有人可能会说,优化代码可以依靠编译工具(如GCC)的优化选项,为什么还需要我们自己亲自干呢?有这种疑问的请继续阅读,没有疑问的可以跳过第0节。0. 为...原创 2020-03-19 19:40:10 · 704 阅读 · 0 评论 -
Shell中的测试命令
Shell中有多种针对文件、字符串、数值的条件测试命令,用于检查某个条件是否成立。下面分别进行讲解。三种测试的命令的表达方式test,语法格式为:test <condition>[ ],语法格式为:[ <condition> ][[ ]],语法格式为:[[ <condition> ]]前两种的条件格式一样,可以通用,仅仅是写法的...原创 2019-01-02 19:10:08 · 927 阅读 · 0 评论 -
3个实用shell脚本,建议收藏!
0. 编写脚本的注意事项开头加解释器:#!/bin/bash2)语法缩进,使用四个空格;多加注释说明。3)命名建议规则:变量名大写、局部变量小写,函数名小写,名字体现出实际作用。4)默认变量是全局的,在函数中变量local指定为局部变量,避免污染其他作用域。5)有两个命令能帮助我调试脚本:set -e 遇到执行非0时退出脚本,set-x 打印执行过程。6)写脚本一定...原创 2019-02-20 17:09:48 · 613 阅读 · 0 评论 -
GDB的断点调试
前言之前在GDB的极致运用一文中,我们讲到了GDB启动调试的多种方式,分别应用于多种场景。今天我们来介绍一下断点设置的多种方式。1.为何要设置断点在介绍之前,我们首先需要了解,为什么需要设置断点。我们在指定位置设置断点之后,程序运行到该位置将会“暂停”,这个时候我们就可以对程序进行更多的操作,比如查看变量内容,堆栈情况等等,以帮助我们调试程序。2.查看已设置的...原创 2019-02-28 20:34:37 · 2654 阅读 · 0 评论 -
一文教你如何构建动态链接库
话说前一篇文章一文教你如何构建静态链接库向大家介绍了如何构建静态库,虽然解决了我们的一大麻烦,但静态库在使用中任然存在一些缺点。软件更新麻烦:假如你对之前库里的某个函数功能有了更好的实现方法,想在某个之前已经使用了该函数的项目中使用新版本的库函数,这时你不得不重新编译一遍。如果项目规模小还可以,但如果项目规模很大,编译起来需要几个小时呢?几乎你的每个程序都大量使用了标准I/O函数(print...原创 2020-03-19 19:11:42 · 995 阅读 · 0 评论 -
linux内存重映射的概念及对内核虚拟地址的重映射方法分析
【摘要】本文分析了Linux设备的内存映射的相关概念和理论,使用例子对mmap及nopage的驱动编写方法进行了解释,最后对3种不同的内核虚拟空间分配方法下,mmap驱动编写方法进行了细致的分析和调试。原创 2022-10-10 21:46:41 · 719 阅读 · 0 评论 -
linux内存管理和映射
【摘要】本文主要讲述linux内核中内存管理及映射的相关理论。原创 2022-10-09 21:57:47 · 1094 阅读 · 0 评论 -
虚拟机双网卡设置(外网+内网)
本文主要介绍了在开发过程中,实现开发板利用网线直连电脑实现开发工作,而电脑又可以通过另一个无线或有线网卡正常连接互联网。原创 2022-09-11 22:17:13 · 8882 阅读 · 1 评论 -
/usr/local/arm/4.3.2/bin/arm-none-linux-gnueabi-gcc: 没有那个文件或目录
本文介绍执行arm-linux-gcc时,出现查找不到安装的交叉编译工具。而通过查看目录,又确实又可以看到我们安装的交叉编译工具原创 2022-09-06 17:25:46 · 936 阅读 · 1 评论 -
代码覆盖率测试对编程小白的意义及其使用方法
为初入职场或编程小白写的一篇关于代码测试中覆盖率的意义及其使用方法。原创 2022-06-20 23:49:40 · 341 阅读 · 1 评论 -
基于消息传递的并发编程(MPI)之同步收发
MPI是一种消息传递式并行程序设计机制,用户通过显式地发送和接收消息来实现处理机间的数据交换。在这种并行编程中,每个并行进程均有自己独立的地址空间,相互之间不能访问,必须通过显式的消息传递来实现。这种编程方式是大规模并行处理机(MPP)和机群(Cluster)采用的主要编程方式。本文将简要介绍基于MPI的编程方法。............原创 2022-06-15 00:16:13 · 569 阅读 · 0 评论 -
基于消息传递的并发编程(MPI)之异步收发
当一个消息发送操作部分完成(不管消息接收者是否已经收到消息,我就是立即返回)时,称为异步发送;同理,当一个消息接收操作部分完成(不管是否接收到了消息,我就是立即返回)时,称为异步接收。下文中即将提到的`MPI_Isend`和`MPI_Irecv`就是异步收发函数,或者说是非阻塞的收发函数。...原创 2022-06-19 11:27:35 · 625 阅读 · 0 评论 -
Linux中的进程概念及其通信方法
【摘要】本文讲述了在Linux中的进程的概念、分类、属性及其相互通信的5种方法(管道、信号、信号量、消息队列、共享内存)原创 2022-04-20 20:25:06 · 520 阅读 · 0 评论 -
Linux内核编译
1. 内核编译的基本流程<获取源代码>, 如有需要则进行修改;<配置>;<编译>;[根据发布版生成相应的源码包];<安装内核映像和模块>。<>为必需的步骤,[ ]为可选的步骤。若不使用发布版的源码包管理系统, 则不需要进行步骤4。 想要使用源码包管理系统来安装时, 可以使用各发布版的源码包创建系统。 在这种情况下步骤 3 和步骤 4 的操作是合并进行的。2. 准备工作2.1 工具的安装Fedora发行版源原创 2022-03-27 00:48:53 · 1217 阅读 · 0 评论 -
pycharm远程连接MySQL时出现错误的解决方法
问题背景描述:利用pycharm远程连接阿里云服务器上的MySQL数据库。1. 远程连接代码# 导入pymysql模块import pymysqldef main(): # 连接阿里云服务器(公网IP:47.101.102.103)的mysql端口3306,并以用户名root和密码123456 # 远程登录mysql数据库,采用utf8字符集。 conn = pymysql.connect(host='47.101.102.103', port=3306, .原创 2022-03-12 20:14:02 · 3446 阅读 · 0 评论 -
udev和mdev两种热插拔机制
热插拔是内核和用户空间之间,通过调用用户空间程序(如hotplug、udev 和 mdev)的交互。 当需要通知用户内核发生了某种热插拔事件时,内核才调用这个用户空间程序。1. 3种热插拔机制Linux内核支持热插拔的部件有USB设备、PCI设备甚至CPU。Linux的热插拔支持是一个连接底层硬件、内核空间和用户空间程序的机制,且一直在变化。而设备文件系统有devfs,mdev,udev这三种。在对待设备文件这块,Linux改变了几次策略。在Linux早期,设备文件仅仅是是一些带有适当的属性集的普通文原创 2022-01-31 22:52:16 · 1450 阅读 · 0 评论 -
PicGo+GitHub图床+Markdown
PicGo+GitHub图床,让Markdown飞一次偶然的机会让我接触到Markdown语法,随后便疯狂地爱上了这种**“轻量级标记语言”。笔记、文章、技术评审文档、业务逻辑文档等等,我都想要使用Markdown去记录。几次寻觅,我找到了两款能够大部分符合我的需求的Markdown编辑器:Typora和马克飞象**。目前我是两款编辑器混合时候,当编写的Markdown文档需要和印象笔记对接的时候,则使用马克飞象;至于其他用途的文档就使用Typora。则两款编辑器都近乎完美但是却又不能达到完美。我写文档原创 2022-01-23 13:33:16 · 289 阅读 · 0 评论 -
Linux内核中的延时函数详解
本文讲述了内核中涉及的两种不同性质的延时函数,并分析了各自的应用场景。原创 2021-12-06 22:16:12 · 7062 阅读 · 4 评论 -
Linux 设备驱动中的阻塞与非阻塞 I/O
阻塞操作是指在执行设备操作时若不能获得资源则挂起进程,直到满足可操作的条件后再进行操作。被挂起的进程进入休眠状态,被从调度器的运行队列移走,直到等待的条件被满足。而非阻塞操作的进程在不能进行设备操作时并不挂起,它或者放弃,或者不停地查询,直至可以进行操作为止。阻塞从字面上听起来似乎意味着低效率,实则不然,如果设备驱动不阻塞,则用户想获取设备资源只能不停地查询,这反而会无谓地耗费 CPU 资源。而阻塞访问时,不能获取资源的进程将进入休眠,它将 CPU 资源让给其他进程。因为阻塞的进程会进入休眠状态,因此,必原创 2021-12-02 22:29:40 · 872 阅读 · 0 评论 -
C语言构建环形缓冲区
它逻辑上是一个首尾相连的FIFO结构,具体实现上采用简单的线性数组。通过额外的辅助标志(head、tail)能很快知道队列的使用情况(是满还是为空)。正因为其简单高效的原因,甚至在硬件都实现了环形队列。环形队列广泛用于网络数据收发、程序间的大量数据交换(比如内核与应用程)、硬件接收大量数据。1、环形缓冲区原理环列队列逻辑上将数组元素array[0]与array[LEN-1]连接起来,形成一个存放队列的环形空间。实际操作中为了方便读写,采用head和tail分别指向可以读的位置和可以写的位置。环形原创 2021-08-29 00:02:10 · 4014 阅读 · 5 评论 -
如何根据栈信息确定函数调用过程
ARM架构下函数调用时的栈空间使用ARM架构下的寄存器用途:r0-r3 :用来传入函数参数或传出函数返回值。在子程序调用之间,可以将 r0-r3 用于任何用途。被调用函数在返回之前不必恢复 r0-r3。如果调用函数需要再次使用 r0-r3 的内容,则它必须保留这些内容。r4-r11 :被用来存放函数的局部变量。如果被调用函数使用了这些寄存器,它在返回之前必须恢复这些寄存器的值。r11 是栈帧指针 fp,指向调用函数的栈帧栈底。r12(ip) :内部过程调用寄存器 ,在过程调用之间,可以将它用于任原创 2021-08-27 23:55:45 · 473 阅读 · 0 评论