关于如何继续深入学习arm+linux(转)

来源:互联网 发布:遗传算法 图形分割 编辑:程序博客网 时间:2024/05/16 04:11
嵌入式ARM+Linux(uCLinux))分为两个部分:硬件和软件。(就这两个方面而言,这两者有何侧重点吗?开发时需要注意哪些方面呢?)

一. 软件
1. bootloader
1) 可以基于ADS和GCC来编写,编译等。(这两者除了在使用汇编和编译器上有所不同之外,还有什么不同呢?哪个是侧重点呢?)
2) 在引导进入C语言的main()函数的时候,上面两个方面有何不同?其中ads是通过它的库函数来实现的,那用gcc开发呢?
3) 编写bootloader的时候主要是要符合初始化的顺序,那除了这一点,其它还需要注意些什么?在写bootloader的时候应该把重点放在哪里(还是初始化的过程,还是一些驱动的修改)?
4) 对于ARM处理器的各种模式,我应该如何去理解?怎么样才能在实战中使用呢?就比如ARM处理器提供了fiq模式,在uCLinux内核中就根本没有去利用到这种模式,那它究竟有什么用途,我们如何去使用呢 ,难道是了解一下,就可以了?

2. 交叉编译器
1)就ARM平台而言,ARM7(一般不带MMU)和ARM9(基本上都带MMU)两种,随之而来就会有了两种编译器ARM-elf和ARM-Linux,其中ARM-elf是线程的有编译好的,而ARM-Linux是需要自己编译的,那对于一个软件开发人员而言,这个方面我们应该达到什么要求呢?

3. 内核相关
1)2.4和2.6内核的区别(主要是内核的使用和驱动的开发上有何区别?)
2)内核的移植,主要是针对于ARM处理器的板级移植,芯片级移植,这方面有哪些工作需要做呢?在移植的过程中需要注意什么呢?
3)内核编译,在内核编译中看到那么多选项,我如何是好呢?对于编译过程中产生的错误,我应该通过何种途径去解决呢?
4)内核开发,当应用时,可能需要去修改内核来实现自己的应用,那修改内核有没有一个什么准则?哪些方面是突破点呢(从哪里入手,从里到外?从外到内?)?

4. 驱动
1) 正如上面提到的,在2.4和2.6的内核下开发驱动有和不同?在ARM7和ARM9上开发驱动有何不同(在ARM9上好像需要用内存映射访问?)?
2) 在开发驱动的时候,各个外围设备是否有相同的地方和不同的地方?当你学会一种设备的驱动的时候,再写其它设备的驱动需要注意什么呢?哪些方面是和处理器相关的呢?

5. 应用程序
1) 应用程序的开发,应用程序可以自己重新编写,对于网上已有的,还可以下载下来重新编译生成,在这两者的开发时,需要注意些什么呢?就比如,从网上下载源代码后,需要通过配置,编译就可以了吗(其它呢)?
2) 应用程序的移植编译,对于其它平台的软件要移植到Linux平台上,应该如何开发呢?就比如windows平台上用vc编写的软件,如何快速地移植到Linux平台上呢?

6. 其它
1)各种软件开发工具的使用,推荐

二. 硬件
1. 硬件选型
1) 处理器的选型,就比如ARM处理器如何选型呢
2) 外围设备选型

2. 原理图设计
1) 原理图设计的步骤,注意事项(比如功率是否够,电流是否够?哪些地方需要加上拉电阻等等)
2) 设计原理图时,哪些方面是要先测试验证的呢?

3. PCB设计
1) PCB设计的步骤,注意事项(如何减少串扰,反射等等)
2) 对于高速PCB设计有何不同?
3) 哪些基础知识是必须的(比如各种封装的使用等等)

4. EMC
1) 如何减少电磁干扰等等

5. 其它
1)各种硬件开发工具的使用,推荐




其实,我也一直在思考这个问题,相信这也是很多搞Linux+ARM 嵌入式开发2,3年的人的普遍的问题。
我也才工作3年多 , 大家一起交流。


我觉得ARM+Linux最核心的东西就是kernel , 其他的东西,都是辅助的。

比如我一直是在看Linux kernel 的代码, 但是人是有惰性的, 一个人不可能天天都看Linux kernel ,再加上认得兴趣和爱好的转移 ,或者是工作的安排, 使得看Linux kernel是一个漫长的过程。

所以我觉得 你的工作就为你 分析kernel提供了一个平台, 比如工作中, 应用程序出现了signal丢失的问题, 那么你就去看 signal的实现 ; 如果要移植miniPCI的网卡驱动,就要利用你的工作热情详细的分析一下PCI到底再kernel中是怎么实现的(当然是下班时间看了, 上班还是要讲究效率,否则老大会骂得) ;
所以,应该就工作中遇到的问题,马上就看kernel代码, 这样2年的时间, kernel应该就分析的一半了吧。 解决问题不是主要的,最主要的,看看问题的实质,以及整个来龙去脉。

