Why JulianTec

学习实干型的工作室

   JulianTec并非纯粹追求商业利益的IT培训机构,她宣传谨慎,天生就立志成为实干家,而非简单的言辞吹嘘者和自我贴金者;

   相比较于经济利益,她更看重能在“久联”中形成一个团队学习进步的团队。

有可信赖的专业能力

   在JulianTec这边,不仅是讲师团队,就连其建立者也是在嵌入式Linux研发行业摸爬滚打多年的资深工程师出身。

   所以,相较于那些由业外人士创办的纯商业IT培训机构而言,她更能保证您的学习效果。

长久接触,终生受益

   短短数月的教学不可能教会您所有知识;SO,我们努力将巨立安打造成一个平台,一个可供您在您的职业生涯中长久与之保持联系,并从中不断受益的平台。

   相教于几个月的天天见面,我们更期待在您结业后能常在这个平台中看到您的身影。

培训和收费都阶段化

   由于不同的培训内容难度不一样,所以在培训时间和上课方式上就应该区别对待;

   因此JulianTec将整个培训周期及收费方式都做了“阶段化”,这不像其他商业培训机构那样眉毛胡子一把抓式的培训和收费。

理论联系实际的培训

   JulianTec的整个培训周期,都是以理论联系实际项目的形式来进行的。

   与其说我们是在教您书本上的具体研发技术,倒不如说是在传授我们自己的切身经验、是在培养你成为一个合格研发工程师的做事习惯和做事方法。

软硬结合的项目实作

   在嵌入式Linux产品的研发中,“软件硬件永远不分家”是一个永远也不用经过证明的公理。

   所以我们不仅会在上课过程中介绍大量的硬件知识,而且也会在项目的实作过程中牵涉进去一些简单电路的设计。

通过JulJob保障就业

   培训完结业后您有机会留下来继续服务于JulianTec,也可以透过JulJob人才职位对接器来找到合适的研发工作。

   在JulJob中有全国范围内众多的创新型研发企业与JulianTec保持着长期的合作。

您碰到难题了么?加入邮件列表向师兄师姐们寻求帮助!

为了帮助大家对嵌入式Linux的学习,JulianTec给大家准备了三个邮件列表。

透过它们,大家不仅能讨论Linux应用程序开发相关的问题,而且能讨论如何在arm上运行嵌Linux系统的问题,也能讨论Linux内核设计策略以及驱动程序开发相关的问题……

您可在这里按年月浏览查看邮件列表中之前的归档记录!

碰到问题,急着向邮件列表post问题了吗?别急,您最好先搜索查看下之前其他同学是否已碰到过类似问题并解决了的,说不定里面就包含您要的答案噢!

课程设置

概况介绍

经历过这么多年的实际研发,我深知一个合格的(嵌入式)Linux平台研发人员需要掌握一些什么样的技能。也正是基于这样的实际经验,为帮助大家进入学习嵌入式Linux的正确轨道,JulianTec提供了一套科学的课程体系。

如右边的内容目录所示,将这些课程按照前后依赖关系,难度等分成三大类: “Linux应用程序开发”,“在ARM架构下运行Linux”以及“Linux内核设备驱动开发”。看过《应用程序,操作系统,驱动程序和硬件》的同学应该有所感觉,这些课程其实大体上就是按照先应用程序,再硬件技术,最后操作系统的思路来设置的。我希望通过这些课程,把自己的切身经验传递给同学们。

这些课程里面,多是学习嵌入式Linux研发必备的,如C程序设计,嵌入式Linux系统构建等;还有一些扩展性的课程,如C++程序设计及UML建模,uCOSII原理及移植等。

虽然业界普遍认为进入嵌入式Linux研发行业的门槛是比较高的(1),但JulianTec的这种课程安排做到了在充分顾及行业需要的同时,也使得具有不同技术背景的人都能从中找到切入点,从而相对比较自然平顺的进入嵌入式Linux开发这个行业。如右面的内容目录所示,扩展性的课程都用‘√’标记出来。因为JulianTec课堂培训时间有限,它们一般都要求同学们在‘久联’中学习。

另外,嵌入式Linux研发对动手能力要求特别高。JulianTec除了在课堂上给大家介绍理论及经验外,还给同学准备了一系列的练习与项目实作。这些练习和项目实作都是经过精心设计的,它们多半具有前后相关性(2)。同学只有独立完成了这些练习和项目,才能够真正的达到学习的目的。同时,为了帮助同学找出课程学习上薄弱的地方,我们还在每个课程结束后安排了相关的课程测验,通过它们,同学自己就可以查漏补缺。

