`
aijuans
  • 浏览: 1569141 次
社区版块
存档分类
最新评论

从裸机编程到嵌入式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);
}

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

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

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

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

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

1
1
分享到:
评论

相关推荐

    大整数相乘问题--分而治之

    2. 快速乘法:结合位操作和分而治之的思想,可以进一步优化算法,如Booth算法、Kogge-Stone算法等,它们在特定条件下可以达到更快的速度。 四、应用实例 1. 数字签名:在RSA公钥加密系统中,大整数的乘法和因数分解...

    C++入门课件 老师发的 入门级

    通过以上分析可以看出,从传统的结构化程序设计过渡到面向对象程序设计,不仅可以更直观地模拟现实世界中的问题,还可以提高代码的复用性和可维护性。面向对象程序设计的核心在于通过封装、继承和多态等机制来构建...

    频谱数据分析.pptx

    综上所述,频谱数据分析涉及多个环节,从数据的获取到预处理再到聚类分析,每个步骤都至关重要。通过掌握上述技术,可以在各种应用场景中有效地利用频谱资源,推动技术创新与发展。随着技术的不断进步,未来频谱数据...

    程序员编程艺术:面试和算法心得

    ### 知识点总结 #### 一、字符串处理技术 **1.1 旋转字符串** - **题目描述**: 给定一个...以上内容涵盖了从数据结构到算法技巧,再到实际应用案例的各个方面,旨在帮助读者全面理解编程面试和算法设计的核心要点。

    软件工程概论期末必过文档!

    - 现代程序设计技术的应用。 - 结果的清晰性和可审查性。 - 开发团队的精简高效。 - 不断改进软件工程实践。 8. **软件工程知识域**: - 软件需求、设计、构造、测试、维护等。 #### 第二章 软件过程 1. **...

    Hadoop编程思想

    ### Hadoop编程思想 #### Hadoop架构 Hadoop的核心组件包括**Hadoop Distributed File System (HDFS)** 和 **MapReduce**。Hadoop架构主要由以下几个关键部分组成: - **NameNode**: 存储元数据(metadata),如...

    12-6 分而治之-章节总结 (2).mp4

    12-6 分而治之-章节总结 (2).mp4

    android 分而治之 源码

    1. 层次化设计:Android系统由Linux内核层、硬件抽象层、系统库层、应用程序框架层和应用程序层组成,每一层都专注于特定的功能,通过接口与相邻层进行通信,实现了功能的划分和解耦。 2. 组件化服务:Android提供...

    C常用算法程序集-徐士良(源程序)

    尽管在描述中提到了缺少PDF版本,但仅凭提供的源代码,我们依然可以深入研究其中蕴含的编程思想和算法原理。 1. **文件结构分析**: - `readme.txt`:通常包含项目或资源的说明、作者信息、使用指南等内容。 - `...

    基于Hadoop的大数据应用分析.rar

    总结来说,基于Hadoop的大数据应用分析涉及从数据存储、并行计算到实际业务场景的全过程。通过深入理解和运用Hadoop及其生态系统,我们可以应对日益增长的数据挑战,挖掘出隐藏在大数据中的价值,为企业决策和创新...

    软硬件调试九法:分而治之

    文章通过案例分析的形式,说明了在软硬件调试中应用“分而治之”的原则,通过一系列步骤有效地隔离和解决复杂问题。同时,也强调了调试过程中需要保持专注,不要因为追求完美而过度优化已有的良好代码,这可能会分散...

    Linux多核编程

    ### Linux多核编程知识点 #### 实验背景与目标 在多核处理器日益普及的背景下,高效利用多核架构成为提高程序性能的关键因素之一。Linux作为一款功能强大的操作系统,提供了丰富的工具和API支持多核编程。本实验...

    基于C语言的数据结构和编程设计应用研究——评《数据结构和编程设计:应用C语言》(第2版).pdf

    C语言因其高效的性能和广泛的适用性,被广泛应用于操作系统、系统软件和嵌入式系统等领域。书中对C语言的讲解,结合了先进的理论和实际应用,为读者提供了一个全面了解数据结构和程序设计的平台。 杨莉杰的书评还...

    第一门编程语言--希望有所帮助.docx

    初学者在学习编程语言的过程中,应理解和体会编程的核心思想,如: - 分而治之:通过分解复杂问题来简化处理。 - 组件化与模块化:利用模块化设计提高软件的可维护性和复用性。 - 算法思想:运用数学模型设计...

    acm竞赛精讲

    ACM竞赛是一种国际性的计算机编程比赛,主要考察参赛者解决复杂问题的能力以及编程技巧。本文将围绕给定文件中的标题、描述、标签及部分内容进行详细解析,涵盖数学问题、字符串处理、计算几何、数论、图论、排序/...

    常用算法程序集(c语言描述)源代码

    《常用算法程序集(c语言描述)源代码》是学习和研究计算机算法的重要资源,它包含了大量用C语言编写的算法实现。这份资料旨在帮助开发者深入理解各种基础和高级算法,并提供实际编码经验,以提高编程技能和问题解决...

    数学建模算法与程序

    - 描述:动态规划的核心思想是“分而治之”和“记忆化搜索”。 2. **基本概念与基本方程** - 描述:状态转移方程、递推公式等。 - 应用:多阶段决策问题的求解。 3. **逆序解法的计算框图** - 描述:从后向前...

    经典算法 分而治之算法.rar

    综上所述,分而治之算法是一种高效、强大的解决问题的方法,通过分解、解决和合并的步骤,能够解决许多复杂问题,并在实际的编程和算法设计中发挥着重要作用。理解并掌握这一策略,对于提升IT专业人员的算法设计能力...

Global site tag (gtag.js) - Google Analytics