从裸机编程到嵌入式Linux编程思想的转变------分而治之:驱动和应用程序
来源:互联网 发布:在安卓手机上编程 编辑:程序博客网 时间:2024/05/20 18:50
转自:http://blog.csdn.net/memoryjs/article/details/7844260
笔者学习嵌入式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了,因为驱动层可以直接对硬件操作,让输出高电平和低电平。
驱动的操作就比较复杂了,这里只能简单讲下概念了,因为这时已经是Linux设备驱动开发的内容了。
关于Linux设备驱动的总结文章,会在以后再写,建议大家可以看看国嵌的Linux视频,在电驴上资源很多,很多关于设备驱动开发的视频,搜的时候关键字为:嵌入式Linux
这篇文章的主要目的是让大家思想上从51形式的编程转变到嵌入式Linux编程思想,希望大家能转变过来思想,踏入嵌入式Linux之门!
- 从裸机编程到嵌入式Linux编程思想的转变------分而治之:驱动和应用程序
- 从裸机编程到嵌入式Linux编程思想的转变------分而治之:驱动和应用程序
- 002_<ARM9从裸机到Linux操作系统>____裸机篇__S3C2440的GPIO编程
- 003_<ARM9从裸机到Linux操作系统>____裸机篇__S3C2440的UART编程
- 从Cortex-M0编程方法到ARM9编程方法思想转变------定义命令
- Scala 编程中分而治之的思想 (divide and conquer)
- 从Windows到Linux的转变
- linux iic驱动编程之一 基本的编程思想
- 转:从《The C Programming Language》中学到的那些编程风格和设计思想
- 转:从《The C Programming Language》中学到的那些编程风格和设计思想
- Linux驱动体现的编程思想---面向对象的编程思想
- Linux内核编程 -- 从HelloWord到基于NetFilter的Linux驱动Demo
- mini2440裸机编程--------LCD驱动
- mini2440裸机编程--------触摸屏驱动
- 嵌入式裸机编程,对内存管理的一些见解
- 2. 接触嵌入式linux 应用程序编程
- 直到QQ秀的尝试成功。公司从技术工程师主导思想,转变到 产品经理 主导思想。谁有了入口,谁就有话语权和资源配置权。
- 嵌入式Linux设备驱动编程(1):基础
- 了解Android中路径问题
- 同步静态和非静态同步的区别
- 二叉树链表的前,中,后序遍历
- Python:函数
- 11.2 对数组归并排序
- 从裸机编程到嵌入式Linux编程思想的转变------分而治之:驱动和应用程序
- POJ2155:Matrix(二维树状数组,经典)
- 与linux相处的日子里
- tableWidget用法
- 黑马程序员---oc类的深入研究!
- 屏幕适配的理解
- iOS9地图增公共交通导航功能 中国300个城市可用
- 找到突破的点——认识自己
- NSPredicate谓词(过滤)