--
最后 ,还要看个人兴趣了, 你要是成为一个通才, 还是一个专才了 。 我个人是比较倾向于成为一个专才,人的经历是有限(这个相信成家了的程序员应该很有体会) , 所以不可能什么都会。
而且社会的发展方向就是 分工更加细化吗。


>>我觉得ARM+Linux最核心的东西就是kernel , 其他的东西,都是辅助的。

应用为王,你光一个内核拿出去,谁买你的?

最终客户买你的东西,不是因为你的操作系统内核多么优秀,主要是看内核上跑的其他软件。


edisonlive4u
(journeyman)
06-11-28 18:10
        
Re: 关于如何继续深入学习ARM+Linux? [re: bob2004] 
Reply to this postReply

很感谢你的回复,那我是不是可以这样理解你的话呢。"在工作中学习,根据手上的实际项目来深入,而不要单纯为了学习而学习",那我是不是可以有一些针对性的研究,为以后的工作加一些筹码。

Post Extras: Print Post   Remind Me!   Email Post   Notify Moderator
h_falls
(addict)
06-11-29 00:12
       
Re: 关于如何继续深入学习ARM+Linux? [re: bob2004] 
Reply to this postReply

>>我觉得ARM+Linux最核心的东西就是kernel , 其他的东西,都是辅助的。

应用为王,你光一个内核拿出去,谁买你的?

最终客户买你的东西,不是因为你的操作系统内核多么优秀,主要是看内核上跑的其他软件。

Post Extras: Print Post   Remind Me!   Email Post   Notify Moderator
bob2004
(member)
06-11-29 13:24
       
Re: 关于如何继续深入学习ARM+Linux? [re: h_falls] 
Reply to this postReply

显然,h_falls 误会了我的意思, 我们现在谈论的个人发展的问题,核心是对于一个搞ARM+Linux开发的程序员应该侧重的问题 , 而不是如何作产品 。

既然说道作产品, 可能大家都觉得是作kernel重要呢, 还是作产品重要呢?

我觉得对公司来讲, 当然是产品重要了, 如果一个人喜欢搞这方面的东西, 大可以搞搞 C 上层开发, Java就最合适了。 一般客户懂什么? 他们只知道界面友不友好, 操作起来简单不简单 + 价格低廉。

对个人来讲 , 当然是核心的东西最重要了, 了解最核心的东西, 在公司中你也才可以利于不败之地吗! 什么是核心? 显然是kernel ,以及网络协议(对公司)

>>应用为王,你光一个内核拿出去,谁买你的?
>>最终客户买你的东西,不是因为你的操作系统内核多么优秀,主要是看内核上跑的其他软件。
kernel 从哪里来, kernel也不是就可以白拿来的, 比如MontaVista , 为什么很多搞嵌入式开发的公司都买她的 , 显然是他的kernel以及配套的相关的开发包及工具比较多吗, 谁是客户? 客户就是你啊 。你不看kernel看什么?
除非kernel是你自己从网上download下来的。

Edited by bob2004 (06-11-29 13:29)

Post Extras: Print Post   Remind Me!   Email Post   Notify Moderator
edisonlive4u
(journeyman)
06-12-07 17:34
       
Re: 关于如何继续深入学习ARM+Linux? [re: edisonlive4u]    
Reply to this postReply

 


Post Extras: Print Post   Remind Me!   Email Post   Notify Moderator
urapple
(newbie)
06-12-13 16:24
       
Re: 关于如何继续深入学习ARM+Linux? [re: edisonlive4u]    
Reply to this postReply

你懂得太多了,不知在收入上有没有反映。
不要被技术蒙住了眼睛,不要被老板带上了歧路。
技术狂人排除在外。。。。。。

Post Extras: Print Post   Remind Me!   Email Post   Notify Moderator
patrick_zhg
(stranger)
06-12-13 17:38
       
Re: 关于如何继续深入学习ARM+Linux? [re: urapple] 
Reply to this postReply

