从裸机编程到嵌入式Linux编程思想的转变------分而治之:驱动和应用程序

嵌入式开发路径选择:裸机编程与嵌入式Linux的深度对比与决策指南 在嵌入式系统开发领域,理解底层硬件操作与操作系统抽象是构建稳定高效设备的核心基础。从计算机体系结构出发,开发者需要掌握微控制器(MCU)的寄存器级编程原理,这构成了裸机开发的技术基石,其价值在于实现对硬件资源的极致控制和实时性保证,广泛应用于汽车电子、工业控制等场景。随着系统复杂度提升,嵌入式Linux通过操作系统内核提供了进程管理、虚拟内存和文件系统等高级抽象,其技术价值在于能够快速集成丰富的软件生态和网络协议栈,适用于智能家居、多媒体终端等复杂应用场景。本文聚焦于嵌入式裸机与嵌入式Linux这两种主流开 阅读详情

    笔者学习嵌入式Linux也有一段时间了,很奇怪的是很多书讲驱动编程方面的知识,也有很多书将ARM9方面的知识,但是从以前51形式的(对寄存器直接操作,初始化芯片的功能模块)编程方法,和思维模式,变换为基于Linux操作系统编程,讲这个思想转变的书几乎没有,让初学者走了很多弯路,撞了很多难墙。

    笔者因此写上自己的学习心得,希望能给和我一样转变做嵌入式Linux这块的朋友一点帮助,早点入门,于愿足矣。

    让我们一起回顾一下51形式的编程方法,以一个简单的LED例子:通过串口向其发送一串指令,让LED灯闪烁,闪烁频率由串口发送的指令决定。

    于是我们开始编程:一开始各种初始化晶振,初始化要用的功能模块:UART,GPIO,定时器。那么就会通过设置寄存器的各种位,把UART配置为中断模式,GPIO对应的LED引脚为输出模式,用于控制LED灯的暗灭,最后初始化定时器,来控制暗灭的频率。相信有过嵌入式裸机编程经验的朋友们一定都觉得这很简单,但是如果跑上了操作系统,那又应该怎么办?

    嵌入式Linux分为驱动层和应用程序层。什么意思?大家一定偶尔听过,对Linux设备的操作就像操作文件一样简单,打开,写入,关闭。听起来是很简单,听完就算了,也不知道到底说什么。

    驱动层就相当于我们在51形式编程中的初始化功能模块,在Linux中,已经把所有函数封装好了。举例:笔者用的at91sam9260的芯片,现在我要把PB1 引脚设置为输出模式,且初始值为低电平,则调用系统封装好的函数:

at91_set_gpio_output(AT91_PIN_PB1, 0);

    这个函数位于Linux内核源代码 arch/arm/mach-at91,(我用的是at91的芯片)要用到什么函数进去找。在arch/arm下有很多文件夹,以后需要自己根据自己的需求去选择相应的芯片找函数,这个笔者认为是Linux不人性化的地方,需要改进,只有有经验的工程师才能轻松找到,初学者真的要费很大精力。

     而我们那些晶振时钟初始化就不用写了,在Linux操作系统运行的时候已经帮你初始化好了。还有串口也已经初始化好了,在Linux有专门的操作函数,大家可以看看Linux下串口操作的相关资料,这里不赘述。当然驱动层完成的还不只这些工作,剩下的工作在讲玩应用程序层之后再介绍。

     应用程序层:这是一个完全与硬件无关的层次,就相当于我们51形式编程的逻辑层一样。那么我们怎么和驱动层打交道呢?大家回忆那句话:像操作文件一样,操作硬件设备。没错,我们就是操作文件。每个硬件设备驱动会有一个设备文件(一般要手动生成,自动生成要在驱动中写好也行)。例如我们为LED灯取一个设备文件名字为leds,然后在dev/leds生成这个设备文件,应用程序用open方法打开文件后,得到文件描述符fd,那么以后操作LED这个设备就是操作这个fd。

fd = open (“dev/leds”, flags);


     到底怎么操作fd才能像操作文件一样操作硬件设备呢?就是命令机制!通过一个非常重要的函数ioctl。看过我上几篇文章的朋友们一定知道这个函数,这就是应用程序和驱动程序的接口之一。

    假设我们定义了命令 LED_ON和LED_OFF(定义命令的方法见前几篇文章),那么我们要让LED闪烁,在应用层只要写:

while(1)
{
    ioctl(fd,LED_ON);
    sleep(1);
    ioctl(fd,LED_OFF);
    sleep(1);
}


 


    是在应用层看来这个是不是很简单?但是却苦了驱动层了。刚刚说到驱动层做的事情不只是初始化模块功能,不错她还有一个功能就是完善ioctl,根据相应的命令进行相应的动作。(ioctl是比较复杂的,这里只是举了一个最简单的例子,朋友们还是要多看一些书籍和实验),这里是不是连定时器的初始化都不用我们自己写,直接调用系统的休眠函数来达到延迟的目的咯~~~

     让我们再次回到驱动层,驱动层就要完善这个ioctl了,因为驱动层可以直接对硬件操作,让输出高电平和低电平。

