打印
[嵌入式linux]

嵌入式Linux学习,需要懂Linux内核么?

[复制链接]
10062|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
astudent|  楼主 | 2013-1-23 12:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
请问学习嵌入式Linux,需要钻研Linux内核么?不懂或略知Linux内核,可以应付嵌入式Linux的软件开发工作么?实际工作中用到需要修改内核的情况多么?

相关帖子

沙发
astudent|  楼主 | 2013-1-23 14:39 | 只看该作者
这个版块太冷清了!

使用特权

评论回复
板凳
astudent|  楼主 | 2013-1-23 16:38 | 只看该作者
转:与一线Linux嵌入式开发工程师的对话

陈工程师一直做Linux的嵌入式开发,作为在开发一线的工程师,他对很多问题的看法可能更切合实际需求,于是,通过邮件,就嵌入式开发方面的问题,请他谈了一下自己的看法:       问:关于嵌入式开发,我们准备给同学们讲解一些入门知识,从你一线开发经验来说,给我们一些建议:
         陈工回答:
        对于嵌入式Linux入门,如果有一定基础,可以从驱动开始;如果没有基础,我个人建议还是从应用程序开始。因为从应用程序开始是最容易的,也是 最直观的。而驱动程序运行在内核态,驱动本身的结构就比较复杂,如果要彻底弄明白驱动的运行机制,必定牵涉内核,对于高年级的学生恐怕问题会少一些,而 对于低年级的学生,问题估计较多。我曾经遇到过一些初学者,就是一入门就栽了,失去了信心,当然这只是少数。不过,如果在遇到问题之后,能够得到即时、 正确的点化,那就是好事了。
       既然您决定讲驱动,那就从内核模块开始。在PC上就可以进行的虚拟设备实验,如基于内存的内核模块。可以考虑从模块的结构、编译、插入、卸载等方 面进行阐述。
        驱动模块无非分字符驱动、块设备驱动和网络驱动三大类。但是一定要让学生知道,任何一个系统,特别是嵌入式系统,并且在目前的嵌入式Linux产品 开发中,最简单、最重要、最多、最复杂的也是字符设备驱动,从IO驱动到串口驱动、到USB驱动等等,广义上都是字符驱动。让学生最好专注于字符设备驱 动,因为一个嵌入式设备,网卡一般一块,FLASH一般也是一块(也包括几块组成的FLASH组),但是这两方面,基本都有完善的驱动,如网卡驱动有很 多,块设备驱动,硬件层已经有通用接口,不管是NOR FLASH还是NAND FLASH,文件系统层更是有了非常多、非常成熟的文件系统,如 JFFS2、YAFFS、YAFFS2、EXT2、EXT3、ROMFS、CRAMFS等等,无需我们再去研究,学会应用即可。而除此之外的其它设备, 如AD、DA、CAN、RS485等等,都是需要根据应用来进行设计的,这才是一个产品区别于其它产品的重点,更是市场价值增值点。
      另外呢,也是前一点引申为而来的,学习Linux,准备做产品的话,不要把Linux当成了终极目标(当然,这是对应用而言的),要有只是把 Linux当成一个平台的思想。更重要的还在各种产品所需求的专业技术,如通信方面像CAN、RS485、GPRS等等,或者工业控制方面,IO控制、 实时特性等等。Linxu博大精深,研究起来永无止境,但是在产品中,只要到了一个产品够用就可以了(当然,多一些更好,要视人而定)。
       问:嵌入式应用程序的开发,应用场景较多的是图形界面还是字符界面,如果是图形界面,开发环境QT和Minigui哪一种更合适,哪种类型的应用程序在嵌入式系统中应用比较多?
       陈工回答:
       对于嵌入式Linux的应用,大多数的应用并不需要图形界面,比如交换机、路由器、嵌入式网关以及服务器等等。图形界面呢,主要应用在多媒体、手机等手持设备和一些需要图形界面的人机交互系统。
       嵌入式Linux可选图形界面很多,上网找找的话,可以发现远非我们常说的QT、MiniGUI等。包括Tiny-X,matchbox、OPIE、GPE等等。不同GUI有自己的特色,有自己的特殊应用场合,对于产品开发,根据需要选择合适的GUI。对于学习,自然是选择容易得到、容易开发的GUI。QT是一个不错的选择,由于QT有一个PC上的模拟器,可以在没有实际液晶LCD的情况下,甚至在没有任何硬件的情况下都可以在PC上进行模拟开发。QT是收费的,当然,有免费版可用。MiniGUI呢,纯粹国产的,支持国货,可以考虑选择MiniGUI。这是一个轻量级的嵌入式GUI,可以跨平台,学习版也才100多块。MiniGUI可以用于工业控制场合,QT在这方面的应用目前还没有遇到,主要用在手持设备。
       我们在开发中采用Tiny-X,这也是一个可以用于工业控制的GUI,基本兼容X-Window,体积小,占用资源少,速度快,稳定。
       对于Linux的应用程序开发,除了GUI程序之外,最基本的应用程序有:
     (1)串口编程。无论是在Windows下还是Linux下,串口编程都是极为复杂的,但是非常锻炼一个人的编程水平和能力。
     (2)网络编程以及WEB相关编程。网络编程的tcp、udp、tcp/ip等。至于WEB编程,主要是在系统开启一个WEB服务器,制作一些网页,通过远程登录能够对整个系统进行配置甚至升级等功能。比如我们的路由器配置网页。这种应用在以后会越来越广泛。
      (3)另外一个就是Shell编程了。Shell的作用我想,*NIX世界的人都很清楚。在很多应用里面,通过一些非常富有技巧性的Shell脚本,实现了非常复杂的功能,包括远程系统升级等。
       以上我提到的这3方面,非常易于实验,在没有硬件,只有PC的情况都可以做。
       学生电脑安装ubuntu,那以后配置嵌入式Linux开发环境可能遇到的问题会多一点。不过没关系,能够解决的。在我个人看来ubuntu适合于家用、办公,但要用于开发,配置难度稍微大一点。不过没有办法,现在电脑硬件太新,最适合的RedHat 9.0无法安装。

