给大学生学习ARM和FPGA的建议(转)
给大学生学习ARM和FPGA的建议(转)
2012年01月11日
给大学生学习ARM和FPGA的建议
cooran 发表于 - 2012-1-6 2:48:00
对于初学者来说,要学的知识点很多,到底从哪里下手,人们常常感到非常迷茫。大一学生先从C语言开始入门,在大一阶段由于对计算机还非常陌生,因此不可能写出一个具有完整图形界面的软件,重点以“与硬件无关的计算方法、数据结构”为基础学习C语言,至少练习编写一万行C代码,否则不会找到编程的感觉,也体会不到编程乐趣,很多人就是因为缺乏一定量的训练,所以对编程没有兴趣,以至于未到毕业时就全部忘记了,程序设计是一项实践性很强的实践活动,没有大量的实践作为基础是很难入门的,因此我认为编写一万行代码是判定是否入门的依据。请初学者记住:当你编写了一万行代码时,这是你能够从事专业的开始,否则你不要期望在这个领域混下去。与此同时,C语言也是学习和使用Verilog的重要基础,所以千万不可小视C语言。更重要的是,如果你的C语言不好的话,你将来就业选择的路子就会受到很大的限制,要么只能做硬件工程师、销售工程师或者转行,别无选择!
有了一万行编程的经验后,大二接着开始学习数字电路和模拟电路了,这是你的机会!将来的开发工作有几种选择,但这两门都很重要,学好了你有可能成为顶尖的高手、专家和系统级水平的人才,即便学得不太好,你也有可能成为一个优秀的工程师。前一篇博文讲了,如果你精通了C/C++,即便你的硬件水平一般,你也可以成为一个优秀的开发工程师,即由硬件工程师负责逻辑电路和模拟电路的设计,由你来编程――你可以编写基于WinCE、Linux、Vxworks或者Windows等操作系统的程序。那么怎样才算基本上“精通”呢?至少编写五万行代码,当你已经编写了10万行代码时,可以说你已经完全精通了,这个时候你如果有很大的造化的话,那完全取决于你当初学习的基础是否牢固了。所以我在前面提到了,精通一门可以成为优秀的开发工程师,但绝对不可能成为系统级的开发工程师,因为你的知识结构不行。
最好在学习数字电路时购买一个99元的EasyFPGA030开发学习板,这个板子是我们开发的,但这个价格是没有利润的,不要认为我是在做推销,我们推出这个产品完全是针对大二学生的,希望有更多的大二学生提早醒悟,能够在学习数字电路时同步学习FPGA和Verilog,强化课程之间的关联。笔者虽然是一个企业家,但也有一份爱心和社会责任感,为社会做出自己的贡献同样也是企业家的“销售业绩”,我们为这个开发板撰写了30万字的配套资料和适合各种水平的范例,也投入了大量的精力录制Verilog语言视频讲座,这些都是超值和免费的。与此同时从2009年开始着手针对大二和大三学生举办FPGA大赛,以提高在校大学生的兴趣,让那些觉悟者进一步提高自信心,找到自己未来的坐标。学好数字电路和模拟电路以及FPGA应用技术,除了成为电子产品开发工程师之外(高附加值的嵌入式系统产品几乎离不开FPGA),还有一个就业方向就是号称“金饭碗”的集成电路设计。
作为初学者,在学习《电子技术基础(数字部分)》时同步学习FPGA与Verilog技术的重点是快速入门和打下一定的基础,根据配套的教材和数字电路教材的内容将基本的数字电路用FPGA实现即可,这是本阶段的学习目标,不要将学习高深难度的应用技术作为重点。并利用课余和暑假期间的空余时间,将一些图书上现成的使用数字电路实现的例子用FPGA来完成设计即可,比方如何使用FPGA 实现一个计数器,并动手做出来。到大三阶段在做出选择,到底是选择成为一个专业的FPGA应用设计工程师、还是嵌入式系统与FPGA混合应用系统设计工程师或集成电路开发工程师,以自己的兴趣和志向为基础而定,所以在学习嵌入式系统技术的同时学习FPGA,两者之间并不矛盾。
最好在大一开始学习单片机,这就是笔者为何撰写《新编电类专业计算机基础》这本图书的原因(详见破解电类专业“就业难、人才荒”的解决方案!(4))。因为大一不学习单片机,后面的课程都没有办法学好。对于大一学习单片机,很多老师不去用心研究学习方法和教学规律,反而搬出一大堆理由来“吓唬”人。笔者当年仅仅是一个技校生,在完全没有指导老师的情况下,也找不到可以参考的技术资料,只是凭着偶尔看到一篇报道罗伯特设计的Altair 8800计算机就做出了一台不需要工作软件的计算机(改进型的Altair-80C31电路详见《新编电类专业计算机基础》教材)。要相信现在公开的信息、资讯条件、人们的聪明智慧与教师的力量,因此大学本科生在大一阶段学会单片机是非常容易的一件事情。
有了单片机基础之后,在大二阶段学习数字电路与模拟电路的同时,结合单片机学习接口扩展技术与模拟前向通道数据采集技术,并编写相应的程序实现一个一个的小系统设计,大三时根本不再需要学习所谓的接口技术与微机原理了。针对数字电路与模拟电路笔者准备写作一套小系统设计与制作配套图书,将前后之间的课程也同步和关联起来,期望进一步提高大学生的动手能力。
有了大一、二阶段强化训练,后续的很多课程度可以理论与实践并重地学习,比方目前大学开设的《自动控制理论》几乎都是空对空地教学与联系,如果结合自动控制理论的教学,让学生学习设计一个自动穿越迷宫的电脑鼠,并举办相应的大赛,则能够很好地将嵌入式系统应用技术、数字电路与模拟电路、计算方法与数据结构、机构设计......相关课程有机地结合起来,学生的兴趣将大大地得到提高。
当学生有了学习的兴趣和动力之后,教学势必由老师个人在课堂上演“独角戏”的场面转变为研讨会,学生也一定会竭尽全力由被动学习向主动学习转变,这就是教育要达到的目标,所以我们不能一味地指责学生不好学。作为老师我们一定要思考和拿出行动,让学生喜欢并愿意向您学习。事实上学生的未来完全取决于老师的引导,现在教师队伍存在的很大毛病就是将责任推向扩招和学生不好好学,扩招有没有问题?当然有,但作为教师我们做得怎么样呢?我们是否在教学上做出了巨大的努力,这需要我们扪心自问。
学生不好好学,这也是事实!但也是表象,我们要思考他们为什么不好好学习?我们应该怎样才能让他们好好地学?作为老师,第一不能给学生划定考试范围,第二学生缺课要坚决扣分,如果做到这两点基本的要求,学生不好好学就制度处理,我想效果会有很大的改变。当然就业难的责任也不能完全推给老师,但老师们应该做到自己该做到的,因为家长都希望老师们对他们的子女严格要求,更迫切的需求就是让他们的子女学到真本事,他们肯定支持教师的行动。
进入大三阶段则需要有选择地重点学习嵌入式操作系统原理与编程、嵌入式系统与FPGA的混合系统设计或者全力以赴钻研FPGA应用技术等技术方向,大四阶段就可以真刀真枪地完成一个漂亮的毕业设计,并能够写出一篇比硕士水平还要高的论文。
嵌入式学习培训系统软件开发学习思路
cooran 发表于 - 2012-1-5 3:00:00
底层软件开发人员,及所有的嵌入式培训人员,若想作好软件设计(良好的结构和移植性),能适应新项目的变化,就要遵循下面的原则:
??最重要的是要理解基本概念 ( 如操作系统 ),掌握设计原则 ( 如接口分层 )。
??第二是经验的积累。实践经验比书本知识更可贵,可极大提高后续工作和学习效率。
??第三是关注新的软件技术,提高自己对软件设计的理解。
需要注意的是,一个完整固定的学习路线是很难确定的,原因一是因人而异,二是技术进步很快。
这是从todaygood的blog上面摘下来的,todaygood的学习效率比我高,可能工作的环境更能锻炼人吧。就嵌入式系统软件开发的学习思路而言,我们的观点还是一致的。现在这三个方面我还都是注意的,基本上是白天在导师公司的时间里,就根据项目积累经验,总结和改进学习方法,晚上进行软件设计基础和理论基础的学习。中间穿插的休息时间就可以泡论坛,看blog,关注新的软件技术,先知道有这种技术,技术的发展状况如何。
当然,这些工作的前提是确定一个基本的知识体系框架,在校期间把框架的基础打好,尽量多扩展填充。工作之后,继续深入细化,形成专长。这是我的学习思路。
补充的一点是,要学会写文档。有两个原因,一是锻炼自己的表达能力。自己能否真正理解,就看写出文档,是否能让别人理解。如果能,那么证明你理解比较到位了。同时,可以通过讨论来找出自己理解的盲点,加深理解。二是作为技术经验备份。需要时可以迅速的拿来使用,不用在网上浪费大量的搜索时间。万一系统down掉,可以迅速的恢复。可以说,这是自己的一份经验和财富。
嵌入式行业求职感受
cooran 发表于 - 2011-12-28 1:34:00
最近从10号左右就一直开始在求职了,但是到现在还是待业中。虽说目前嵌入式发展挺快,但是我却怎么都找不到入门的路呢。我错了吗,开始有点怀疑自己当初的选择了。
我是06年毕业的,前面也有说的到,毕业之后一直没有做过相关的工作,6月份辞职出来就在深圳参加了一家培训机构的嵌入式linux软件开发,虽然许多朋友,同学都说可以让我的简历写上一笔相关的工作经历,但是我做不到,自己没做过,并且嘴巴又不好用,真的很安。也许真是太老实了,到哪都没好果子,只有吃亏。
这些天一共也面试了五家公司,只有其中一家有点意向的,却最终还是挂了。那公司给我的原因是我在考虑的同时公司也在考虑的,结果就是我不是最合适人选。
在这段时间里我看到和听到最多的是要相关经验,网上,招聘会上随便哪一个职位大多是要一年或者两年以上相关经验,看到这些我真的好郁闷,好难受。
工作经验从哪里来,不在这家公司就在别的公司,人都是要同一个行业工作的,这家公司抢到一个那家公司少了一个,但却没有几家公司愿意去培养新人,哪怕就是像我这种自己掏钱被培训过的也没人要,难道真要从天而降的“经验”吗,真的要去做一个山寨版的简历吗?我也曾注意到网上有不少公司的嵌入式的职位从年初到现在都还在招人,是在打广告呢还是真的招不到人呢,如果是后者那为什么不找些有点基础来培训半年,到目前的话多少也可以上手了吧。为什么一定要找到条件都符合的呢,为什么都在彼此之间挖墙脚,难道只有这样对公司的发展会更好,难道这样才会有更多的利润吗?我们的眼光难道只看到这些吗?
谁都知道家离不开国,个人也离不开公司,但是一个公司能离得开一个行业的发展吗。如果所有公司都只是在挖别家的人才,而不注重自身内部人才的培养,这样无论是对自家,对员工还是对别家都是有害的,最终只会是杀鸡取卵。
想起了一个故事,有个人在问上帝为什么有的人会上天堂,有的人会下地狱。于是上帝先带他到地狱,那里摆着一个很大的锅,锅里正煮着肉,一大堆饿鬼都在各自拿着一把长勺子抢着吃,但是却没有一个人能吃到,因为勺柄太长了,他们无法将肉送到自己的嘴里,一个个饿得眼发青光,上帝说,“这就是地狱,我们再到天堂看看”。到了天堂,那个人看到的情况却是完全相关的一面。虽然是同样的一大锅肉,同样是一人一把勺子,但是每个人都吃得很开心,气氛也很融洽。原来天堂里的人大家都在彼此合作,你喂我一口,我还你勺,所以大家都过得很快活。“这就是天堂和地狱的区别”。
国外的嵌入式发展了好几年了,国内也在发展,但发展得怎样,我是不清楚的,而差距是怎么形成,肯定会有原因的,在刚接受培训的时候,有人对我说这一行的门槛很高,我当时还不怎么体会,现在总算明白一些了。
嵌入式学习要点
cooran 发表于 - 2011-12-13 9:26:00
1、Linux 基础
安装Linux操作系统 Linux文件系统 Linux常用命令 Linux启动过程详解 熟悉Linux服务能够独立安装Linux操作系统 能够熟练使用Linux系统的基本命令 认识Linux系统的常用服务安装Linux操作系统 Linux基本命令实践 设置Linux环境变量 定制Linux的服务 Shell 编程基础使用vi编辑文件 使用Emacs编辑文件 使用其他编辑器
2、Shell 编程基础
Shell简介 认识后台程序Bash编程熟悉Linux系统下的编辑环境 熟悉Linux下的各种Shell 熟练进行shell编程熟悉vi基本操作 熟悉Emacs的基本操作 比较不同shell的区别 编写一个测试服务器是否连通的shell脚本程序 编写一个查看进程是否存在的shell脚本程序 编写一个带有循环语句的shell脚本程序
3、Linux 下的 C 编程基础
linux C语言环境概述 Gcc使用方法 Gdb调试技术 Autoconf Automake Makefile 代码优化 熟悉Linux系统下的开发环境 熟悉Gcc编译器 熟悉Makefile规则编写Hello,World程序 使用 make命令编译程序 编写带有一个循环的程序 调试一个有问题的程序
4、嵌入式系统开发基础
嵌入式系统概述 交叉编译 配置TFTP服务 配置NFS服务 下载Bootloader和内核 嵌入式Linux应用软件开发流程熟悉嵌入式系统概念以及开发流程 建立嵌入式系统开发环境制作cross_gcc工具链 编译并下载U-boot 编译并下载Linux内核 编译并下载Linux应用程序
5、嵌入式系统移植
Linux内核代码 平台相关代码分析 ARM平台介绍 平台移植的关键技术 移植Linux内核到 ARM平台 了解移植的概念 能够移植Linux内核移植Linux2.6内核到 ARM9开发板
6、嵌入式 Linux 下串口通信
串行I/O的基本概念 嵌入式Linux应用软件开发流程 Linux系统的文件和设备 与文件相关的系统调用 配置超级终端和MiniCOM 能够熟悉进行串口通信 熟悉文件I/O 编写串口通信程序 编写多串口通信程序
7、嵌入式系统中多进程程序设计
Linux系统进程概述 嵌入式系统的进程特点 进程操作 守护进程 相关的系统调用了解Linux系统中进程的概念 能够编写多进程程序编写多进程程序 编写一个守护进程程序 sleep系统调用任务管理、同步与通信 Linux任务概述任务调度 管道 信号 共享内存 任务管理 API 了解Linux系统任务管理机制 熟悉进程间通信的几种方式 熟悉嵌入式Linux中的任务间同步与通信编写一个简单的管道程序实现文件传输 编写一个使用共享内存的程序
线程的基础知识 多线程编程方法 线程应用中的同步问题了解线程的概念 能够编写简单的多线程程序编写一个多线程程序
8、嵌入式 Linux 网络编程
网络基础知识 嵌入式Linux中TCP/IP网络结构 socket 编程 常用 API函数 分析Ping命令的实现 基本UDP套接口编程 许可证管理 PPP协议 GPRS 了解嵌入式Linux网络体系结构 能够进行嵌入式Linux环境下的socket 编程 熟悉UDP协议、PPP协议 熟悉GPRS 使用socket 编写代理服务器 使用socket 编写路由器 编写许可证服务器 指出TCP和UDP的优缺点 编写一个web服务器 编写一个运行在 ARM平台的网络播放器
9、GUI 程序开发
GUI基础 嵌入式系统GUI类型 编译QT 进行QT开发熟悉嵌入式系统常用的GUI 能够进行QT编程使用QT编写“Hello,World”程序 调试一个加入信号/槽的实例 通过重载QWidget 类方法处理事件
10、Linux 字符设备驱动程序
设备驱动程序基础知识 Linux系统的模块 字符设备驱动分析 fs_operation结构 加载驱动程序了解设备驱动程序的概念 了解Linux字符设备驱动程序结构 能够编写字符设备驱动程序编写Skull驱动 编写键盘驱动 编写I/O驱动 分析一个看门狗驱动程序 对比Linux2.6内核与2.4内核中字符设备驱动的不同Linux 块设备驱动程序块设备驱动程序工作原理 典型的块设备驱动程序分析 块设备的读写请求队列了解Linux块设备驱动程序结构 能够编写简单的块设备驱动程序比较字符设备与块设备的异同 编写MMC卡驱动程序 分析一个文件系统 对比Linux2.6内核与2.4内核中块设备驱动的不同
11、文件系统
虚拟文件系统 文件系统的建立 ramfs内存文件系统 proc文件系统 devfs 文件系统 MTD技术简介 MTD块设备初始化 MTD块设备的读写操作了解Linux系统的文件系统 了解嵌入式Linux的文件系统 了解MTD技术 能够编写简单的文件系统为 ARM9开发板添加 MTD支持 移植JFFS2文件系统 通过proc文件系统修改操作系统参数 分析romfs 文件系统源代码 创建一个cramfs 文件系统