回头看之前写的几篇unix环境编程的博客实在是惨不忍睹,像是在记流水账。于是在精心设计好框架之后重新写一下unix环境编程的内容,毕竟这块还是比较重要的也是比较基础的。无论是做嵌入式开发还是服务器开发,无论是驱动还是应用,这块都是绕不开的。之前写的内容都重写一下,另外新加一些。
以后博客的内容对于基础知识框架以框图的形式一笔带过,主要的内容放在重难点或者项目实用的或者是一些好玩的东西,博客的内容尽量简短,避免长篇大论。

unix环境编程知识框架

  • unix环境编程需要掌握的大概内容如上面的图所示,适用于系统工程师,系统工程师的工作更偏向于软件的底层框架,如果你偏向于网络编程方向,那你应该更加关注socket编程。这也是各个公司在面试嵌入式软件开发时很可能会问到的问题,大概率出自这里面,对于刚毕业的应届生,一般对于linux内核实现应该会问的很少(这里我是猜的,因为我也没毕业。。。)
  • 另外,这只是一个整体框图,对于每一个部分的内容接下来会以单独的篇幅给出,也是以框图的形式,对于难点则会另外单开一篇。宗旨不变,减少篇幅,提炼精华。

如何入门嵌入式开发?

相信很多同学尤其是本科刚毕业或者没有毕业的同学,对于单片机的知识已经很熟悉了,但是又不希望于只停留在单片机的层面上(本人最开始就是这种情况),那如何进入嵌入式的领域呢?
首先说说我的例子,我在本科学的单片机,学习STM32,然后接触了操作系统ucosIII,本科毕业后找了一份实习,做单片机开发,刚入职也应付不了单片机的工作,后来慢慢锻炼,感觉对于单片机开发应该是轻车熟路了。后来读研,在学习给老师做项目,最开始是一个硬件的项目,因为这个画了很多PCB,刚开始画了不能用不满意,重画,打板测试,再重画,再打板,后来终于能用了,顺利交付了项目,通过这个项目也锻炼了PCB Layout的能力。后来又有了一些上位机的项目,因此又学习了QT,QT开发到现在为止我也不知道自己是什么水平,但是对于简单的UI还是能搞得定的,到这算是入门嵌入式之前。
后来,我买了韦东山老师的视频和开发板,开始打开嵌入式的大门,由于我有单片机和硬件的基础,地址空间的概念在学ucosIII操作系统也玩的挺明白了,因此对于第一期视频我觉得还是挺简单的,但是ARM汇编和makefile还有代码重定位还是属实给我上了一课。对于BootLoader和移植那一块的东西,我觉得能手写一个boot是最好的,对boot的理解也最到位,移植和文件系统这块我是学完了之后移植了4.9的内核到开发板上,内核版本越高移植越简单。。。
后来按照顺序学习第二期,我就感觉有点吃力了,对于unix环境不了解,对于内核的子系统不了解,对于用户空间和内核空间也不了解,对于shell也不懂,因此老师调用的很多API只能达到看看的程度,根本不理解,但我还是硬着头皮学完了第二期,毕竟对于内核的那些机制是不需要其他知识只需要C语言好就行了,比如输入子系统,分离分层驱动模型什么的。。。在第二期学完之后,我突然意识到这种水平是没法去做嵌入式开发的,因为只了解了某些点,知识根本不全面,因此我就开始补充应用层的知识,也就是现在所要介绍的unix环境编程,还有shell的一些基础用法,之后也会有专题介绍,等把这些都学完之后,我感觉我与内核亲切了许多,感觉自己学的很多东西现在可以连起来了,虽然对于一些机制还是不怎么了解。。。
总结一下从单片机转嵌入式应该是以下的顺序:

  • unix环境编程,建立内核与应用交互的概念
  • shell编程,熟悉内核脚本,建立亲切感
  • ARM汇编,裸机开发,boot学习,内核移植等,,,
  • 驱动框架学习
  • 设备树
  • 。。。

为什么没有写linux入门啥的,我觉得那些东西没必要单独学,在学习其他知识的过程中会慢慢掌握,还有,嵌入式开发很考验经验,但是对于在学校的学生无法实习的,最好也能做一两个小项目练手,但是千万别沉迷于项目忘记了学习,不学习你永远不会去做更有价值的事情,你永远不会更上一个台阶。。。个人观点。。。

unix环境编程入门知识

  • 对于unix环境编程首先是要时时刻刻建立起内核和应用程序的关系,要从内核的角度看应用开发,各种调度的机制是内核帮我们实现的,因此程序首先要进入内核态,在内核完成调度之后再切换回用户态。
  • 进程三态是十分重要的知识点,等待的程序不可能直接运行,要先进入就绪态,等待内核调度,内核会从就绪队列中按照调度算法拿出相应的应用程序开始运行。。。
  • 学习方式需要强调一下,学习unix环境编程应该侧重于学习内核的机制,而不是APIAPI查询应该统一去man手册查询而不是任何的书籍。学习机制的好处在于对于一些不好解释的现象可以从内核的角度进行解释。。。

需要了解的主要知识点都在图上了,想深入理解还是建议自己去查。在网上这么多资源中找到真正能让你理解的,这也是一种能力。。。


图片是矢量图,可以右键查看大图。。。


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!

进程 上一篇
通用Makefile 下一篇