为了能让同学们对JulianTec所上的课程有一个基本的认识,我在这里列出这些课程的相关介绍及内容简要说明,但是列出详细要上哪些内容是没有必要的(3),如果你想知道更多,还请联系我们。有必要说明的是,虽然这里的课程是单独列出来的,但平时上课时绝对不会只讲当时那某一个课程,相互之间进行交叉讨论是经常的事情,这也算是JulianTec的一大特色。

需要特别指出的是,这里的课程设置独具巨立安特色,别的商业培训机构是没有的。不过可想而知,在目前这种社会态势下面,也许很快你就可以在其他的网站上看到雷同的课程设置及说明,希望他们指明出处是不现实的,所以还请同学们注意甄别。其实,毕竟最最重要的不是在网站上列出课程内容,而是怎么样负责任的将这些知识传递给同学们。

*Linux应用程序开发(就业班课程)

“Linux应用程序开发”类课程的主要目的是让同学们掌握Linux环境下应用程序开发的各种理论知识和实战技巧,它们是学习嵌入式Linux的基础之基础。JulianTec在介绍这些课程的同时,会帮大家建立正确的概念,这些概念能帮你往嵌入式开发和Linux内核靠拢。

“Linux应用程序开发”类课程对应整个培训周期的第一阶段,时间约占两个半月。学完之后,同学将具备Linux环境下应用程序开发的能力。对于找Linux应用程序开发之类的工作来说,这已经足够了,但如果你还想继续往完全彻底的嵌入式Linux方向发展,就请看JulianTec为你提供的“在ARM架构下运行Linux”类课程。

1>.C程序设计语言

感谢 Dennis M Ritchie 发明了C语言,正是有了它,才使得今天做嵌入式开发的我们能有如此轻松的日子好过。想想看,如果没有它,我们要为某一个机器(确切的说,是某一种架构的CPU)写程序,就势必哼哧哼哧得从一条条指令开始。。。这其实是梦魇,因为这就如同一定要生活在公元2010年的你,去使用石头,而不是刀去切割食物,就像再回到石器时代那样(4)。所以,你没有理由不去学好它。至于要学哪些内容,也许你已经在学校考过二级,心中早已有数。JulianTec安排此课程的目的是让你象一个优秀的C程序员那样去思考,去写代码。JulianTec会在介绍C语言的同时,介绍很多和嵌入式底层开发相关的一些关键概念。

2>.常用数据结构及算法

其实,任何程序都是由数据和处理这些数据的方法组成的。就像烹饪菜肴一样,食材(数据)和烹饪方法(处理这些食材的方法,诸如煎炒煮炸蒸焗焖炖之类的)两者必不可少。而所谓数据结构就是组织(大量)数据的方法,所谓算法就是处理这些数据的方法。我们会给大家介绍几种常见的数据结构和算法,并让同学通过“测试驱动实践”的方法去掌握它们。

3>.Linux环境下的C应用开发

就目前的就业市场来讲,不管做的Linux研发是嵌入式的,还是非嵌入式的,都会有相当部分的劳动力需求集中在应用程序上面。所以作为“Linux应用程序开发”课程的最重点,它主要介绍Linux操作系统提供给上层应用程序使用的各种编程接口。和其他商业培训机构所不同的是,我们在讲这个课程的同时,也会介绍一些操作系统内核的基本观念,方便你在后续第二/第三阶段的学习。

4>.C++程序设计及UML建模 √

之前用C语言开发应用是面向过程的,但是现今的软件开发领域,用的越来越多的却是面向对象的思想(5)。用面向对象而不是面向过程的思想去开发一个应用总是趋势所在,所以同学们不妨以此作为你嵌入式Linux底层开发之外的第二兴趣。注意C++及UML本身就是难学易用的,为了不至于分散精力而影响我们主要课程的学习,这里把它列为扩展课程。

  对应届同学及无编码经验同学的提示  

其实,第一阶段就是巨立安这边的“就业班”课程,这对于应届的同学或者没有多少编码经验的同学来说是最重要的。因为这一阶段课程的设置完全就是冲着“就业目标”而去的,所以对它们的学习好坏直接影响你是否能入行,及是否能入好行获得一个自己满意的薪水。

目前来看,应用层开发人员还是就业市场上需求最大的一块。归纳来说,巨立安设置这个阶段的目的有两个:
   a,方便大家入好行、就好业。在毕业之后马上能找到对口的研发工作养活自己、养好自己;
   b,方便大家熟练掌握软件编码能力,不至于在后面阶段学习过程中遇到大块系统级代码理解移植过程中出现卡壳的问题。

*在ARM架构下运行Linux

嵌入式Linux开发总是软硬结合的,设置“在ARM架构下运行Linux”类课程的主要目的也可以从这两方面着手来考虑:

