最近一个客户拿着他的linux系统来向我求救。那是一个S3C2440的linux项目。具体情况就是:系统反应速度太慢,用了一阵以后输出的声音就像被卡住了一样,一个字拖的很长。他用的是2.6的内核,按理来说2.6的内核实时性应该不错啊,其调度算法复杂度是O(1),而且支持内核抢占,虽然说不是一个硬实时的系统,但其软实时还是有保证的,而且他这个项目对实时性根本没什么要求。拿过来一分析发现:
1.应用程序写得不好,那么多的事情,竟然是用一个进程完成的,单线程。IO阻塞的特厉害,但有一部分又是计算型的代码。我们都知道IO阻塞型的程序会因为其时间片使用率非常低所以优先级会增大,而计算型的代码时间片用得快优先级会减少,这样一增一减,所以系统不响应慢才怪。而且有部分代码该用实时性优先级的。
2.驱动写得不好。最重要的就是同步和互斥做的不好,这些概念和如何使用理解的不清楚,乱用,不该关中断的地方或者是中断关的太久。
经过一番修改以后,系统算是满足了客户的要求。
这引起了我的深思。我们要走的路还很长,要真正把linux用于实践中我们还要付出更大的努力。虽然现在有关嵌入式linux开发的资料一大把,特别是讲移植方面的。但要应用起来还很困难。我碰到过很多开发者或者学习者,说他们移植了linux或者写了驱动,其实很多一部分只是照别人开发板上面的做而已,要真正剪裁其一个系统来,又会碰到更多的困难,问一些问题他们又会哑口无言或者支支吾吾。现在很多开发板都提供了其有关的驱动程序,不过这些代码一般都写的不是好,只能拿过实验用,特别是在同步/互斥,中断管理(上下半部分),可能需要内核辅助线程的等等,我们要自己动手去改,同时要加强测试,其实哪怕一个小小的模块,也涵载着大量的学问和知识在里面。这些都需要我们去学,而不是学在表面。最好的学习代码就是看内核本身提供的代码,参考人家的代码,思考自己该怎么做。如果我们要做到透彻理解和应用linux需要花费大量时间,这需要我们有恒心和信心。当你越过一个一个坎的时候,你就离成功越来越近了。
最后给大家提供一下书籍,不过都是英文的,要习惯去看才行。
1.Embedded Linux Primer: A Practical, Real-World Approach
2.Building Embedded Linux Systems
3.Linux Kernel Development Second Edition
4.Linux Device Drivers, 3rd Edition
5.Essential Linux Device Drivers
6.Running Linux, 5th Edition
7.Understanding the Linux Kernel, 3rd Edition
8.The Linux TCPIP Stack Networking for Embedded Systems.pdf
9.The Linux® Kernel Primer: A Top-Down Approach for x86 and PowerPC
Architectures
10.Understanding Linux Network Internals
11.Understanding The Linux Virtual Memory Manager
应用程序方面的资料:
Advanced Programming in the UNIX? Environment
另
外多看看设计模式方面的书籍,还有就多找些好的开源项目代码读读,看看人家的代码是怎样写的,在面向对象编程的今天,虽然C语言本身不支持面向对象的一些
特性,但你会从代码中看到很多优秀的程序或多或少的加入了面向对象的思想。好的代码不是写给编译器看的,而是写给人看的。
最后我们要动其手来才行,光说不练那是假把式,实践才是硬道理。我们大家一起为推动linux在嵌入式上的应该做努力。