嵌入式Linux应用层/驱动层学习
文章平均质量分 93
本专栏为本人在学习野火开发板时的笔记记录与心得体会。内容涵盖嵌入式linux的重点,以及学习开发过程中,出现的各种网上没有其他解决方式的BUG的解决方案,帮助大家在嵌入式linux中的学习。
lishing6
这个作者很懒,什么都没留下…
展开
-
i.MX6裸机开发(12):eLCDIF——液晶显示
显示器属于计算机的I/O设备,即输入输出设备。它是一种将特定电子信息输出到屏幕上再反射到人眼的显示工具。常见的有CRT显示器、液晶显示器、LED点阵显示器及OLED显示器。IMX6U系列芯片内部自带一个增强型液晶接口外设eLCDIF(Enhanced LCD Interface),配合使用DDR作为显存, 可直接控制液晶面板,无需额外增加液晶控制器芯片。IMX6U的eLCDIF液晶控制器最高支持1366x768分辨率的屏幕;原创 2024-08-29 10:38:48 · 759 阅读 · 0 评论 -
解决:sudo apt install catkin的报错问题。
命令,查看python3-catkin-pkg 版本。发现最新的 1.0.0-100 与 catkin冲突,发现 0.4.24-2版本没有与catkin冲突。将已安装的python3-catkin-pkg卸载。然后重新安装python3-catkin-pkg。原创 2024-09-24 22:25:16 · 161 阅读 · 0 评论 -
i.MX6裸机开发(11)——DDR测试
RAM是“Random Access Memory”的缩写,被译为随机存储器。所谓“随机存取”,指的是当存储器中的消息被读取或写入时,所需要的时间与这段信息所在的位置无关。这个词的由来是因为早期计算机曾使用磁鼓作为存储器,磁鼓是顺序读写设备, 而RAM可随读取其内部任意地址的数据,时间都是相同的,因此得名。实际上现在RAM已经专门用于指代作为计算机内存的易失性半导体存储器。根据RAM的存储机制,又分为动态随机存储器DRAM(Dynamic RAM)以及静态随机存储器SRAM(Static RAM)两种。原创 2024-08-26 19:36:06 · 765 阅读 · 0 评论 -
i.MX裸机开发(10):UART——串口通讯
串口通讯(Serial Communication)是一种设备间非常常用的串行通讯方式,因为它简单便捷,大部分电子设备都支持该通讯方式, 电子工程师在调试设备时也经常使用该通讯方式输出调试信息。在计算机科学里,大部分复杂的问题都可以通过分层来简化。如芯片被分为内核层和片上外设;官方SDK库则是在寄存器与用户代码之间的软件层。对于通讯协议,我们也以分层的方式来理解,最基本的是把它分为物理层和协议层。物理层规定通讯系统中具有机械、电子功能部分的特性,确保原始数据在物理媒体的传输。原创 2024-08-26 13:01:37 · 384 阅读 · 0 评论 -
i.MX6裸机开发(9):CCM时钟控制模块
i.MX 6U芯片时钟的结构以时钟树的方式进行描述。当我们设置外设时钟时大多会参考时钟树进行设置, 本章配套程序将以ARM_CLK_ROOT(CPU根时钟)为例讲解时钟的配置方法。本实验只用RGB灯显示大致显示CPU运行速度,没有用到其他外部电路。原创 2024-08-25 21:06:17 · 946 阅读 · 0 评论 -
i.MX6裸机开发(8):中断
GIC是Generic Interrupt Controller的缩写,直译为通用中断控制器,它由ARM公司设计,目前共有4个版本V1~V4,i.MX 6U使用的是GIC V2。GIC V2的功能框图如下所示。上图从上往下看可知GIC最多支持8个处理器(processor0~ processor7)。不同处理器的GIC功能是相同的,我们只看其中一个即可。GIC主要分为分发器(Distributor)和CPU接口(CPU interface/Virtual CPU interface)。原创 2024-08-25 12:39:26 · 728 阅读 · 0 评论 -
i.MX6裸机开发(7):整理工程文件
为降低难度,在之前章节我们把程序所有内容放在一个文件夹下。这样做存在两个主要问题,第一,代码存放混乱不易阅读。第二,程序可移植性差。本章将对代码进行简单的整理,让程序存放更有条理。本章主要内容:创建文件夹分类存储代码修改makefile。原创 2024-08-24 09:32:06 · 541 阅读 · 0 评论 -
i.MX6裸机开发(6):GPIO输入——按键查询检测
按键检测使用到GPIO外设的基本输入功能,GPIO外设相关的概念请参考第四章节汇编点亮LED灯。本章主要内容:i.MX 6U 在硬件上实现按键消抖Pro开发板按键原理图和功能分析在led_rgb_c基础上修改为button编译代码,实现按键查询控制LED。原创 2024-08-24 08:55:14 · 719 阅读 · 0 评论 -
i.MX6裸机开发(5):LED灯——使用IAR集成开发环境点亮
在编写应用程序的过程中,我们需要考虑更改硬件环境的情况,例如LED灯的控制引脚与当前的不一样, 我们希望程序只做最小的修改即可在新的环境上正常运行。以上代码分别把控制三盏LED灯的GPIO端口、GPIO引脚号以及IOMUXC的复用功能根据硬件连接使用宏定义封装起来了。在实际控制的时候我们就直接用这些宏,以达到应用代码跟硬件无关的效果。下面总结一下我们编写的LED灯驱动:在bsp_led.h文件中定义好具体的硬件引脚及控制亮灭的宏;原创 2024-08-23 23:54:44 · 909 阅读 · 0 评论 -
i.MX6裸机开发(4):官方C库实现
本章移植的内容主要包括两部分。第一部分,移植官方寄存器定义文件。第二,移植引脚复用以及引脚属性定义文件。在官方SDK的“”目录下, 头文件“MCIMX6Y2.h”文件多达4万多行,包含了i.MX6U芯片几乎所有的寄存器定义以及中断编号的定义, 本章我们只了解GPIO寄存器的定义,如下所示。/*********************以下代码省略***************************8*/这里只列GPIO1相关寄存器的部分代码。其他寄存器定义与此类似。原创 2024-08-22 23:45:07 · 1156 阅读 · 3 评论 -
i.MX6裸机开发(3):LED灯——c语言实现
在汇编点亮LED灯章节我们在led.S文件里使用纯汇编语言操作i.MX6ULL的寄存器点亮了LED灯。主要存在两个问题,第一,汇编语言编写效率低,编写繁琐。第二,程序编写完成后需要手动输入多条编译命令, 编译过程繁琐。本章的重点是解决上面两个问题。本章主要内容:从汇编跳转到C语言使用makefile工具和链接脚本管理工程。原创 2024-08-18 23:05:13 · 714 阅读 · 0 评论 -
i.MX6裸机开发(2):LED灯——汇编实现
i.MX6ULL芯片的GPIO被分成5组,并且每组GPIO的数量不尽相同,例如GPIO1拥有32个引脚,GPIO2拥有22个引脚, 其他GPIO分组的数量以及每个GPIO的功能请参考《i.MX 6UltraLite Applications Processor Reference Manual》 第26章General Purpose Input/Output (GPIO)(P1133)。GPIO框图剖析通过GPIO硬件结构框图,就可以从整体上深入了解GPIO外设及它的各种应用模式。原创 2024-08-18 12:42:37 · 769 阅读 · 0 评论 -
i.MX6裸机开发(1):环境搭建
本书讲解的例程全部采用2.2版本SDK的库文件,以下内容请大家打开“SDK_2.2_MCIM6ULL_EBF6ULL”的SDK包配合阅读,如下所示。为提高系统的稳定性,处理器会被分成多种工作模式,不同工作模式的权限不同。Cortex-M3或者M4内核的 的芯片分为特权模式和非特权模式,特权模式下CPU完全控制芯片而非特权模式下不能操作某些特殊 的寄存器。i.MX 6U作为一款应用处理器,将CPU工作模式进一步细分,支持九种工作模式下表所示。表 处理器工作模式处理器模式编码特权等级。原创 2024-08-16 23:24:42 · 780 阅读 · 0 评论 -
linux系统编程(10):深入了解select、poll、epoll之间的区别
本章讨论的开发环境是 Linux 网络io。原创 2024-08-13 21:50:57 · 606 阅读 · 0 评论 -
Linux应用层开发(8):基于套接字(Socket)的进程间通信
套接字(socket)是一种通信机制,凭借这种机制,客户端服务器模型的通信方式既可以在本地设备上进行,也可以跨网络进行。套接字的创建和使用与管道是有区别的,因为套接字明确地将客户端、服务器区分开来,而且套接字机制可以实现将多个客户连接到一个服务器。Socket英文原意是“孔”或者“插座”的意思,在网络编程中,通常将其称之为“套接字”,当前网络中的主流程序设计都是使用Socket进行编程的,因为它简单易用,它还是一个标准。原创 2024-08-12 00:28:08 · 775 阅读 · 0 评论 -
解决问题:VMware虚拟机扩展硬盘后,空间没有扩充仍处于不足状态。
不过虽然硬盘进行了扩充,但是由于没有分区,文件系统仍然无法识别使用该空间。网上的解决方法很多,本人亲测很多都失败了,而且过程超级复杂。最后发现只需一句代码即可解决。当我们硬盘内容不足时,我们自然想到在VMware的“虚拟机设置”中扩展我们的硬盘。针对的是ext2、ext3、ext4文件系统,我们使用resize2fs命令。1.确认自己的文件系统挂载在哪个盘哪个分区上,我的为:/dev/sda3。针对的是xfs文件系统,我们使用xfs_growfs命令。2.查看/dev/sda3的文件类型,我的为ext4。原创 2024-08-16 00:22:34 · 1072 阅读 · 0 评论 -
Linux应用层开发(7):网络编程
因为网络的知识太庞大了,想要介绍清除得写好几本书,在这里就简单提及一下就好了。TCP/IP是一个协议族,包含众多的协议。但对于网络应用开发人员,可能听到更多的是其中的应用层协议,比如HTTP、FTP、MQTT等。HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,HTTP的应用最为广泛。比如大家日常使用电脑时的一个常规操作:打开电脑,打开浏览器,输入网址,最后按下回车,这一刻你就开启了HTTP通信。原创 2024-08-09 22:39:10 · 763 阅读 · 0 评论 -
Linux系统编程(9):POSIX互斥锁
而如果互斥锁处于闭锁状态,则根据互斥锁的类型做对应的处理,默认情况下是快速互斥锁, 获取该互斥锁的线程将无法获得互斥锁,线程将被阻塞,直到互斥锁被释放,当然,如果是同一个线程重复获取互斥锁,也会导致死锁结果。当互斥锁处于开锁状态时,线程才能够获取互斥锁,当线程持有了某个互斥锁的时候, 其他线程就无法获取这个互斥锁,需要等到持有互斥锁的线程进行释放后,其他线程才能获取成功, 线程通过互斥锁获取函数来获取互斥锁的所有权。当该线程释放互斥锁时, 该互斥锁处于开锁状态,线程失去该互斥锁的所有权。原创 2024-08-06 23:50:57 · 611 阅读 · 0 评论 -
linux系统编程(8):POSIX信号量
本章节将讲述另一种进程/线程间通信的机制——POSIX信号量,为了明确与systemV信号量间的区别, 若非特别说明,本章出现的信号量均为POSIX信号量。也要注意请不要把它与之前所说的信号混淆了, 信号与信号量是不同的两种机制。原创 2024-08-06 23:02:11 · 1072 阅读 · 0 评论 -
Linux系统编程(7):线程
线程栈是非常重要的资源,它可以存放函数形参、局部变量、线程切换现场寄存器等数据, 在前文我们也说过了,线程使用的是进程的内存空间,那么一个进程有n个线程,默认的线程栈大小是1M, 那么就有可能导致进程的内存空间是不够的,因此在有多线程的情况下,我们可以适当减小某些线程栈的大小, 防止进程的内存空间不足,而某些线程可能需要完成很大量的工作,或者线程调用的函数会分配很大的局部变量, 亦或是函数调用层次很深时,需要的栈空间可能会很大,那么也可以增大线程栈的大小。而当在进程中创建一个新线程时,新的执行。原创 2024-08-05 22:48:39 · 775 阅读 · 0 评论 -
linux系统编程(6):共享内存
的一种IPC通信机制, 它可以在多个进程之间共享和传递数据,进程间需要共享的数据被放在共享内存区域, 所有需要访问该共享区域的进程都要把该共享区域映射到本进程的地址空间中去,因此所有进程都可以访问共享内存中的地址, 就好像它们是由用C语言函数malloc分配的内存一样。但是,这种共享的内存需要进程自己去维护好,如同步、互斥等工作,比如当进程1在读取共享内存的数据时, 进程2却修改了共享内存中的数据,那么必然会造成数据的混乱,进程1读取到的数据就是错误的, 因此,共享内存是属于。原创 2024-08-01 00:34:06 · 645 阅读 · 0 评论 -
Linux系统编程(5):system-V IPC 信号量
nsops:表示上面sops数组的数量,如只有一个sops数组,nsops就设置为1。原创 2024-07-31 13:15:48 · 1084 阅读 · 0 评论 -
Linux系统编程(4):消息队列
Linux下的进程通信手段基本上是从Unix平台上的进程通信手段继承而来的。 而对Unix发展做出重大贡献的两大主力AT&T的贝尔实验室 以及 BSD(加州大学伯克利分校的伯克利软件发布中心), 他们在进程间通信方面的侧重点有所不同;前者对Unix早期的进程间通信手段进行了系统的改进和扩充, 形成了“system-V IPC”,通信进程局限在单个计算机内(同一个设备的不同进程间通讯);而后者则跳过了该限制,形成了基于套接字(socket)的进程间通信机制(多用于不同设备的进程间通讯)。 Linux则把两者继原创 2024-07-31 10:29:50 · 587 阅读 · 0 评论 -
Linux系统编程(3):管道
一个典型应用是Linux的日志系统。可惜需要写日志的进程根本不可能“协调好”,由于写日志的进程是毫无关联的, 因此常用的互斥手段(比如后面介绍的什么互斥锁、信号量等)是无法起作用的, 就像你无法试图通过交通法规来杜绝有人乱闯红灯一样,因为总有人可以故意无视规则,肆意践踏规则, 如何使得毫不相干的不同进程的日志信息都能完整地输送到日志文件中而不相互破坏,是一个必须要解决的问题, 一个简单高效的方案是:使用FIFO 来接收各个不相干进程的日志信息,然后让一个进程专门将 FIFO中的数据写到相应的日志文件当中。原创 2024-07-30 11:18:40 · 898 阅读 · 0 评论 -
Linux系统编程(2):信号
信号(signal),又称为软中断信号,用于通知进程发生了异步事件, 它是Linux系统响应某些条件而产生的一个事件,它是在软件层次上对中断机制的一种模拟, 是一种异步通信方式,在原理上,一个进程收到一个信号与处理器收到一个中断请求可以说是一样的。信号是进程间通信机制中唯一的异步通信机制,一个进程不必通过任何操作来等待信号的到达,事实上, 进程也不知道信号到底什么时候到达。原创 2024-07-28 21:08:32 · 831 阅读 · 0 评论 -
Linux系统编程(1):进程
总的来说,程序与进程有以下的关系:程序只是一系列指令序列与数据的集合,它本身没有任何运行的含义, 它只是一个静态的实体。而进程则不同,它是程序在某个数据集上的执行过程, 它是一个动态运行的实体,有自己的生命周期,它因启动而产生,因调度而运行, 因等待资源或事件而被处于等待状态,因完成任务而被销毁。进程和程序并不是一一对应的,一个程序执行在不同的数据集上运行就会成为不同的进程, 可以用进程控制块来唯一地标识系统中的每个进程。原创 2024-07-28 01:36:02 · 714 阅读 · 0 评论 -
Linux应用层开发(6):SPI通信
SPI 协议是由摩托罗拉公司提出的通讯协议(Serial Peripheral Interface),即串行外围设备接口,是一种高速全双工的通信总线。它被广泛地使用在 ADC、 LCD 等设备与 MCU 间,要求通讯速率较高的场合。学习本章时,可与 I2C 章节对比阅读,体会两种通讯总线的差异。下面我们分别对 SPI 协议的物理层及协议层进行讲解。原创 2024-07-27 16:23:03 · 1256 阅读 · 0 评论 -
Linux应用层开发(5):I2C通讯
I2C 通讯协议(Inter-Integrated Circuit)是由Phiilps公司开发的, 由于它引脚少,硬件实现简单,可扩展性强不需要USART、CAN等通讯协议的外部收发设备, 被广泛地使用在多个集成电路(IC)间的通讯。原创 2024-07-25 21:42:33 · 1099 阅读 · 0 评论 -
Linux基础(5):Linux文件操作与系统调用
本文章为本人在学习野火开发板时的笔记记录。在Linux系统中有一个重要的概念:一切皆文件,它把一切资源都看作是文件,包括硬件设备,通常称为设备文件。前面我们也尝试过通过脚本读写文件的方式,实现了对硬件的访问。所以如果不了解Linux的文件操作,那想要点亮开发板的LED灯都费劲!本章通过C标准库及系统调用的方式操作文件,揭示用户应用程序、C标准库与系统调用之间的关系。本章的示例代码目录为:base_code/linux_app/file_io。原创 2024-07-18 19:41:56 · 1061 阅读 · 0 评论 -
Linux基础(4):Makefile简介与使用Makefile控制编译
本文为本人在学习野火开发板时做的笔记。原创 2024-07-18 12:31:04 · 1024 阅读 · 0 评论 -
Linux基础(3):查看开发板系统信息
本文为本人在学习野火开发板时的笔记记录当我们新购入一台笔记本电脑或者是台式机时,都免不了会去看看它的CPU型号,内存容量以及硬盘的使用情况等等。对于Linux开发板来说,实际上也相当于一台小型电脑,虽然距离传统PC可能有差别,但是麻雀虽小,五脏俱全,我们同样希望去查看开发板的这些相关信息。本章中介绍的内容大部分不仅适用于开发板,大部分也适用于开发主机中的Ubuntu系统,请尝试在两种平台上执行相关的命令查看信息,比较差异。原创 2024-07-17 01:24:42 · 858 阅读 · 0 评论 -
Linux基础(2):APT及YUM包管理工具及apt命令
本文章为本人学习野火开发板时的笔记记录在windows操作系统中,我们要想安装某个软件的时候,只要点开相应的exe文件,一直按“下一步”, 最后点“完成”,这样就可以在我们电脑上使用这个软件了。前面我们也提到过,Ubuntu提供了一个软件商店, 虽然它也可以提供软件的下载,并且能够自动安装,但是有些软件并不一定能够在里面搜索得到, 那只能以源码的方式来安装软件。采用源码的安装方式, 都需要检测当前的系统环境,设置编译的参数,如加入/剔除某个模块等,这样的安装方式就显得非常的繁琐。原创 2024-07-17 00:19:34 · 1038 阅读 · 0 评论 -
Linux应用层开发(4):串口通讯与终端设备
串口通讯(Serial Communication)是一种设备间非常常用的串行通讯方式, 因为它简单便捷,大部分电子设备都支持,电子工程师在调试设备时也经常使用串口来输出调试信息, 在计算机的上古时代,键盘、鼠标、MODEM以及终端都是使用串口通讯的。另外,为了方便使用,开发板上常常添加了USB转串口芯片, 使得我们可以直接用USB线连接主机和开发板的串口。串口在旧式的台式计算机中一般会以RS-232标准的COM口出现(也称DB9接口),见下图。原创 2024-07-23 00:47:59 · 855 阅读 · 0 评论 -
Linux应用层开发(3):input子系统
本章讲解Linux input输入子系统驱动相关应用层程序的控制原理。原创 2024-07-22 00:34:52 · 748 阅读 · 0 评论 -
linux基础(1):linux文件目录介绍
本文章为本人在学习野火开发板时的笔记。对于刚刚从Windows使用者切换到Ubuntu的用户,觉得最不习惯的地方可能就是文件目录的差异了, 但实际上这只是使用习惯导致的,它们有着非常多的共同点,可以对比学习。原创 2024-07-16 18:43:00 · 990 阅读 · 0 评论 -
Linux应用层开发(2):GPIO子系统
export文件:导出GPIO,该文件只能写不能读,用户向该文件写 入GPIO的编号N可以向内核申请将该编号的GPIO导出到用户空间,若内核本 身没有把该GPIO用于其它功能,那么在/sys/class/gpio目录下会新增一 个对应编号的gpioN目录,如上图一导出了gpio19。与LED子系统不同,当某个引脚被用于具体的LED设备时,该引脚会被设备占用,它的 功能在用户空间是无法再被修改的,而使用GPIO子系统的设备则可以在用户空间灵活配置作为输入、输出或中断模式。原创 2024-07-21 13:47:43 · 196 阅读 · 0 评论 -
环境配置(3):嵌入式交叉编译工具链详细解释(以ARM与X86为例)
交叉编译全详解,解决glibc库不兼容原创 2024-07-16 00:29:29 · 1103 阅读 · 0 评论 -
环境配置(2):挂载NFS网络文件系统
网络文件系统,常被称为NFS(Network File System),它是一种非常便 捷的在服务器与客户端通过网络共享文件的方式。开启了NFS服务后,客户端访问服务器共享的文件时如同访问本 地存储器(磁盘/SD卡/NAND FLASH等)上的文件一样,对于上层应用来说没有 任何差别,在嵌入式开发时,我们常常利用这个特性在主机上共享文件,主要应用场景如下:在NFS服务器上编译应用软件,客户端(开发板)通过NFS访问并运行应用程序进行测试。把NFS作为根文件系统来启动。原创 2024-07-14 10:43:25 · 686 阅读 · 0 评论 -
Linux应用层开发(1):LED子系统
本章分别使用和的文件操作方式控制开发板的LED灯,展示如何在应用层通过系统提供的设备文件控制相关硬件。原创 2024-07-21 00:21:32 · 48 阅读 · 0 评论 -
环境配置(1):笔记本window、虚拟机ubuntu、开发板三者互ping通信,并且虚拟机ubuntu和开发板能上网
我们配置网络是为了方便后续调试开发板系统或者应用程序时使用 tftp 协议 nfs 协议等拷贝文件或者设置文件系统启动方式为 nfs 挂载启动。 NAT 是什么意思? Network Address Translation,网络地址转换。 举个例子,在 NAT 里, Windows 就是一个爱护孩子的父亲, Ubuntu 就是受保护的小孩。小孩要买东西,都由他父亲代劳,别人根本不知道这小孩的存在;亲戚想跟小孩谈话,也要经过父亲中转,亲戚不能直接跟小孩接触。原创 2024-07-07 01:24:53 · 324 阅读 · 0 评论