看到这个帖子,留下一些想法吧。
嵌入式这一块,目前大部分公司基本上是硬件设计人员占主导,软件人员为辅。
在具体项目开始前,软硬件人员会一起协调,软件人员根据需求提出对硬件系统的
要求,比如处理器主频,ROM/FLASH/SDRAM空间等?硬件人员结合软件人员提出的要求进行
硬件选型。如果硬件设计人员很熟悉当前项目的需求,对软件这一块也非常熟悉,也可能会直接进行硬件选型。因此嵌入式软件人员懂一些硬件知识是必要的。不管是单片机系统,还是dsp系统,甚或ARM、PPC等系统。这一部分大体属于EE人员需要完成的事情。
bootloader和嵌入式系统的移植有可能由硬件人员来完成,也有可能由软件人员来完成,更多得是软硬件人员协同完成,硬件人员完成的好处是熟悉硬件电路设计,不足之处是很多代码不够规范,软件人员来完成的话就需要去看懂硬件电路,更多时候需要硬件人员的帮助,当然好处就是代码规范。这一块大体就是市场上所谓的  Firmware Engineer。
单纯的驱动开发人员功能专一,除了需要懂一些硬件之外,还要会使用各种调试仪器,当然对内核编程也需要非常熟悉。一般来说,驱动人员由于功能单一,很难上升到Leader这样的高度。:-), 这一块显然就是Device Driver Developer了。
最后讲一下应用层设计,应用层设计有简单有复杂,单纯的编码人员不用关心整个应用层的架构,但作为一个软件设计人员,必须懂得软件的架构设计。

嵌入式系统需要考虑性能、可靠性、成本、体积和功耗,上述几方面的某一步的不足都极有可能影响最终的结果。

Post Extras: Print Post   Remind Me!   Email Post   Notify Moderator
chunhui_true
(old hand)
06-12-13 17:45
       
Re: 关于如何继续深入学习ARM+Linux? [re: bob2004] 
Reply to this postReply

我也工作2年多了。但是从事的不是内核或驱动。是应用层的。相对简单些。
现在也比较迷茫,想整点高级的,不知道如何入手。书看了不少,实践上手的经验还是不足。
正郁闷着呢。。。。
各位也给我点提示吧。

Post Extras: Print Post   Remind Me!   Email Post   Notify Moderator
VxWorksModerator
(Carpal Tunnel)
06-12-13 18:22
       
Re: 关于如何继续深入学习ARM+Linux? [re: chunhui_true]    
Reply to this postReply

我一直很想画块板子跑leon3。。。
http://www.gaisler.com/cms4_5_3/index.php?option=com_content&task=view&id=13&Itemid=53

可是现在养家糊口,不容得有太多时间折腾这些。。

完,我跑题了^_^

Edited by VxWorks (06-12-13 18:23)

Post Extras: Print Post   Remind Me!   Email Post   Notify Moderator
bob2004
(member)
06-12-13 18:38
       
Re: 关于如何继续深入学习ARM+Linux? [re: edisonlive4u]    
Reply to this postReply

从你的帖子来看, 你做过得东西真是蛮多的, 但是似乎太过于杂了。

一个人怎么可能精通那么多呢?

其他的我不懂 , 就单从kernel这块来看, 你要想突破, 可以从driver 或这网络这块作为突破口(我看你对硬件看来了解不少,那就从driver吧) ,
然后, 看进程管理(这部分与硬件无关,适合对硬件了解少的人)

接下来就是加深的地方了。
适当的看看文件系统 ,因为这个地方涉及的地方实在太多了, 比如进程管理, 尤其是内存管理(涉及swap方面) ,而且文件系统的东西比较烦杂, 考验一个人的耐力。

最后, 就看内存管理了, 有了文件系统方面的知识(尤其是swap方面,还有进程方面的知识) , 就可以看看内存管理了。

我现在正在看内存管理 。。。 为什么要看呢? 有这个需求,因为我们的ARM板子内存32M , 现在运行 ntfs-3g 来mount NTFS文件系统,不能mount 超过3个NTFS分区, 否则就会有 两个ntfs-3g进程被killed掉, 只能留一个 。这个是跟oom_kill.c 有关的。 原因就是 ,每个系统的内存是有限的 , 每个内存管理部分必须保证系统有一个内存的下限(比如1M,举个例子,这个叫threshhold ),如果系统剩余内存低于这个value , 内存管理系统就会释放内存到交换分区上去,如果不成功,而内存管理系统又无法用其他的方式释放内存(物理页框) , 那么kernel就会kill掉一些进程,强制释放内存,以确保系统的正常运行。


之所以举上面的这个例子, 只是说明 看kernel不能盲目的看, 因为那样只会看了就忘了, 没有什么印象。 带着一个疑问 ,看,自然就有目的性。 而且不能全看, 全看就更没有目的了, 而且脑子很容易疼 。 我现在就这个状态,, 咳!。。。。

大家多交流。



Post Extras: Print Post   Remind Me!   Email Post   Notify Moderator
chunhui_true
(old hand)
06-12-13 18:50
       
Re: 关于如何继续深入学习ARM+Linux? [re: bob2004] 
Reply to this postReply

我虽然啥也没看过,但是我也觉得网络和驱动最实用!