驱动的操作就比较复杂了,这里只能简单讲下概念了,因为这时已经是Linux设备驱动开发的内容了。

     关于Linux设备驱动的总结文章,会在以后再写,建议大家可以看看国嵌的Linux视频,在电驴上资源很多,很多关于设备驱动开发的视频,搜的时候关键字为:嵌入式Linux

     这篇文章的主要目的是让大家思想上从51形式的编程转变到嵌入式Linux编程思想,希望大家能转变过来思想,踏入嵌入式Linux之门!

朱有鹏嵌入式linux网盘,朱有鹏嵌入式单片机免费课程 顶帖顶帖啊!!!朱有鹏嵌入式核心课程路线图整个学习路线图很庞大,为了描述简单我把目录分成了几个层次,分层浏览。第一层目录:0.基础预科1.ARM裸机全集2.uboot和linux内核移植3.linux驱动开发4.C语言专题精讲篇5.linux应用编程和网络编程6.阶段项目篇说明:第一层目录中共有6个部分,共同构成了嵌入式核心课程。每个部分下面又会分为若干模块,以此来构建出整个知识体系网络。第二层目... 阅读详情

相关推荐

【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.2.pdf

本书一共分四篇,每篇对应一个不同的阶段: 第一篇: Ubuntu 操作系统入门 本篇主要讲解 Ubuntu 操作系统的使用,本篇不涉及到任何嵌入式方面的知识,全部是在 PC 上完成的,只要安装好 Ubuntu 操作系统即可。 第二篇: ARM 裸机开发 从本篇开始我们就正式开始使用开发板学习了,本篇通过数十个裸机例程来帮助大家了解 I.MX6UL 这颗 CPU。为以后的 Linux 驱动开发做准备,通过本篇大家可以掌握在 Ubuntu 下进 行 ARM 开发的方法。 第三篇: Uboot、 Linux 和根文件系统移植 本篇讲解如何将 Uboot、 Linux 和根文件系统移植到我们的开发板上,为后面的 Linux 驱 动开发做准备。 第四篇: Linux 驱动开发 前面做了那么多的工作就是为了本篇,因此本篇注定了将是本书重中之重,大家应该投入 精力最多的一篇,望大家做好准备 通过上面四篇的学习,大家基本掌握了嵌入式 Linux 驱动的开发流程,本书旨在引导大家 入门 Linux 驱动开发,更加深入的研究就需要大家自行查阅其他更加专业的书籍了,祝愿大家 学习顺利

记录自己的程序移植经历(裸机软PLC C语言程序移植到Linux)

当然,我就是小白一个。一般来说,keil开发的程序,都有单独的main.c文件,这里面包含了移植用不到的函数,有两个办法,就是将不需要的函数删除,单独留下需要的函数写一个入口函数main。首先肯定要知道的就是每个文件都大体有什么功能,通篇看一下代码,从代码文件名入手,就能大致知道里面的代码是干什么的了,或者简单点,直接请教工程师,每个文件都是什么功能。由先前看文档、搜资料的基础知道,STM32的库在linux里是用不了的,我用了最粗暴的办法,将所需要的文件里有关于HAL库的头文件删除,然后看报错部分。

weixin_72426331的博客 835

深入解析iDP3的Learning模块:从数据集构建到3D动作预测的代码实现

本文深入解析iDP3框架的Learning模块,从数据集构建到3D动作预测的完整代码实现。通过扩散模型实现视觉输入到动作序列的端到端预测,详细介绍数据采集、增强策略、模型架构及训练技巧,帮助开发者掌握3D动作预测策略的核心技术。

k0l1m2n3o的博客 310

arm裸机与嵌入式linux驱动开发,如何编写基于ARM的裸机程序和基于Linux的驱动程序?...

在嵌入式开发中,ADC应用比较频繁,本文主要讲解ADC的基本原理以及如何编写基于ARM的裸机程序和基于Linux的驱动程序。ARM架构:Cortex-A9Linux内核:3.14在讲述ADC之前,我们需要先了解什么是模拟信号和数字信号。模拟信号主要是与离散的数字信号相对的连续的信号。模拟信号分布于自然界的各个角落,如每天温度的变化,而数字信号是人为的抽象出来的在时间上不连续的信号。电学上的模拟信号...

weixin_42300329的博客 931

陀螺仪与加速度计的姿态融合——互补滤波

本篇文章我们来讲讲如何将陀螺仪和加速度计的数据结合起来,获取更准确的姿态数据,使用的是互补滤波的方法。

