# 嵌入式系统

一种面向业务流的内存管理算法

在象通讯系统中的基站这样的复杂嵌入式系统中,对于内存管理模块的效率具有很高的要求,因此内存管理模块的算法很有讲究。讲究在于,不仅要考虑算法的效率,还要兼顾算法是否会带来大量的内存碎片以及如何进行内存碎片合并。正因如此,这类嵌入式系统软件大多会对内存管理模块根据业务特点进行适当的优化。 优化的方式无外乎引入内存池,或对堆管理模块引入新的算法加以优化,然而这些方法除了引入了一定的算法复杂度外

原创 推荐 点赞2 阅读1384 收藏0 评论3 2012-07-31

《专业嵌入式软件开发》的样章、建议和勘误

该书已全面上市(在我博客首页左侧的图书封面下方能找到购买链接)。您可以通过本博文以留言的方式写下您的建议和发现的错误,我会不断对之整理以作本文内容的一部分。谢谢!     感谢您在购书网站或豆瓣写下书评以帮助他人选书。如觉得该书不错,请帮忙推荐给周围的人。   另:本书入选CSDN 2011年度十大最具技术影响力图书(本版) 。 感谢读者的喜爱

置顶 原创 点赞38 阅读10000+ 收藏1 评论108 2011-11-16

从写博客到出书

    经过两年的努力,《专业嵌入式软件开发 — 全面走向高质高效编程》将于今年的10月份左右与读者见面。     早在7、8年前就有写书的念头了,但当时想到寻找合作出版社是那样麻烦,就一直耽搁了下来,直到2009年的6月20日。那天,我又与妻子谈起了写书的想法,她给了我从写博客开始的建议。也在那一天,经过一翻“考察&rd

原创 推荐 点赞10 阅读4134 收藏0 评论8 2011-08-04

小心多任务设计被滥用

通过合理创建任务(或线程)的方式,可以有效地提高软件设计的模块性。通过让一个任务关注于某一类事务,有助于简化任务体函数的实现,以及提高程序的可维护性。另外,多任务在不少情形下,将提高系统的运行效率,因为一个任务在等待所需资源时,另一个任务可以利用处理器做更多的事。尽管多任务有它的好处,但使用多任务的“度”很重要。就作者的观察,多任务设计方法大有被滥用之势,乃至有的工程师习惯

原创 推荐 点赞2 阅读3345 收藏0 评论2 2010-11-04

定时器管理

通过本文你将了解 1)定时器的具体实现是怎样的。 2)什么是中断回调定时器。 3)什么是任务回调定时器。 4)实现中断回调定时器的回调函数时应当注意什么。 ...请打开附件阅读全文。

原创 点赞5 阅读2676 收藏0 评论17 2010-01-26

栈字符数组

通过本文你将了解 1)为什么对一个特定的字符串指针进行写操作时会出现错误? 2)什么是栈字符数组? 3)C语言是如何初始化栈字符数组的? ...请打开附件阅读全文。

原创 推荐 点赞1 阅读2023 收藏0 评论3 2009-11-19

混淆指针和数组所导致的错误

通过本文你将了解 1)为什么一个已定义了的数组被错误的声明成了指针以后会出现错误? 2)在编译程序时为什么不能发现上述错误? 3)出现上述错误深层次的原因是什么? 4)如何避免这类错误。 ...请打开附件阅读全文。

原创 推荐 点赞1 阅读2669 收藏0 评论4 2009-11-12

内存管理 - 完整版

    呵呵,经过一段时间的努力总算是完成了这篇文章。从附件中的修定时间你可以看出,从开始写这个主题到最终完成花了很长的时间。之所以花这么多的时间,是因为内存管理模块具有一定的复杂性,在写作的过程中总是想找到高效且简单的实现,但显然这样的实现是不存在的,为此,我花了很长的时间去思考这篇文章到底应当如何去写。     正如我在文章中所提到的,写

原创 推荐 点赞10 阅读4535 收藏0 评论27 2009-10-25

任务管理

任务是嵌入式操作系统当中最让人难以理解的概念之一,如果要了解任务那么不得不说到任务的调度。本文在讲述任务及其调度时,并没有采用具体到某一类处理器这种方式,而是采用一种更高层次的抽象来解释任务是什么,以及任务调度是如何实现的。通过采用一般性的概念来阐述任务及其调度原理,这有利于让我们把握其本质,且方便的将同样的知识运用到不同的处理器上。      除了介绍任务的概念

原创 推荐 点赞5 阅读2329 收藏0 评论8 2009-09-29

错误管理

一个好的软件设计,如果说没有对错误进行系统性的管理,那么很难让我相信它是一个真正好的设计。设计得出色的软件系统,其错误管理往往是关键之一。出错是软件产品不可规避的问题,因为现实太复杂了!好的软件系统通常会规划如何去表达一个错误,以及考虑当出现错误以后如何在第一时间内尽可能快的知道错误根源。在我看来,无论如何强调错误管理对于软件产品的重要性都不过份。      本文

原创 推荐 点赞2 阅读3697 收藏0 评论5 2009-09-20