Post Extras: Print Post   Remind Me!   Email Post   Notify Moderator
bob2004
(member)
06-12-13 18:59
       
Re: 关于如何继续深入学习ARM+Linux? [re: chunhui_true]    
Reply to this postReply

>>网络和驱动最实用
这话说得太对了。 目前来看 ,在一个网络公司里面,这两个最实用了。也最赚钱了。
因为Linux就一个, 可是那么的不断冒出来的硬件,都需要别人写driver啊。
文件系统也就那么几个,而且都那么成熟,但是谁说我们不可以造一个新轮子(如果单从锻炼自己的角度)


声明在先 ,只是谈自己的一点看法,没有攻击的意思啊, 呵呵 。

但是话说过来, driver是什么?充其量不过是利用kernel里面现成的函数,来完成对硬件的控制而已。 在很大的程度上,只要你掌握了,kernel的API的用法也就可以了 + 会看datasheet

所以从这个角度来说 , 写driver的人 和 搞应用开发的程序员没有什么差别,都是利用现成的函数和系统调用。 属于应用级别了。 只要在这个职位,经常写 , 再加上感兴趣,应该对每个人都不是问题吧? 关键在中国,这样的职位,都不是很多啊。


分析内存管理和进程管理的意义在于 :如何分析问题 , 如何优化问题,如何更好的解决问题,
只有更好的理解了kernel的运行机制, 才能更好的去用它。

Edited by bob2004 (06-12-13 19:04)

Post Extras: Print Post   Remind Me!   Email Post   Notify Moderator
wang_7905
(enthusiast)
06-12-14 10:46
       
Re: 关于如何继续深入学习ARM+Linux? [re: urapple] 
Reply to this postReply

你说的还是非常有道理的,这也就叫做技术最大利益化吧^_^!

但是从技术角度来看,再不影响利益的时候,还是应该沉下心多学习一点东西,我从windows下过度过来也有一年多了,也移植过几个系统了,写了一些驱动,但是内核里面的东西真的有很多不清楚的。每次看的个晕头转向,好像明白了一点点,但是始终不能将它们串起来理解,继续吧!!!





QUOTE:
我主要做过bootloder的修改,Linux系统的编译,驱动程序的编写,应用程序的编写,移植等等。

如果只是做过,那么并不能说明什么。如果是非常熟悉,那我估计Linux你不需要在掌握什么了。

QUOTE:
其中,我还学习了一些ARM体系结构,ARM编程的东西(这些对bootloader的编写,修改起了很大的作用),uCLinux的移植我自己也做过一些,此外对Linux中的中断,网络部分进行了一定深度的研究

CPU的体系,ARM和其他的CPU虽然有区别,但是熟悉一种,其他的也不难学。
网络方面的东西实在太多了,随便一个都够我们研究几个月的。

QUOTE:
就比如硬件和软件方面,哪些还需要加强,哪些是以后的工作重点呢?

硬件?这个和Linux关系不大吧,呵呵。
软件方面?关于软件的体系、结构方面你可以在深入一些。

其实,这些都属于嵌入式的范畴,而这里面就包含了硬件的部分,而作为一个底层的,系统软件设计人员应该在硬件上做到什么程度呢?

如果一个驱动开发人员,他不懂硬件(包括数字电路和模拟电路),那怎么可能能写好程序呢?



当然大的学习原则是有的: 先基础, 后专深, 呵呵, 这你肯定知道

一个驱动开发人员,需要用到的数字和模拟电路知识比较少,只要能正确理解硬件的DataSheet就基本足够了。

我认为嵌入式开发包括硬件,但是嵌入式软件开发并不一定要去理解硬件电路。

要说硬件想提高,那就要有机会设计硬件电路,了解硬件的工作和能够写驱动,并不是真正意义上的硬件。

QUOTE:
引用第4楼edisontang于2006-11-28 17:35发表的“”:
呵呵,那作为一个底层的,系统软件设计人员在平时应该多注意一些什么呢?哪些是我需要加强的呢?有没有一个学习线路图呢?

底层软件开发人员, 及所有的程序员,
若想作好软件设计[良好的结构和移植性], 能适应新项目的变化
最重要的是要理解基本概念[如操作系统], 掌握设计原则[如接口分层],
第二是经验的积累. 在实践的经验比书本知识更可贵, 可极大提高后续工作和学习效率
第三是关注新的软件技术,提高自己对软件设计的理解

一个完善固定的学习线路图应该是很难确定的
一是因人而异
二是技术进步很快
  现在大多时兴Motorala手机都嵌入了Linux, 约300MHzCPU, 几十M内存, 上G的存储卡
  对照我们现在的所做工作, 可以方向参考和内容取舍
原创粉丝点击