使用特权

评论回复
地板
astudent|  楼主 | 2013-1-23 16:46 | 只看该作者
5
jlass| | 2013-1-23 17:17 | 只看该作者
略知即可

使用特权

评论回复
6
astudent|  楼主 | 2013-1-23 19:36 | 只看该作者
开源路由器第三方固件 OpenWrt
分享到 新浪微博腾讯微博已用    +1 收藏+38
参加 OSC 应用开发大赛,拿 Nexus 4 手机 »

1. 关于 OpenWrt
当Linksys 释放 WRT54G/GS 的源码后,网上出现了很多不同版本的 Firmware 去增强原有的功能。大多数的 Firmware 都是99%使用 Linksys的源码,只有1%是加上去的,每一种 Firmware 都是针对特定的市场而设计,这样做有2个缺点,第一个是难以集合各版本Firmware的长处,第二个是这版本距离 Linux 正式发行版越来越远。
OpenWrt 选择了另一条路,它从零开始,一点一点的把各软件加入去,使其接近 Linksys 版 Firmware的功能,而OpenWrt 的成功之处是它的文件系统是可写的,开发者无需在每一次修改后重新编译,另它更像一个小型的 Linux 电脑系统,也加快了开发速度。
2. 为什么使用 OpenWrt
因为 Linux 为我们提供了很多免费的软件,我们可以用一个很低的价钱购买像WRT54G的硬件,做成一个小型的 Linux 系统,现在OpenWrt已经提供了100多个已编译好的软件,而且数量还在不断增加,而 OpenWrt SDK 更简化了开发软件的工序
3. OpenWrt 的历史
OpenWrt 项目由 2004 年 1 月开始, 第一个版本是基于 Linksys 提供的 GPL 源码及 uclibc 中的 buildroot 项目, 这个版本称为 “stable” 版, 在网上至今仍有很多项目使用这个版本, 较为有名 Freifunk-Firmware 和 Sip@Home.
到了2005年初, 一些新的开发人员加入了这项目, 几个月后他们释出了第一个 “experimental” 版本, 这和以前版本不同的是, 这版本差不多完全舍弃了 Linksys 的 GPL 源码, 使用了 buildroot2 作为核心技术, 将 OpenWrt 完全模块化,OpenWrt 使用 Linux 正式发行的核心源码(2.4.30),加上了一些补丁和网络驱动,开发队伍更为OpenWrt添加了许多免费的工具,你可以直拉把Image写入 Flash (mtd)里面,设定无线功能和VLAN交换功能,这个版本名为“White Russian”,而1.0版本大概于2005年底公布。
4. 为什么是OpenWrt?
Linksys WRT54G 是一个几乎在任何电脑商场都可以买到的无线路由器, 只需拿出4-5百元, 你就可以拥有一个配备 200MHz CPU, 4MB Flash, 16MB Ram的嵌入式开发系统, 而且在你完成你的开发后, 你还可以应用在生活上, 一点都不浪费。由于它使用 Linux 作为操作系统, 并公开源码及驱动, 在网络上已有很多为它而设计的开源项目, 包括HyperWRT, OpenWRT, SIP Phone等等, 实在是学习嵌入式 Linux 的入门级首选。为什么学习OpenWRT?你不需要对 MIPS 处理器有很深入的了解, 也不用懂得如何去设计一个 MIPS 处理器专用的内核, 因为这些在网上已有人为你做好, 你只需懂得如何安装和使用就行了, 不过你也可以去http://www.linux-mips.org 找到相关的资料。如果你对 Linux 系统有一定的认识, 并想学习或接触嵌入式 Linux 的话, OpenWRT很适合你, 你将学会一些无线路由器的基本知识, 以及一般嵌入式 Linux 的开发过程, 你会发现无论是 ARM, PowerPC 或 MIPS 的处理器, 都必需经过以下的开发过程:1. 创建 Linux 交叉编译环境2. 建立 Bootloader3. 移植 Linux 内核4. 建立 Rootfs (根文件系统)5. 安装驱动程序6. 安装软件7. 调试随着 Linux 的成熟, 大量不同的处理器内核和应用软件相继出现, 当你熟悉这些嵚入式 Linux 的基本开发流程后, 你不再局限于 MIPS 处理器和无线路由器, 你可以尝试在其它处理器, 或者非无线路由器的系统移植嵌入式 Linux, 定制合适自己的应用软件, 并建立一个完整的嵌入式产品。