学习完这些课程之后,你将知道嵌入式Linux研发中除内核调整移植驱动程序开发之外的大部分知识。届时,同学将成为嵌入式Linux的中级玩家:)。“在ARM架构下运行Linux”类课程对应整个培训周期的第二阶段,时间约占两个月。

1>.ARM架构及S3C2440芯片功能

眼下,ARM架构体系(8)已经在嵌入式系统的市场中占据近90%的市场份额,而以三星S3C2410/2440SOC芯片为典型代表的ARM9系列则又是用的较多的,所以JulianTec会在这个课程中详细介绍该SOC芯片的关键功能模块。在这个课程里,同学们将透过极具JulianTec特色的实验方式掌握它们。

2>.uCOSII RTOS实现原理及移植 √

uCOSII是一个比较简单的实时操作系统,说它为操作系统,是因为它给我们的应用程序提供了多任务的支持。但它不像Linux/Windows那样,给每个任务都提供一个独立的地址空间,也没有内核态和用户态之分,更没有固定的设备模型。JulianTec考虑把它作为进阶课程放在这里,主要原因有二:

但是考虑到我们的进阶课程只有两个月的时间,所以我们这里暂时将它作为扩展课程,待以后有机会再行更改。

3>.嵌入式Linux系统构建

这是“在ARM架构下运行Linux”类课程中的又一个关键课程。学习完这个课程之后,同学将知道嵌入式Linux研发中除内核调整移植和驱动程序开发之外的所有知识,包括Bootload的移植和根文件系统的构建等等。同学学习完这个之后,完全有能力加入企业内嵌入式Linux系统研发团队参与研发了。

  想直接学第二阶段???  

第二阶段的课程是软硬结合的,软硬两部分都会让你学会一个最小系统的搭建,但相比之下,软件部分的工作量还是占大头。

所以尽管我们说那些学电子类等偏硬件专业的同学在学这个阶段的课程时有优势,但是假如自己本身没有太多编码经验的话,我们还是不建议直接着手学这个阶段的课程。因为这个阶段涉及到的系统级软件规模都是比较庞大的,.h/.c 文件数量众多,结构上也相对复杂。假如没有比较好的软件功底,你很容易就会迷失在这样的代码丛林之中。

没有什么编码经验而直接进行第二阶段的学习不会有什么好的效果,反而只会带来太多的挫折感,所以作为过来人,我们建议大家还是先透过第一阶段的学习先打好自己的软件功底再说。

*Linux内核设备驱动开发

这是嵌入式Linux系统开发最核心的部分,也是整个培训周期中最具挑战性的一块,同学需要付出极大的努力和耐心,才能有所成。值得注意的是,这部分的内容不是通过一两个月的培训就能够学会的,它更多的是要依赖于同学们自己的钻研和努力,JulianTec课堂中更多的是介绍基础知识和指导同学的学习。这部分课程对应整个培训周期的第三阶段,占时约一个月,但这部分的课多是放在周末上的,所以实际上应该能达到三四个月的效果。之所以如此安排是因为:

学习完这些课堂知识后,同学即慢慢能从内核代码中自行探究各种问题的答案。

1>.Linux内核剪裁、扩充和移植

Linux操作系统(9)本身能支持众多的处理器硬件架构,但实际上我们只会使用到其中一种(就像我们的板子,里面只有一个ARM架构的处理器)。同时Linux内部充斥着大量的驱动程序,而这些驱动存在的唯一目的是为了驱动我们板子上不存在的那些硬件。所以基于以上两个原因,我们要对Linux内核做裁切,在源代码级别,去掉对无用CPU架构及无关硬件外设的支持;

另外,你也可能决定使用一种尚未并入内核的全新的文件系统,这个时候又需要你把对这种文件系统的支持扩充到Linux内核里面。更进一步,如果你以后的老板决定在新产品中使用全新的处理器架构或者使用一款一个礼拜前刚上市的ARM架构芯片,这个时候你又得努力做Linux内核的移植。

相较之前老版本的内核,对2.6内核进行所有这些调整都变得相对简单,但是你总得静下心来好好熟悉内核的结构及构造过程之类的知识才行。

2>Linux系统设备驱动开发

设备驱动程序开发是目前市面上Linux相关开发中被人误解较多的一个部分。这块内容,说难也难,说容易也容易。接口就那么几个,关键是看你能否熟练掌握。在课堂上JulianTec会通过理论加例子的方式,使同学有一个好的起步。

3>.以x86或ARM为平台分析内核设计策略 √

