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

嵌入式ARM+ Linux(uC Linux))分为两个部分:硬件和软件。(就这两个方面而言,这两者有何侧重点吗?开发时需要注意哪些方面呢?)

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

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的编写,修改起了很大的作用),uC Linux的移植我自己也做过一些,此外对 Linux中的中断,网络部分进行了一定深度的研究

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

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

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

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

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



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

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

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

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值