内存管理 - mblock算法

内存管理是操作系统中很重要的一部分内容,对于嵌入式系统同样不例外。这篇文章通过做项目的形式,介绍了内存管理在嵌入式系统是如何实现的,以及在设计内存管理时应当注意什么。需要注意的是,这不是一篇专门讲解内存管理算法的文章。如果,你想了解更多的内存管理算法,你可以参照专门讲解操作系统的书籍。 源代码附在附件中以方便你学习。 ...请打开附件阅读全文。

原创 推荐 点赞1 阅读3054 收藏0 评论7 2009-09-02

程序断点与数据断点

如果你做嵌入式开发,那你一定得对程序断点(program breakpoint)和数据断点(data breakpoint)有所了解。程序断点你可能还听说过,但数据断点就有可能不是很了解了,更有可能不知道如何去用了!现在,就让我们去了解所有类型的“断点”吧! 程序断点就是指处理器指令断点,通俗的说就是:当程序运行到某个地方时,我们希望程序停下来,即程序“断

原创 点赞2 阅读8418 收藏0 评论1 2009-08-27

驾驭Makefile (准完整版)

最近工作很忙,但这不是为什么一个多星期没有更新博客的原因。相反,最近一直在写这篇文章。现在终于让它与大家见面了!这是一篇长达60多页的文章(见附件),希望与你渴望学习Makefile的热情相比,不会显得短,而且我相信你不会失望!    在两年多前,我曾经给单位的同事做过了Makefile方面的培训,培训是采用“做项目”的形式进行

置顶 原创 推荐 点赞34 阅读10000+ 收藏2 评论125 2009-08-25

MMU的作用

MMU(Memory Management Unit,内存管理单元)在现代处理器中扮演着非常重要的角色。操作系统通过使用处理器的MMU功能,能实现以下功能:     1)虚拟内存。有了虚拟内存,可以在处理器上运行比实际物理内存大的应用程序。为了使用虚拟内存,操作系统通常要设置一个交换分区(通常是硬盘),通过将不活跃的内存中的数据放入交换分区,操作系统可以腾出其空间来

原创 推荐 点赞0 阅读10000+ 收藏0 评论5 2009-08-09

程序中的段

了解一个程序的组成结构对于嵌入式系统开发非常的重要,通过对于程序中段的了解也有助于我们进一步的去了解我们的编程语言。 本文采用独特的示例程序帮助读者理解程序中的段,以及变量是如何分配到不同的段的。读者需要注意的是你要学习的不只是文章中的内容,你更应当注意文章中所使用的方法。因为,掌握方法能让你学会如何去寻求一些问题的答案。 ...请打开附件阅读全文。

原创 点赞7 阅读4242 收藏1 评论11 2009-08-04

堆和栈

堆(heap)和栈(stack)是非常重要的概念,当我们进行程序开发时理解它们非常重要,尤其是对于嵌入式系统开发。比如在嵌入式系统中,任务的栈通常都很小,可能也就几K字节。在这种情况下,我们就应当尽可能不要将占用内存大的变量分配在栈上,而是应当分配在堆上;此外,也尽量不要采用递归的方式来设计程序,否则很容易造成栈溢出。      从本质上说,堆和栈都是内存,那么我

原创 推荐 点赞2 阅读10000+ 收藏0 评论8 2009-08-02

熟悉binutils工具集(完整版)

对于嵌入式系统开发,掌握相应的工具至关重要,它能使我们解决问题的效率大大提高。目前,可以说嵌入式系统的开发工具是GNU的天下,因为来自GNU的GCC编译器支持大量的目标处理器。除了GCC,还有一个非常重要的、同样来自于GNU的工具集(toolchain) —— binutils toolchain。这一工具集中存在的一些工具,可以说是我们开发和调试不可缺少的利器。 本

原创 点赞11 阅读10000+ 收藏1 评论16 2009-08-02

[跟我学嵌入式开发] 什么是交叉编译

在嵌入式系统开发中,经常用到与交叉编译(cross compiling)相关的术语,那交叉编译到底是指什么呢? 嵌入式系统往往资源都是很有限的,如果其资源和我们平常用的桌面计算机(在嵌入式系统开发中我们称之为主机,host machine)一样,那我想可能就不存在交叉编译这么一说了。最为典型的是,嵌入式系统的内存往往是几兆字节,且只有FLASH而没有硬盘这种大容量存储设备。也就是说在这种资源

原创 点赞0 阅读6258 收藏0 评论2 2009-07-26

嵌入式软件开发学习导引