使用特权

评论回复
7
dong_abc| | 2013-1-23 20:11 | 只看该作者
感觉真扯淡,学一下不就知道了:@

使用特权

评论回复
8
2012asdf| | 2013-1-23 21:13 | 只看该作者

使用特权

评论回复
9
astudent|  楼主 | 2013-1-24 09:05 | 只看该作者
还没有时间学,先听一下大家的意见。

使用特权

评论回复
10
astudent|  楼主 | 2013-1-26 14:06 | 只看该作者
嵌入式系统驱动程序的编写和Linux内核的裁剪

设计采用Linux操作系统作为操作平台。从Linux系统发展的过程来看,Linux从最开始就是一个开放的系统,并且遵循着源代码开放的原则,它是一个稳定的网络操作系统,作为嵌入式系统有如下优势。

(1) Linux的源码开放性允许任何人可以修改它的源代码。这样可以降低开发的成本,另一方面可以提高开发成本。

(2) Linux支持X86、arm、MIPS、SH等多种体系结构,并且已经移植到多种硬件平台。

(3)Linux有独特的内核模块机制,它可以根据用户需要,实时的将某模块插入到内核或者从内核中移走。

(4)linux系统内核精简、高效和稳定,能够充分发挥硬件功能,因此比其他操作系统运行更高效率。

(5)Linux是首先支持TCP/IP协议栈的操作系统,它的内核在网络方面非常的完。

因为嵌入式开发的目标环境针对特定的操作系统,因此采用宿主机/目标机的方式,在PC机上装Linux操作系统,建立交叉编译环境arm-gcc。然后为设计系统硬件编写特定驱动程序,主要包括显示模块和串口通讯模块的驱动功能。

2.1液晶显示模块完成人机友好界面的数据驱动,对图形具有显示能力,设计中采用模块化的方法设计驱动程序。液晶显示驱动程序设计的内容如下:

(1)首先对驱动程序管理的硬件进行必要的初试化。

(2)初始化设备相关的参数。

(3)在内核中注册设备。其中涉及到重要的结构体为:static struct fb_ops s3c2410fb_ops;

(4)其他的初始化工作。int __init s3c2410fb_init(void);int __init s3c2410fb_setup(char *options)。

2.2串口通讯完成主控芯片发送数据和命令给从芯片,使从芯片完成端口的波形输出,通过输出的波形控制大功率设备的功率。同时大功率设备通过测量电路反馈实际功率给从芯片,从芯片通过串口发送数据给主控芯片显示正确的功率数据,方便用户查看。串口驱动的设计内容:

(1)初始化串口相关的硬件设备。涉及到重要的结构体为:

static struct tty_driver normal, callout;

static struct tty_struct *s3c2410_table[UART_NR];

static struct termios *s3c2410_termios[UART_NR];

static struct *s3c2410_termios_locked[UART_NR]。

(2)注册中断服务程序。接受中断服务程序:

static void s3c2410uart_rx_interrupt(int irq, void *dev_id,,struct pt_regs *regs);

发送中断服务程序:

static void s3c2410uart_tx_interrupt(int irq, void *dev_id, ,struct pt_regs *reg);

(3)在内核中注册设备。uart_register_driver(&s3c2410_reg)。

(4)设备的加载和卸载。module_init(s3c2410uart_init);module_init(s3c2410uart_init)。

设计好硬件驱动程序后,为控制主芯片裁剪Linux内核以适合控制设备的需要。进入PC机Linux操作系统,进入ViVi原代码目录,执行“make menuconfig”命令开始配置内核。配置完毕以后再执行“make”命令便宜ViVi。将ViVi的映像文件通过JTAG烧写到设计好的硬件电路板中。

进入Linux内核文件中执行“make menuconfig”命令开始配置Linux内核文件,选上要使用的驱动选项并根据电路板实际芯片模块配置内核,最后使用“make”命令编译内核文件。如果编译出问题需要修改内核文件。编译成功以后通过串口将生成的映像文件下载到电路板中。之后ViVi 就可以启动下载好的内核文件。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

41

主题

510

帖子

0

粉丝