很多人说做应用或者驱动开发用不着去研究内核的设计策略,但我们说正是内核给你提供了那些可以使用的各种接口,所以你最好努力去探究探究内核为什么会导出如此复杂多变的接口。

这不是一个短期的过程,幸运的是,JulianTec为大家提供了这样一个讨论学习的平台,使大家能不断的从中受益,这也是我建立这个平台的最根本追求。希望大家能不断的与这个平台保持久联,相信坚持不懈的努力,总会换来有丰硕收获的那一天。


注意:

1之所以说嵌入式Linux研发门槛高,那是因为做嵌入式Linux研发不仅需要你掌握软件知识,还要求你掌握硬件知识;不仅需要你熟悉应用编程,而且还要求你了解Linux操作系统的很多内部工作机制。对于一个刚毕业的同学来说,无论你的专业背景是偏硬的还是偏软的,都不大可能同时满足上面这些要求,更多的是工作经验使然。

2JulianTec在设计这些项目练习的时候,更多的是参照我之前的研发经验,不会像某些培训机构那样随便。它们都是有一定难度的,不像某些培训机构的老师,一个简单的动态内存分配模拟(malloc/free)也要变着法儿弄出四个阶段来,还不好好说清楚各个阶段要做什么,然后要同学花一个礼拜的时间去完成。在我们看来,这分明是在压缩同学的课堂学习时间来给自己偷懒嘛,是极不负责任的做法。

3实际上很多商业培训机构会列出大量的课程内容细节,企图以此彰显其专业性,但实际上东西之多,又如何能列的明白?这能从一个侧面反映其“专业”背后的不专业。也有一些机构,列是列了很多,但讲的呢,不及列出来的六成。

4实际上,在第二阶段学习ARM架构及S3C2440各部件功能的时候,我们还是会大量接触ARM的汇编指令,因为后续的很多内容,如涉及bootload、kernel之类的,也有部分汇编代码,同学需要能看懂它们。需要熟悉一些汇编也是嵌入式开发与普通开发的重要差别所在。

5我们用C语言设计软件的方式,被称为面向过程(procedure-oriented)的结构化的设计方式。它就是把一个大的问题逐步分解,细化成一个个小问题,最后再把各个小问题的解决步骤串接起来达到解决大问题的效果;但是面向对象(object-oriented)就不一样,它把整个世界看成是一系列对象的集合,所有要解决的问题都可以通过对象之间的交互来完成。较于前者,后者虽然更加抽象,但是也更加有趣,也能更容易的映射到现实世界。要了解它们更多的区别,请看面向过程的分析和面向对象的分析

6所谓SOC,即System on chip,是将很多硬件组件集成在一起,做成的一整块芯片。SOC芯片在嵌入式应用中使用甚为广泛,因为可同时满足几大需求:总价低,体积小,功耗也低。通常来说,一块嵌入式应用中的SOC,总会包含下列几类硬件组件:处理器CORE、某些可直接集成的外设(如时钟源,电源管理逻辑,集成的内存,定时器和其他应用于某些特定场合的外设)、用于连接其他外设的总线接口及控制器(如USB,UART,SPI等等)。SOC通常优于只集成有几十K内存的微控制器,它们一般可运行某种操作系统(如Linux,Win CE,uCOS等)以实现多任务。我们课堂所用的ARM9芯片S3C2440即是这样一块SOC。

7任何一个嵌入式Linux系统都包含三大组件(它们皆属软件范畴。实际上,任何一款Linux,不管是跑在PC上的,还是跑在服务器上的,也都是如此):BootLoader、Kernel和RootFileSystem。拿你女朋友的摩托罗拉A1210来说,当他按下手机电源按钮打开手机的时候,BootLoader就开始执行,它要负责初始化里面的一些硬件。初始化完成之后,紧接着从FLASH中读取Linux kernel出来,并传之以对整个机器的控制。最后Linux kernel会按照事先约定好的规则,去从RootFileSystem中读取出要执行的应用程序并执行之。执行的最后结果,便是你朋友可以在摩托罗拉A1210看到一个操作界面,并能在跟你通话的同时完成私底下的录音。

8眼下,在这世界上,除了ARM架构之外,在嵌入式领域里,还存在着其他许多种处理器架构,诸如MIPS、PowerPC、x86等等。但目前来看,ARM所占市场份额最多。您可在此处这些架构和相关的SOC。

9在市面上,Linux操作系统有很多种,诸如Redhat Linux、红旗Linux等等,但这些Linux系统,均有完全一样的结构,皆包含Linux应用程序、C运行库、Linux内核等等。所不同的只是其包含了各式各样的Linux应用程序,所以这些Linux系统实际上被称为Linux发行版。而此处所谈的Linux系统则专指其中的Linux kernel。