现在正在写《跟我学嵌入式开发》这个系列的博文(注:这个系列最终成为了《专业嵌入式软件开发》一书的部分内容),或许,你是对这一话题感兴趣的人,也或许,你正想进入这个充满刺激和挑战的领域。在此,我希望与你谈一谈我对于嵌入式开发学习的一些想法或是建议。 首先一点的是,你要有充分的心里准备,你需要有一定的坚持力。嵌入式系统开发的学习需要一个过程,因为我们需要掌握的知识太多了!从熟悉开发环境(如GNU

原创 推荐 点赞11 阅读7611 收藏1 评论13 2009-07-25

硬件“行话”(续)

这是《硬件“行话”》的续篇。 (8)电平的有效性 前面我们了解了什么是片选信号,也讲到了三态门,需要指出的是片选信号通常不是三态门,其只存在两个状态,即高电平或是低电平。前面我们也说了,片选信号是用来“开门”的,而片选信号又有高和低电平,那到底是高电平表示“开门”呢?还是低电平?对于这一问题,我们称如果一个电平对于一个

原创 点赞3 阅读2833 收藏0 评论5 2009-07-25

boot loader能全部用C程序编写吗

在《什么是boot loader》一文中我抛出了一个问题,这个问题如下:     我们说boot loader通常采用汇编和C语言相结合来编写的,那能不能全部用C语言来进行编写呢?为什么? 对于这一问题的答案是:不能。C程序中所有的代码都是以函数的形式出现的。可能有人要说在C中也可以嵌入汇编代码,能不能用这种方式来实现整个boot loader呢?再看

原创 点赞1 阅读6134 收藏0 评论4 2009-07-24

硬件“行话”

做嵌入式系统开发,不可避免的要接触硬件,有时如果可能还得拿起示波器和逻辑分析仪进行调试。个人觉得,做嵌入式开发最好是对数字电路有一定的了解。对于数字电路的系统性知识,读者可以找相关的书籍进行学习,我也相信很多专业都学过数字电路这一课程。下面我们来看一看在嵌入式系统开发中需要掌握的最基本的一些硬件知识或术语,这此术语也是嵌入式开发人员之间的“行话”(当然,也是硬件工程师的&l

原创 推荐 点赞6 阅读5211 收藏0 评论12 2009-07-23

什么是Boot Loader

在嵌入式系统当中你可能经常听到 boot loader(引导加载器)这一词,boot loader是指什么呢?在我们日常经常接触的东西中是不是有与boot loader的作用或是概念相似的呢?有一点我一定猜得到,你现在正在用计算机看这篇文章。如果你稍微熟悉计算机的组成,你一定知道BIOS(Basic Input/Output System)。BIOS在计算机中就是用来启动计算系统的,在完成一定的硬

原创 推荐 点赞12 阅读10000+ 收藏2 评论30 2009-07-22

MMU在堆栈溢出防范中的运用

堆栈溢出的检测是很多嵌入式操作系统所具有的一个特性,通过这一功能,我们还可以知道任务的堆栈大小是否是合适的,而不是基于自己的“经验”去估计。本文介绍了堆栈溢出检测技术的原理,以及一种采用MMU来防止当堆栈溢出出现时状况恶化的方法。 ...请下载附件阅读全文。

原创 点赞1 阅读2179 收藏0 评论3 2009-06-27

内存泄漏的防范和检测方法

在C/C++编程中内存泄漏是一个非常普遍和令人头痛的问题,这一问题在嵌入式系统中更为突出。那么如何采用一种好的方法来防范和检测内存泄漏呢?常用的做法有以下几种。     1)采用代码审查的方式进行控制。这种方法是最容易想到的,但是效果也是相当的有限的。当程序复杂度增加的时候,这种方法就越加显得无能为力了。     2)采用一定

原创 推荐 点赞0 阅读4061 收藏0 评论3 2009-06-27

嵌入式软件开发之我见

自己从事嵌入式系统开发有好多年了,在此想与大家分享我对于嵌入式开发的一点心得与体会。   先大致说一说我的工作经历。97年毕业后做了两年的电气与电子设计与开发,这一时期,我做过电路原理图的设计和PCB板的设计。从99年开始,我进入了软件行业。第一次做嵌入式开发是在2000年,在随后的六年多的时间里,我差不多做过整个操作系统的组件。一开始用的是uC/OS RTOS,熟悉它的人知道,它是

原创 推荐 点赞2 阅读10000+ 收藏0 评论7 2009-06-23

一个花费数千人民币的设计缺陷

    最近给一个公司解决了一个以DSP为核心的嵌入式产品的疑难问题。故障的暴露是因为一块曾采用的SDRAM芯片要停产了,所以该公司重新采购了另一个厂家的兼容的SDRAM芯片。新的芯片换上了以后,发现所采集出来的图像数据不正常,经常是乱七八糟的。更为有趣的是,手放在SDRAM的附近就会使得图像更加的乱。这个问题困扰了该公司超过半年的时间。以下是我解决这一问题的大致经历

原创 点赞2 阅读2801 收藏0 评论5 2009-06-22

安装VxWorks 6.6有感

记得三年前那时在UTStarcom工作,当时我们所采用的VxWorks版本是5.5.1,而现在其最新版本已是6.7。我现在所在的公司用的是6.6版本。   还记得当时在UTStarcom工作时,我们采用了PNE版,PNE版最大的特点是其提供了完整的IP协议栈。此外,这一协议栈是来基于BSD的。正因为那一时期的工作经验,使得我对于BSD的协议栈源码实现很是熟悉。当然,这少不了《TCP/

原创 点赞1 阅读10000+ 收藏0 评论2 2009-06-20