小白白学电子 2万+

LVGL hal disp(porting display)

LVGL本身是没有对接最终的显示框架的,所以到具体的某个平台上,需要自行porting。

Bigan(安)的博客 2097

Linux驱动程序和应用程序

应用编程需要做些什么,应用层与驱动层怎么联系起来的?

amateur_dabai的博客 2084

TGRS 2026 即插即用 | 注意力篇 | SCFM:双向交叉显著性引导注意力,高层语义与低层细节的双向互补!

本文介绍了MPCNet中的语义引导交叉注意力融合模块(SCFM),该模块通过双向交叉显著性引导机制实现跨尺度特征融合。SCFM创新性地结合了高层语义和低层细节的互补信息,通过轻量局部空间注意力预增强和坐标注意力全局融合引导,显著提升了红外小目标检测的精度。实验表明,SCFM在多个数据集上达到SOTA性能,同时保持轻量高效的计算特性,支持端侧设备部署。 SCFM的核心贡献包括: 双向交叉显著性引导机制,实现语义与细节的互补融合 轻量局部空间注意力预增强模块,计算量仅为传统方法的1/10 坐标注意力全局融合引导

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 151

【Linux】Linux系统编程(入门与系统编程)(三)(深入理解操作系统、进程、环境变量、内存分布)

认识冯诺依曼系统 操作系统概念与定位 深入理解进程概念,了解PCB 学习进程状态学会创建进程,掌握僵尸进程和孤儿进程,及其形成原因和危害 了解进程调度,Linux进程优先级,理解进程竞争性与独立性,理解并行与并发 理解环境变量,熟悉常见环境变量及相关指令, getenv/setenv函数 理解C内存空间分配规律,了解进程内存映像和应用程序区别, 认识地址空间。

qq_51581716的博客 1664

【AI智能体】Coze 搭建个人旅游规划助手实战详解

Coze 制作旅游规划助手机器人实战详解

congge 4608

system.img解包打包工具

最近需要对system.img进行解包,修改系统属性和添加自己的APK,再打包烧录,整理俩个方法。 system.img解包打包工具方法一 1、把system.img转换成ext4格式 ./simg2img system.img system_ext4.img 2、挂载ext4到systemMount目录进行修改 sudo mount system_ext4.img systemMount/ -o loop 3、修改完成后 unmount 退出挂载使用如下命令

计算机毕业论文源码,学生个人网页制作html源码。贴近用户做网络推广和互联网优化。 9706

什么是裸机编程,linux驱动开发,linux应用编程

什么是裸机编程,linux驱动开发,linux应用编程,区别

XXY2083123843的博客 3378

解决【x2openEuler环境检查未通过——CheckRepoCurlActor不通过】问题

摘要:x2openEuler使用默认repo源时出现环境检查失败问题,原因是默认源返回308永久重定向错误。解决方法包括:1)为CentOS主机配置华为yum源;2)在x2openEuler Web界面修改为自定义可用源。具体步骤包括备份原源、下载华为源、清除缓存,并通过curl测试确认新源可用性。最终成功配置openEuler-24.03-LTS-SP1版本的repo源后,环境检查顺利通过。

提供C#相关开发 、云计算、运维测试、网络安全相关技术分享与服务,有意向可联系。 259

Linux系统驱动跟裸机驱动的区别

Linux系统驱动跟裸机驱动的区别

探索C++编程的奥秘,分享深入的技术见解和实践,旨在激发读者创造力与解决问题的思维。 4001

YOLOv8改进:注意力系列篇 |高效的通道先验卷积注意力(CPCA) | 中科院 2023.6

高效的通道先验卷积注意力(CPCA)方法,支持注意力权重在通道和空间维度上的动态分布;

会AI的学姐 2043

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

嵌入式学习二:怎么学习Linux操作系统

2. 怎么学习嵌入式Linux操作系统 本文假设您是零基础,以实用为主,用最快的时间让你入门;后面也会附上想深入学习时可以参考的资料。 在实际工作中,我们从事的是“操作系统”周边的开发,并不会太深入学习、修改操作系统本身。 ①操作系统具有进程管理、存储管理、文件管理和设备管理等功能,这些核心功能非常稳定可靠,基本上不需要我们修改代码。我们只需要针对自己的硬件完善驱动程序 ②学...

JiandaoStudio 6672

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

通俗易懂,嵌入式Linux驱动基础

前言上一篇分享的:《从单片机工程师的角度看嵌入式Linux》中有简单提到Linux的三大类驱动:我们学习编程的时候都会从hello程序开始。同样的,学习Linux驱动我们也从最简单的he...

嵌入式Linux 4081

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

【嵌入式】总结&参考——Linux下的裸机驱动开发(一)

使用make其实就是为了简化操作,有些麻烦的操作流程能省就省,比如烧录这一操作,视频教程里总是会在命令行里输入./imxdownload xxx.bin /dev/sdx,这样做就显得很麻烦,因为自己开发过程中,挂载到设备树上的sd设备往往是同一个,序号不会变。于是可以自己定义一个规则,专门用于烧录,每次需要烧录时,直接make download。如果觉得还是太长,可以把规则名改短一点download:这次学习,除了“由简入深,方能深入浅出”以外。

m0_74349248的博客 2354

应用编程与裸机编程、驱动编程的区别(Linux应用编程篇)

用嵌入式Linux硬件平台下的软件开发来说,我们大可将编程分为三种,分别为裸机编程、Linux驱动编程以及 Linux应用编程。 裸机编程: 一般把没有操作系统支持的编程环境称为裸机编程环境,譬如单片机上的编程开发,编写直接在硬件上运行的程序,没有操作系统支持 驱动编程: 狭义上 Linux驱动编程指的是基于内核驱动框架开发驱动程序, 驱动开发工程师通过调用 Linux内核提供的接口完成设备驱动的注册,驱动程序负责底层硬件操作相关逻辑 应用编程(系统编程): 是基于 Linux操作系统的应用编程

栋哥修炼日记 2153

嵌入式Linux教程—裸机、应用、驱动完整教程目录

本教程涵盖从裸机到驱动到应用的嵌入式学习文章,持续更新。本教程旨在帮助以后像从事嵌入式行业的同学,以及想转行嵌入式的朋友快速入门。无论你是干嵌入式软件、还是嵌入式驱动,无论以后从事的具体行业是如何,都可以学习本教程内容。.........

闪耀大叔的博客 1386

从裸机到内核:C语言如何无缝对接嵌入式Linux驱动架构?

掌握嵌入式 Linux 的 C 语言驱动开发全路径,从裸机编程到内核模块无缝衔接。详解设备树配置、字符驱动实现与中断处理,适用于智能硬件与物联网设备开发,提升系统级编程能力,值得收藏。

LiteProceed的博客 979

触摸屏(裸机/驱动)编程思想—JZ2440

触摸屏(裸机/驱动)编程触摸屏的种类电阻式触摸屏电容式触摸屏触摸屏裸机程序触摸屏驱动程序 参考资料: 1.【韦东山】嵌入式Linux应用开发完全手册(旧内核未包含新协议和新API接口——本文的实验平台电阻式触摸屏) 2.【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.4——目前主流开发流程:电容式触摸屏 3.触摸屏-测试过程 触摸屏的种类   触摸屏主要有电容式、电阻式、红外线式、超声波式。目前较多应用的是电容式。 电阻式触摸屏   电阻式触摸屏其实就是一种传感器,虽然已经用的不多了,但是还是

end_destiny 992

ZYNQ中裸机开发和Linux开发有什么区别?

ZYNQ架构特征 从高层次的角度去看,Zynq架构包含PS和PL两部分以及之间的互连线。如图2.3所示。互联遵循AXI标准,AXI标准是Arm开发的片上通信技术标准。将PS和P...

OpenFPGA的博客 6522

嵌入式Linux驱动开发整体框架

文章目录Linux根目录说明文件类型说明嵌入式Linux驱动开发总结一、环境的搭建交叉编译工具链交叉编译工具链是干嘛的?c文件是如何被编译成可执行文件的Linux中设置环境变量二、裸机开发方式回顾一、STC89C51二、STM32三、嵌入式Linux下的开发一、裸机式开发二、库函数式开发三、驱动框架下的开发什么是设备树设备树在Linux系统中的体现Linux内核解析DTB文件四、Linux三巨头一、u-boot如何配置呢?uboot如何启动Linux的二、Linux内核三、根文件系统根文件系统的各个子目录B

weixin_44360592的博客 5063

嵌入式开发六大岗位:从 MCU 裸机到 Linux 内核

MCU 裸机开发:没有操作系统,自己用主循环和中断安排所有工作。MCU-RTOS 应用开发:使用线程和 IPC 编写产品业务,主要调用现成设备接口。MCU 驱动/BSP 开发:操作寄存器、处理中断,让 RTOS 和硬件连接起来。嵌入式 Linux 应用开发:在用户空间编写界面、网络和业务程序。嵌入式 Linux 驱动/BSP 开发:移植 Linux,并让内核识别和控制板上设备。Linux 内核开发:修改调度、内存、文件系统和网络等 Linux 核心机制。

m0_63623453的博客 1787
上一篇: tftp服务器环境搭建-----笔者亲测,可以成功
下一篇: Makefile自动生成工具-----autotools的使用(详细)
memoryjs
博客等级 码龄18年 240粉丝 113原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值