嵌入式

本文将详细分析单片机、ARM、FPGA嵌入式几者之间的特点及区别。

单片机的特点:

(1)受集成度限制,片内存储器容量较小,一般内ROM:8KB以下;

(2)内RAM:256KB以内。

(3)可靠性高

(4)易扩展

(5)控制功能强

(6)易于开发

ARM的特点:

(1) 自带廉价的程序存储器(FLASH)和非易失的数据存储器(EEPROM)。这些存储器可多次电擦写,使程序开发实验更加方便,工作更可靠。

(2) 高速度,低功耗。在和M51单片机外接相同晶振条件下,AVR单片机的工作速度是M51单片机的30-40倍;并且增加了休眠功能及CMOS技术,使其功耗远低于M51单片机。

(3) 工业级产品。具有大电流输出可直接驱动SSR和继电器,有看门狗定时器,防止程序走飞,从而提高了产品的抗干扰能力。

(4) 超功能精简指令,具有32个通用工作寄存器,相当于M51单片机中32个累加器!从而克服了单一累加器工作的瓶颈效应。

(5) 程序下载方便。AVR单片机即可并行下载也可串行下载,无需昂贵的编程器。此外,还可以在线下载!也就是说可以直接在电路板上进行程序修改和烧录。

(6) 具有模拟比较器、脉宽调制器、模数转换功能。使得工业控制中的模拟信号处理更为简单方便。

(7) 并行口、定时计数器、中断系统等单片机内部重要资源的功能进行了大幅度提升,使之更适合工业生产过程的实时控制。

(8) 其时钟频率既可外接也可使用单片机内部自带的振荡器,其频率可在1MHz-8MHz内设置,使得硬件开发制作更为简洁。

(9) 强大的通讯功能,内置了同步串行接口SPI、通用串行接口UAST、两线串行总线接口TWI(I2C ),使网络控制、数据传送更为方便。

(10) 超级保密功能,应用程序可采用多重保护锁功能。可低价快速完成厂家产品商品化等等。 除上述特点外“零外设”也是AVR嵌入式单片机的重要特征。由于该芯片已内置了程序存储器、晶振并增加了在线汇编功能。

所以AVR单片机芯片接上直流电源,下载个程序就可以独立工作。无需附加外部设备,无需使用昂贵的编程器和仿真装置。这给我们学习和开发带来了便利条件。

FPGA的特点:

(1)采用FPGA设计ASIC电路(专用集成电路),用户不需要投片生产,就能得到合用的芯片。

(2)FPGA可做其它全定制或半定制ASIC电路的中试样片。

(3)FPGA内部有丰富的触发器和I/O引脚。

(4)FPGA是ASIC电路中设计周期最短、开发费用最低、风险最小的器件之一。

(5)FPGA采用高速CMOS工艺,功耗低,可以与CMOS、TTL电平兼容。

可以说,FPGA芯片是小批量系统提高系统集成度、可靠性的最佳选择之一。

FPGA是由存放在片内RAM中的程序来设置其工作状态的,因此,工作时需要对片内的RAM进行编程。用户可以根据不同的配置模式,采用不同的编程方式。

加电时,FPGA芯片将EPROM中数据读入片内编程RAM中,配置完成后,FPGA进入工作状态。掉电后,FPGA恢复成白片,内部逻辑关系消失,因此,FPGA能够反复使用。FPGA的编程无须专用的FPGA编程器,只须用通用的EPROM、PROM编程器即可。当需要修改FPGA功能时,只需换一片EPROM即可。这样,同一片FPGA,不同的编程数据,可以产生不同的电路功能。因此,FPGA的使用非常灵活。

嵌入式系统的特点:

1、系统内核小

由于嵌入式系统一般是应用于小型电子装置的,系统资源相对有限,所以内核较之传统的操作系统要小得多。

2、专用性强

嵌入式系统的个性化很强,其中的软件系统和硬件的结合非常 紧密,一般要针对硬件进行系统的移植,即使在同一品牌、同一系列的产品中也 需要根据系统硬件的变化和增减不断进行修改。同时针对不同的任务,往往需要 对系统进行较大更改,程序的编译下载要和系统相结合,这种修改和通用软件的 “升级”是完全两个概念。

3、系统精简

嵌入式系统一般没有系统软件和应用软件的明显区分,不要求 其功能设计及实现上过于复杂,这样一方面利于控制系统成本,同时也利于实现系统安全。

4、高实时性的系统软件

OS是嵌入式软件的基本要求。而且软件要求固态存储,以提高速度;软件代码要求高质量和高可靠性。

5、嵌入式软件开发要想走向标准化,就必须使用多任务的操作系统

嵌入式系统的应用程序可以没有操作系统直接在芯片上运行;但是为了合理地调度多任 务、利用系统资源、系统函数以及和专家库函数接口,用户必须自行选配RTOS (Real-Time Operating System)开发平台,这样才能保证程序执行的实时性、 可靠性,并减少开发时间,保障软件质量。

6、嵌入式系统开发需要开发工具和环境

由于其本身不具备自举开发能力, 即使设计完成以后用户通常也是不能对其中的程序功能进行修改的,必须有一套 开发工具和环境才能进行开发,这些工具和环境一般是基于通用计算机上的软硬 件设备以及各种逻辑分析仪、混合信号示波器等。开发时往往有主机和目标机的 概念,主机用于程序的开发,目标机作为最后的执行机,开发时需要交替结合进行。

来源:网络(版权归原著作者所有)

围观 373

引言

在嵌入式实时操作系统(RTOS)中,任务可通过调用延时函数(比如μC/OS中的OSTimeDly() 函数)将自己延时挂起一段时间。任务在延时的过程中会释放CPU使用权,也就是说,延时的任务不占用宝贵的CPU资源。延时的任务由时钟节拍服务跟踪管理。当任务延时结束并准备运行时,时钟节拍服务会使该任务恢复运行。时钟节拍服务定期运行,其运行由周期的时钟节拍中断触发,而时钟节拍中断可由硬件定时器产生。

在μC/OS—III中,时钟节拍服务是在时钟节拍中断服务程序中完成的,每次时钟节拍服务都会遍历整个任务链表,递减所有延时任务的延时计数器。当任务数目较多时,时钟节拍服务处理时间很长,会造成中断延迟时间和任务延迟时间都变得很长,影响系统的实时性。

在μC/OS—III中,时钟节拍服务不再在时钟节拍中断服务程序中完成,而是放到一个时钟节拍任务中完成。而且,通过采用啥希散列表机制来管理延时任务,每次时钟节拍服务只需要处理极少数的延时任务,从而大大减少了时钟节拍服务花费的时间,提高了系统的实时性。

另外,在μC/OS系列RTOS中,时钟节拍服务除了会跟踪延时的任务,还会跟踪那些指定了超时时限的等待任务。也就是说,当指定的超时时限结束时,即使任务等待的事件没有发生,时钟节拍服务也会使该任务恢复运行。

1、 μC/OS—II中的时钟节拍管理机制

在 μC/OS—II中,每次时钟节拍服务都会遍历整个任务链表,依次处理各个任务。如果当前处理的任务的延时计数为0,那么跳过该任务,继续处理下一个任务;否则,把当前任务的延时计数减1,然后,判断减1后的延时计数是否为0。如果为0,表示任务延时结束了或等待超时了。由于μC/OS-Ⅱ允许其他任务调用OSTaskSuspend()函数强制挂起正在延时的任务,在这种情况下,不仅需要等到任务延时结束,还需要由其他任务调用 OSTaskResume()函数解除该任务的强制挂起状态,该任务才能进入就绪态。因此,在延时计数递减为0的时候,还需要判断任务是否被强制挂起。只有任务没有被强制挂起,才能使该任务进入就绪态;否则,把延时计数设置为1,保持任务的延时状态。μC/OS—II时钟节拍服务函数的主要代码和注释如下:

在μC/OS—II中,由于每次时钟节拍服务都要遍历所有任务,因此,在任务数目较多时,其执行时间可能很长。另外,由于时钟节拍服务函数OSTimeTick()由时钟节拍中断服务程序OSTicidSR()调用执行,因此当OSTimeTick()执行时间很长时,时钟节拍中断服务程序的执行时间也很长。在中断服务程序执行时,所有任务都无法执行,在这种情况下,系统的实时性会很差。

2、 μC/OS-III中的时钟节拍管理机制

针对μC/OS—II时钟节拍服务的问题,μC/OS—III主要做了两点改进:①用时钟节拍任务来做时钟节拍处理;②用时钟节拍轮盘来分类管理延时任务以及指定超时时限的等待任务。

2.1 时钟节拍任务

在 μC/OS—III中,增加了一个系统任务,即时钟节拍任务OS_TickTask()。该任务是μC/OS-III中两个总是会创建的系统任务之一。时钟节拍任务负责处理延时任务和指定超时时限的等待任务,这样,μC/OS—III就把时钟节拍的处理工作放到任务级代码中完成了。时钟节拍中断服务程序和时钟节拍任务之间的关系如图1所示。

不论在μC/OS—II还是在μC/OS—III中,都需要一个硬件定时器(或其他能产生周期性中断的外设)来产生几十到上千赫兹的时钟节拍中断。时钟节拍中断的具体频率取决于所用的处理器的性能以及应用需求。时钟节拍中断频率越高,系统的延时精度越高,对处理器的处理能力要求也越高。

每次产生时钟节拍中断,CPU都会跳转到时钟节拍中断服务程序(ISR)中执行。时钟节拍ISR会调用 OSTimeTick()函数。前面提到过,μC /OS—II的时钟节拍ISR也会调用OSTimeTick()函数,在这一点上μC/OS—II和μC/OS—III看起来没有区别,但实际上 μC/OS—III中的OS TimeTick()函数与μC/OS—II中的OSTimeTick()函数有很大区别。μC/OS—III中的OSTimeTick()函数主要完成如下操作:向时钟节拍任务发信号、调用OS_SchedRoundRobin()函数,以及向定时器任务发信号等。其中,后两点与时钟节拍的管理无关,这里不详细介绍。精简的OSTimeTick()函数如下面这段代码所示,其中只保留与时钟节拍管理相关的代码。
在 μC/OS—III中,OSTimeTick()函数不需要遍历任务链表,只是通过OSTaskSemPost()函数向时钟节拍任务发信号。而时钟节拍任务绝大部分时间内都处于等待该信号的状态,每次收到该信号时,时钟节拍任务会恢复运行,调用OS_TiekListUpdate()函数处理延时的任务,然后再次进入等待该信号的状态,其代码如下:

相比μC/OS—II的时钟节拍管理方式,μC/OS—III使用了专门的时钟节拍任务来处理时钟节拍,可大大减少时钟节拍中断服务程序的执行时间。

2.2 延时任务管理

μC/OS—III为了提高时钟节拍的处理速度,采用了哈希散列表机制来管理所有正在延时的任务和指定了超时时限的等待任务。这些任务都记录在时钟节拍列表(Tick List)中。时钟节拍列表包含两部分:一个称为时钟节拍轮盘的数组(OSCfg_TickWheel[])和一个时钟节拍计数器 (OSTickCtr),如图2所示。

时钟节拍列表中的每个任务都有一个延时结束时刻或等待超时时限,假设为TM。比如,一个任务在时钟节拍计数器数值为OSTickCtr时调用OSTimeDly()延时dly个时钟节拍,那么该任务的延时结束时刻TM就等于OSTickCtr+dly。然后,用 TM和时钟节拍轮盘的表项个数(OS_CFG_TI CK_WHEEL_SIZE)做取模运算,就可以得到一个余数I(I=TM%OS_CFG_TICK_WHEEL_SIZE)。那么,该延时任务就会放到时钟节拍轮盘第1个表项指向的任务链表中。

时钟节拍轮盘的每个表项都有3个成员:“.NbrEntriesMax”、“.NbrEntries” 和“.FirstPtr”。其中,“.FirstPtr”指向该表项对应的任务链表,所有分配到该表项的延时任务或指定超时时限的等待任务都会放到该任务链表中。“.NbrEntries”和“.NbrEntries Max”分别记录任务链表中的当前任务数目和历史最大任务数目。在任务链表中,任务按照延时结束时刻或超时时限排序,结束时刻早的任务排在链表的前面。

通过采用哈希散列表机制,在每次时钟节拍服务时,只需要处理时钟节拍轮盘的某个特定表项所指向的任务链表,因为恰好在该时钟节拍服务时延时结束或等待超时的任务都一定处于该表项所指向的任务链表中,而该表项的索引号就等于OSTickCtr%OS_CFG_TICK_WHEEL_SIZ E。另外,由于各个表项指向的任务链表中的任务是按照延时结束时刻和等待超时时限的顺序进行排序的,这样,在处理当前任务链表时,就可以从位于链表头部的任务开始判断任务延时结束时刻或等待超时时限是否等于OSTickCtr的当前值。如果等于,说明该任务延时结束或等待超时了,然后,再判断下一个任务;如果不等于,说明该任务延时没有结束或等待没有超时,同时也说明,排在链表后面的任务都不可能延时结束或等待超时,因此,可以立即结束对任务链表的处理。

由于采用了哈希散列表机制,μC/OS—III中的时钟节拍服务在大部分情况下只需要判断极少数任务的延时结束时刻或超时时限,看其是否等于时钟节拍计数器的当前值,这相比μC/OS—II中需要遍历整个任务链表的时钟节拍服务,显然效率要高很多。

结语

μC/OS —II中的时钟节拍服务有两个不足之处:一是需要遍历整个任务链表,二是需要在时钟节拍中断服务程序中进行时钟节拍的处理工作。当系统中任务数目较多时,会影响系统的实时性,这对于一个实时嵌入式操作系统来说是不完善的地方。在μC/OS—III中,通过增加一个时钟节拍系统任务并采用哈希散列表机制,很好地解决了这两点问题,即使在系统任务数目很多的时候,也可以确保系统的实时性。

围观 294

最近经常有用人单位打来电话,问有没有嵌入式Linux方面的开发人员,他们说他们单位急需要懂得在嵌入式linux环境下的软件开发人员。现在每年毕业的大学生那么多,还招不到合适的软件开发人员吗?他说,毕业大学生虽然多,但大部分都能力不够,不能达到他们的工作的要求。

该公司HR的一句话说出来我们现在的大学教学和大学生就业的现状:一方面每年那么多大学生毕业找不到合适的工作,另一方面很多用人单位和企业又找不到合适的人才。造成这种现象最基本的原因是学校教育和社会需求的严重节。很多嵌入式专业的学生在毕业后,还是很难达到用人单位的要求最主要的原因在于高校在嵌入式教学方面重理论和轻实践,很多嵌入式专业的老师也没有实际的工作经验,这样培养出的学生可能让他讲起来头头是道,但是让他去真正编写,调试一个应用程序就傻眼了,不知道从何下手,因为他们在学校的学习可能从来就没有老师带着他们实际调试过嵌入式程序,也没有机会让你去调试嵌入式应用程序,那些看起来非常不错的嵌入式实验箱大部分时间都躺在实验室睡大觉,只有在上实验课的时候搬出来让大家看2眼,摸2下,还没有弄明白怎么回事,又要收到实验室睡大觉去了。这样的教学模式,如何能培养出一名合格的嵌入式工程师呢?出现企业找不到合适的人,大学毕业生找不到合适的工作也就不奇怪了。

嵌入式专业是一门实践性非常强的学科,只有多动手,多实践,多编程,多调试,多看书,多思考才能真正掌握好嵌入式开发技术。

现在很多同学也意识到了学校培养模式和社会需求脱节问题,有一部分同学也先行行动起来,开始注重培养自己的实际动手能力,培养自己实际分析问题,解决问题的问题,培养自己在嵌入式专业实际编程,和调试程序的能力。但是嵌入式专业不同于其他学科,嵌入式专业是一门综合性非常强,涉及知识面非常广的学科,对于初学者来说,面对那么多教程,课本,那么多知识点,往往不知道从何处下手,不知道哪些是重点,哪些不是重点,这些知识点之间有什么关联,一脸的茫然,然后东一榔头,西一棒子,折腾了几个月甚至大半年后,还是找不着学习嵌入式的方向,还徘徊在嵌入式开发的大门之外。

那么,如何从零开始学习嵌入式开发技术,进入嵌入式开发大门呢,笔者根据自己的嵌入式学习经历和多年的嵌入式linux教学经验,谈谈自己对嵌入式学习的一些想法和意见,希望对大家有所帮助。

一、练好基本功

嵌入式系统专业是综合了计算机硬件技术,计算机软件技术以及电子电路技术的一门综合学科,所涉及的内涵和知识非常广泛,包括:数字电路,模拟电路,计算机组成原理,单片机基础,C语言基础,操作系统,数据结构,编译原理,计算机控制,计算机网络等知识。

在真正学习嵌入式开发之前,首先要打好基础。其中最重要的是C语言基础、数字电路、计算机组成原理三门课程。对于C语言,至少能单独编写调试一个3 ~ 500行的程序,能够了解C语言的基本语法规则,基本语句的使用,理解指针概念并能灵活使用各种指针。

计算机组成原理要能理解组成一个计算机系统的几大部件,计算机系统的结构,理解系统总线,理解处理器和计算机外部设备的关系,处理器和计算机外设是如何协调工作完成某一项功能的,计算机软件和硬件是如何分工协作完成某一项任务的,理解软件是通过寄存器来控制硬件的。

数字电路,模拟电路要了解其基本原理个概念,能看懂简单模拟、数字电路原理图。理解数字电路中的寄存器,时序的概念,能看懂芯片手册和时序图。对于其他基础课程,重点要理解其中的一些基本概念,如何使用等等。

对于电子,自动化,通信,计算机类专业的学生,在大二、大三开设的专业基础或专业课程中基本包含了以上的大部分课程。因为缺乏实践,可能学得不
是很深入,但是一些基本的概念和基本知识应该还是有所了解,针对一些薄弱环节,自己稍微加强学习一下,基本上已经具备了学习嵌入式开发的基础。在嵌入式基本功学习阶段,最重要的是C语言和单片机基础,最好是能用C语言开发一个小的单片机程序,例如用C语言实现单片机和PC的串口通信,用C语言控制LED等显示,用C语言控制数码管显示等小程序。在这个期间需要的学习工具就是单片机51学习开发板。

二、嵌入式Linux应用开发

嵌入式开发基础知识学习完后,这时候你已经有了一定的嵌入式开发基础了,可以进行基于单片机的嵌入式系统设计了。单片机编程本身也是属于嵌入式编程,但是在这里我们只是把单片机开发当作嵌入式系统开发的基础,不把单片机开发作为真正的嵌入式系统开发,在这里我们的嵌入式系统开发是指在带有操作系统的嵌入式平台上的应用和驱动开发,特别指在嵌入式linux平台上的开发。

单片机开发在很早以前是非常热门的,现在在一些比较简单的系统上单片机也用的非常广泛,随着硬件的成本不断降低,在一些比较复杂的嵌入式设备一般都采用嵌入式linux操作系统,在嵌入式linux平台上进行开发,这样可以极大的提高嵌入式开发效率,提高系统的稳定性和可靠性,降低开发成本。由于linux是一个开源的操作系统,你可以通过阅读linux内核来理解内核的实现机制,如果有需要,你甚至可以通过修改内核源码来提高系统的性能;同时,全球参与linux开发的队伍非常庞大,网上有大量的嵌入式linux开发资料和源代码,很多你需要实现的功能在网上基本都能找到相关源码,参考一下别人写的源码,这样可以极大的提高自己的工作效率和技术能力,近几年,随着参与linux开发的人越来越多,linux系统的稳定性、实时性有了很大的提高,linux系统无论在服务器上还是嵌入式设备平台上都应用越来越广泛,现在包括华为、中兴、朗讯的各大通信巨头都开始把自己设备的底层平台从vxworks操作系统迁移到linux系统,可以说嵌入式linux是嵌入式技术发展一个方向,是嵌入式技术的一面旗帜。基于以上原因,我的建议是学嵌入式开发,就学嵌入式linux开发,相对于wince等其他的嵌入式平台,你可以真正学到更多的东西,学到嵌入式技术的精髓,同时他又符合嵌入式产业发展的方向,不容易被日新月异的技术发展所淘汰。

有了嵌入式开发的基础,又知道了我们为什么要学习嵌入式linux开发,那我们就要开始动手开始学习了,那如何开始学习嵌入式linux开发,从哪里开始着手呢?

很多同学这时候就开始买linux书籍,从图书馆借了一大堆关于linux的书:什么《linux使用基础教程》、《linux源码深度分析》、《linux情景分析等》、 《linux高级使用指南》等等。结果抱着这些图书看了10天半个月还是不知所云,当初学习的激情慢慢就消退了,最后不了了之,终究没有进入嵌入式开发大门。究其原因,是因为没有找到合适学习嵌入式开发的方法,做任何事情都有方法可循,找对了学习方法往往就能事半功倍;否则就可能是事倍功半,甚至劳而无功。接下来我先分析一下同学们的几种常见的嵌入式linux学习误区,然后提出一种比较合适的嵌入式linux学习方法。

误区一、全身投入学习桌面或服务器版本linux系统

很多想学嵌入式linux 的同学经常问我,我不会linux系统,怎么学习嵌入式linux开发,于是他们就花费了大量的精力和时间去研究学习桌面版本linux系统的使用,什么redhat 、federo,、ubuntu等等都用过,如何配置linux,linux的各种使用命令都背的滚瓜烂熟,linux各种服务器的配置,还原备份各种操作非常熟悉,以为这样就学会了嵌入式linux开发。其实这是一个学习嵌入式Linux开发的误区。

Linux桌面环境只是嵌入式linux的一个开发工具,开发环境而已。我们的目标不是学习linux服务器的配置和使用,linux服务器的高级配置和使用那是另外一个领域,不属于嵌入式linux讨论的范畴。我们进行嵌入式linux开发,只是把linux桌面环境当作一个工具,在linux桌面环境下运行嵌入式linux开发工具,例如gcc 编译器,make工具来开发我们的嵌入式linux应用程序而已,对于嵌入式开发工程师来说,没有必要花费那么多的精力和时间去研究linux桌面版和服务器的应用,只要能了解最基本的操作即可。现在的桌面linux系统的图形化界面做的也相当好,跟window具有相同的易用性能,例如ubuntu很多操作都可以在图形界面下完成,就没有必要去记每个linux命令了。熟悉linux桌面系统的使用和基本操作命令,安排1~2天时间学习基本就可以掌握了。

误区二、直接阅读linux内核源代码

很多想学linux,在连linux是什么东西,一点都还不会使用的情况下去就阅读linux内核源代码,花了大量时间去阅读《linux源码深度分析》、《linux情景分析等》等书。这样的结果很可能就是看的头昏眼花,不知所云,最后只能放弃了。这也是同学们学习嵌入式linux的一个误区,在有一定嵌入式linux开发基础后,带着一定的目的去阅读linux源代码,这样可以极大的提高你的技术能力,但是你在没有任何基础,对linux一点都不了解的情况下就去阅读linux内核源代码,无异于以卵击石,最后只能是撞个头破血流。

以上分析了同学们学习嵌入式linux 开发的2个误区,那么如何正确的嵌入式linux开发呢?

做任何事情都有一个循序渐进的过程,学习嵌入式linux也一样。在有了一定的嵌入式开发基础后,学习嵌入式linux开发比较适合的切入点是从嵌入式linux应用程序开发开始,即暂时先不去关心嵌入式硬件平台,不去关心linux的底层驱动,先把精力集中在现有的嵌入式linux平台上进行嵌入式linux应用程序设计开发。学习嵌入式linux开发绝不是看看书就可以学好的,需要多实践,编程调试;因为嵌入式开发不同于普通的基于PC机或服务器的应用程序开发,嵌入式开发的应用程序是要烧写到嵌入式板卡或开发板上运行的,所以首先你要给自己购买一块开发板,现在普遍流行的嵌入式开发板都是基于三星的ARM9 CPU S3C2440,性价比极高,在这里我推荐使用灵动微电子的高性价比MM32F103开发板学习,不仅资源丰富,稳定,同时配有大量的实验源码,视频教程和实验指导书。

有了开发板后,先后开始学习嵌入式linux开发环境搭建、嵌入式linux开发模型、linux内核移植和文件系统、嵌入式linux应用程序移植、嵌入式linux多进程,多线程应用程序设计、嵌入式linux网络编程,如果对嵌入式数据库或图形软件开发有兴趣的,可以进一步学习嵌入式linux数据库开发或基于QT的嵌入式linux图形应用软件设计。每学一章节都要通过相关实验来来验证你从书上学到的东西,同时提高自己编写代码,调试程序的能力。这个过程根据不同学员的基础不同,大概要花上1 ~ 2个月时间。学完这些课程后,你就有了再现有的嵌入式linux平台上进行应用程式设计开发的能力,到一些嵌入式软件公司去,能够胜任在现有的嵌入式linux平台上进行上层的应用程序开发工作。但是目前你还不能进行嵌入式linux系统和驱动的开发,也就是说,你现在只能在一个已经构建好的嵌入式 linux平台上进行应用程序开发,而自己还没有能力根据实际需要去重新构建一个嵌入式linux平台。要让自己有能力根据实际需要重新构建一个嵌入式linux软硬件平台,这时候就需要进行下一阶段的学习了,即嵌入式linux系统和驱动开发。

三、嵌入式Linux系统和驱动开发

有了嵌入式linux平台上开发应用程序的基础,你已经对linux的功能、linux对应用程序提供的接口和系统调用有了一定的了解,知道如何利用linux提供的功能来进行应用程序开发,知道如何来使用设备驱动来进行应用程序设计,有了这些知识后,你就可以更深入的去学习Linux系统原理和基于Linux驱动的开发,Linux内核的裁剪,文件系统构,bootloader等等底层的知识了。

想要更深入学习嵌入式Linux系统和驱动开发,要学的内容非常多包括计算机软件、硬件、操作系统知识。这时候你可以参照以下的学习思路,因为嵌入式Linux系统和驱动的开发,和底层硬件联系非常紧密,所以首先我们从学习了解嵌入式硬件开始,包括:ARM体系架构、S3C2440微处理器接口设计、时钟系统、LCD屏接口、存储控制器及系统的存储空间分配、NAND FLASH接口和NOR FLASH接口等。对嵌入式系统硬件有了一定的了解后,接下来就可以开始学习bootloader了,理解bootloader的概念,功能,和原理,重点掌握U-BOOT的使用和移植。接下来就开始学习嵌入式linux内核机制,分析嵌入式Linux源码组成、内核的模块机制、内核进程管理、内存管理机制、linux的中断系统、Linux内核的移植等。有了内核的基础,就可以学习嵌入式Linux设备驱动开发了,重点掌握字符设备驱动开发,LCD屏设备驱动开发、触摸屏设备驱动开发、USB设备驱动开发,网卡设备驱动开发。学完这些知识点并通过相关实验验证后,嵌入式Linux系统和驱动的开发就算掌握了差不多了,能够胜任绝大部分基于linux平台的驱动开发工作了。学完这些知识点,根据学员的不同情况,一般需要花三个月到半年时间。通过这一阶段的学习,你在嵌入式Linux开发领域已经算是有了一定的功底,已经不再被人称为菜鸟了,已经进入嵌入式linux开发高手行列了。

四、更上一层楼

深入理解了嵌入式内核和驱动开发,这时候写个什么驱动对你已经没有什么问题了,开发过程中一些基本问题都难不倒你了。这是你可能想优化一下系统的性能,比如实时性,提高系统的启动速度,或者优化系统的内存管理机制,要达到修改内核核心机制的境界,你就需要去深入去研读linux内核源码了,参考《linux源码深度分析》、《linux情景分析等》等linux源码分析的书籍,深入理解linux各部分的实现机制和原理,以及可能存在的问题。你只有在深入理解现有代码和实现机制的基础上,才能提出更好的改进方案。如果你能达到这个境界,那你已经是高手中的高手,可以笑傲群雄了。

以上是笔者结合自己的嵌入式学习经历和嵌入式培训经验总结的一些嵌入式学习方法和步骤,这只是笔者对嵌入式学习的一些看法,希望对那些有兴趣学习嵌入式linux又不知道从哪开始学的同学们有所帮助。当然,每个人,每个同学的基础,各方面的情况都不一样,每个人都有自己适合的学习方式,本文章总结的一些学习方法和思路仅供参考,希望大家能找到适合自己的学习嵌入式开发的方式,早日进入嵌入式开发大门。

万丈高楼平地起,成功还得靠自己。有志从事嵌入式开发的同学不要再犹豫了,赶紧拿出实际行动,好好学习,为实现自己的伟大梦想而努力奋斗吧。

围观 368

通过实践、整理、分析,将自己在学习嵌入式开发过程中所总结的一些嵌入式法则、整理如下以供大家参考:

1、资源有限性法则

嵌入式计算不仅需要网络快速、一致的计算,而且也要求系统能够井然有序地将其执行代码和数据,存储在一个“ 共同” 的“ 狭小” 的空间内。

2、鲁棒性法则

嵌入式计算不仅要求系统迅速而有效的计算,而且还要求在某些计算单元出现错误的时候,系统仍然能够继续正常运行工作。

3、实时性法则

嵌入式系统的计算结果,不仅依赖于系统的逻辑运算之正确性,而且也依赖于这个运算结果的计算时间。

4、 冗余度法则

在嵌入式系统具有足够的冗余度之后,系统的“ 初始敏感性” 对于其“ 最终计算结果” 的影响就变得微乎其微了。

5、 结构性法则

对于嵌入式系统而言,其结构复杂性的趋势表明:a 系统结构越简单越有效(The[已过滤]st is the best);b系统结构越复杂越稳定(More complex is more stable) 。

6、 简约性法则

当简约一个嵌入式系统时,系统剩下的功能之间的互动关系就会变得越来越强; 当系统的功能被简约之后,外来的入侵者之成功的概率就会变得越来越大。

7、 保育性法则

如果在嵌入式系统中要想保留某个系统功能,最好是将所有的其他功能都看成是 “ 神圣不可侵 犯的 ” ;系统的功能被移出(灭绝)或者生成(入 侵),一定会造成整体(群集)结构及其动态 性能上的重大转变。

8 、组织性法则

嵌入式互联网(embedded Internet)最重要的往往不是网络中个体设备的特质,而是存在于网络中的整体秩序,即 网络秩序 。 在一个高冗余度网络中,设备的单一作用已经不再能够构成影响到系统整体性能的主要因素 了,而起主要作用的是所有结点及其所构成的连结特征。

9、 网络性法则

由一群设备相互作用的嵌入式Internet 结点所构成的网络,其整体所表现出的性质,往往与个别结点的性质没有重大关系。

10、 消息性法则

保证查寻消息:它具有严格的时间敏感或者基本常态 系统*作要求,这类消息要求一个来自系统的时间保 证。即一旦由这类消息引起的活动或者任务被执行,那么在确定的时间间隔内,它们的时间限定性必将被 系统所保证。 最佳效果消息:它具有典型的软时间限定性,即其时间限定是由活动或者任务本身的时间序列所规定,无需系统保证就能满足其时间限定性的要求。

11、 免疫性法则

嵌入式互联网(embedded Internet) 的免疫系统应当是一个仿生命体机 制,免疫功能是一个“前馈”系统,所以要求系统应具有预见能力,从而可以“以(小)毒攻(大)毒”。

12、 融合性法则

嵌入式Internet 是一个复杂网络,将复杂网络结构用简单的“组成”来解析,让系统可以由孤立的“组成”来诠释“整体”,或者让系统可以由“结点”来表达“全局”。

13、性价比法则

如果系统A是系统B地嵌入式系统,即B(a),那么 系统A 的成本应不超过系统B 成本的10 %,而系统B(a)的成本应大于系统A和系统B成本之和,系统B(a)的性价比应提高30 %。

来源:网络(版权归原著作者所有)

围观 196

首先,如果你有幸看到这篇文章,千万不要试图在2个小时内阅读完,就算你2个小时阅读完,我相信你也不会理解里面讲解的精华之处,我相信,你应该将此文章慢慢品尝,这绝对是一篇需要品尝2~3天,再结合自己过往的经验,加上自己的思考,我相信会对你不仅仅是技术能力,甚至包括整体的思维方式都会有一个非常大的提高。
  
我写这篇文章的目的,是用本人20年的嵌入式经验呈现给大家一副完整的产品,项目开发蓝图,用本人多年的经历总结了一些教训,无私的分享给各位,希望各位今后能站在本人的肩膀之上,少走弯路,多为公司,为个人多做贡献,那我的愿望就达到了,也同时希望能看到大家反馈和回复,留个脚印,留下你的见解和智慧,为后人乘凉打点基础,先在这谢谢各位了。
  
那么由此开始我们充满知识的旅程吧,最重要的一点,就是在一个产品或项目的开发过程中,如果没有明确的目标,那么成功将无从谈起,做任何事的第一步必须明确目标。
  
与日常生活中的大多数事务一样,设计一个嵌入式产品的过程也必须从确定目标开始,对生产的产品进行明确定义。对产品进行定义主要是对产品是什么和能有什么功能进行描述,其次是在我们的整个开发过程中,应该要撰写一些开发文档,大概的框架的如下:

1)产品需求文档:描述产品的特性

2)功能需求文档:描述产品必须具备的功能

3)工程说明文档:描述系统实现的方法和满足需求的手段

4)硬件说明文档:对有关硬件进行描述

5)软件或固件说明文档:描述特定处理器下设计微程序以及固件的方法

6)测试说明文档:描述必须测试的项目和验证系统正常运行的方法

一、需求定义

需求定义用来描述产品的基本功能,对于公司来说,需求一般由该公司的市场销售部门或该公司的主要客户来制定;而对小公司或爱好者,技术人员可以自己负责定义需求,并撰写成文档。

通常需求定义是围绕以下几个因素而来:

1)系统的用途(定义需要系统实现的各种功能)

2)实际输入输出是何种方式实现的(为元器件的选型做参考)

3)系统是否需要操作界面(涉及软件层操作系统的选型)

其实对小型的嵌入式产品来说,定义需求是非常关键的,因为需求清楚了,就可以避免后续开发过程中出现的诸如随机存储器(RAM)容量不足或所选的CPU速度不能满足处理的需要等一系列问题。

下面举个简单的实际例子,供大家来参考:

系统描述:用于从化温泉的水泵换水系统

电源输入:使用来自于变压器的9V~12V直流电

水泵功率:375W

1)使用单相交流电机,由机械电气进行控制

2)如果温泉池处于低水位,则输入开关闭合信号,以禁止水泵继续运行

3)用户可以自由设置水泵运行或关闭的时间长度

4)除了自动设置控制外,还需要提供一种人工装置来允许维护人员灵活控制水泵进行维修

5)水泵开启/关闭/人工干预的时间可以30分钟为单位,在30分钟到23小时的范围内进行调节

6)显示设备可以指示水泵的开关状态,剩余时间,以及水泵是否处于人工干预模式

7)具备监视低水位的功能,并显示在屏幕上

如果需要商用,那么除了上面给出的功能要求外,其设计文档中还要包括电磁干扰(EMI)和电磁兼容性(EMC)认证、安全认证以及使用环境(包括环境温度、湿度、盐雾腐蚀等)等方面的需求。

实际上,以上的需求确定之后,接下来就是要考虑选择一款合适的CPU来满足和实现系统的功能,那么我们就要将上述7点用户能够理解的需求转化成我们专业领域的需求,转化如下,大家可以参考一下:

a、处理或更新输入输出信号的速率究竟需要多快?

解释:目前嵌入式处理器的主频一般都在几十兆到几百兆不等,单片机的主频一般是几十兆,ARM处理器可以到几百兆;我们主要看这个产品是否需要对大量数据进行处理,或是否需要对缓冲区进行频繁操作,是否有类似的占用CPU资料的工作要做,这就决定我们要选择一款合适的处理器来让该产品得到最佳的性能。

b、是否可使用单片集成电路(专用IC)或FPGA来完成数据处理?

解释:如果可以的话,就不一定要选择处理器来做,用这些专业芯片就能替代

c、系统是否有大量的用户输入输出操作(如对开关和显示设备进行频繁操作)?

解释:如果有的话,要在处理器选型的时候考虑这些因素,选择一款能够满足以上要求的CPU

d.系统与其他外部设备之间需要使用何种接口?

解释:这也是需要评估处理器的一个关键问题,选择具备这些接口功能的处理器会方便于我们的电路设计以及软件编程

e、设计完成后是否有可能需要进行改动,或在设计过程中系统需求是否可能出现变化?我们的设计是否能适应系统需求的变化?

解释:要避免选择的处理器刚好满足当前要求,这样当以后事务要求逐渐提高,处理器性能如果还有一定空间的话,那么就可以重用目前的产品;第二个就是要选择不 会即将停产的芯片,很多处理器用得很广乏,可以借鉴的资料也很多,但是很可能这款芯片已经在市场上流行很长时间了,芯片厂商已经推出更新换代的替代品了, 如果你选择了这款芯片,很可能1,2年后就买不到这款处理器芯片了,导致不得不重新选择新的处理器,重新设计产品,这样的既耗费时间,金钱,更消耗人力, 延误市场的战机。

二、处理器的选择

2.1.需要使用的I/O管脚数量

多数处理器都是使用内存和外部管脚来控制输入输出设备的,通常处理器都会有内置ROM和RAM的,如果内置的内存就已经满足需要,那么处理器就可以节省产生引用外部存储器信号的引脚,这样处理器可为输入输出提供较多的设备管脚(某些处理器支持外部RAM或ROM的使用,但对外部存储器进行访问时,处理器一般需要占用8条到10条I/O管脚)。

还有,有些处理器带有专用的内部定时时钟,这类时钟也需要使用一个端口管脚来实现某些定时功能;某些处理器中还具有漏极输出和高电流输出能力,可以方便的直接驱动继电器或电磁铁线圈,而不再需要额外驱动硬件的支持。

当对处理器I/O管脚进行计数时,我们一定要把使用处理器内部功能(如串行接口和定时器等)时限制使用的某些管脚考虑在内。

2.2.需要使用的接口数量

嵌入式处理器的主要功能是与应用环境中的硬件进行交互操作,这不仅需要外部硬件对接口具有实时处理能力,而且还要求处理器必须以足够快的速度对接口数据进行有效处理,以更方便地利用这些接口开发出嵌入式产品。

需要注意的是,由于许多处理器具有的局限性没有在处理器技术资料中给予足够的说明,因此一定要仔细阅读处理器的指标说明。例如,在阅读资料的过程中发现,该资料可能会说明其串行接口可以在最高波特率下工作,但仔细研究该处理器的指标数据时,可能会发现并非该串口接口的所有操作模式都可以在最大波特率下运行。

深入了解并明确接口要求的方法:可以自己动手编写一些程序来对接口进行实际测试,以确认某种处理器是否可以满足应用的要求;因为,确认某个处理器是否可以满足接口要求并非是一件简单的任务。

2.3.需要使用的内存容量

决定内存容量的大小是嵌入式产品设计过程中的一个基本步骤,如果对所需内存容量估计过高,那么我们就有可能会选择成本较高的解决方案;反之,如果低估了所需内存容量,就有可能因系统需要重新设计而导致项目不能按时完工。

a、RAM 和ROM的区别:存储器分为随机存储器(RAM)和只读存储器(ROM)两种。其中ROM通常用来固化存储一些生产厂家写入的程序或数据,用于启动电脑和控制电脑的工作方式。而RAM则用来存取各种动态的输入输出数据、中间计算结果以及与外部存储器交换的数据和暂存数据。设备断电后,RAM中存储的数据就会丢失。

b、随即存储器(RAM)的选择:RAM容量的预测是比较直观的,我们只需把所有变量数目与所有内部缓冲区的容量以及先入先出(FIFO)队列长度和堆栈长度直接相加,就能得到所需RAM容量的总数。
如果所需内存容量超出这类处理器的寻址范围,那么只能通过增加外部RAM来满足需求;然而,增加外部RAM的同时将会占用一定数量的I/O管脚来对扩展内存进行寻址,这种扩展往往会影响到处理器来实现应用的初衷。
需要注意的一个问题是,某些微处理器限制RAM的使用,这种限制的目的是为了借用部分内存存储器作为内部寄存器组使用。除了以上因素外,所使用的开发语言也对所需RAM容量有一定的影响,某些效率较低的编译程序可能会占用大量宝贵的RAM空间。

c、只读存储器(ROM)的选择:系统所需ROM的大小应该是系统程序代码与所有基于ROM的数据表容量之和。预测所需ROM空间容量比较困难的部分是预测程序代码的长度,解决这类问题的方法只能是随着经验的逐步积累来提高预测精度。

然而,最重要的并不是精确计算程序的代码长度,而是要清楚地估算代码长度的上限。根据经验,如果80%的ROM空间被代码占用的话,那么就太拥挤了,除非能确保系统需求不会有任何变化,否则至少要为可能发生的变化保留足够的备用ROM空间。

在多数情况下,我们可以试着在ROM中写入一部分程序代码,以便观察代码占用空间的情况,对于带有内部ROM的微处理器系统来说,系统程序都只能占用有限的程序存储器空间。

d、经验之谈:ROM与RAM使用情况相类似,程序代码长度与所选用的开发语言有关。举例来说,使用汇编语言编制的程序要比使用C语言编制的程序占用少得多的空间。

对于追求低成本的小型系统来说,一般不提倡使用高级程序设计语言;这是因为虽然高级语言在使用、调试以及维护方面来的比较容易,但同时这类语言需要占用更多的内存空间和大量的处理器时钟周期。

如果开发语言选择不当,其后果可能是把一个简单、低成本的单片机系统变为一个需要使用配置若干兆字节RAM空间的64位嵌入式处理器系统。

2.4.需要使用的中断数量

中断的主要用途是向中央处理器通报当前发生的某类特殊事件,这类事件包括诸如定时器超时事件、硬件引发的事件等。

需要强调的是,多数系统设计师经常过多地使用中断功能,实际上,中断的主要作用只是中断现行程序的执行,中断最适用于必须要求中央处理器立即提供服务的事件。

在需要设计和使用中断的情况下,一定要首先确认实际需要的中断数量,然后必须考虑到系统内部占用的中断资源,如果需要使用的中断资源超出了处理器可以接收的中断数量,我们就应借助于某些特殊手段来减少所需中断信号的数量。

2.5.实时处理方面的考虑

实时处理是一个涉及范围很广的题目,其主要内容与系统的处理速度有密切联系,实时事件是嵌入式微处理器需要关注的主要任务。

例如:处理器跟串口进行通信时,通常通过上层软件(为了保证实时性,进行任务切换的时间足够短),然后再占用处理器去执行从串口拿数据的任务,并且要保证处理器的速率比串口速率快,那么处理器可以以最快的速度反应并处理串口的相关的任务,这样就可以达到最大的实时性;

另一方面,如果处理器本身就内置了串口控制器、或DMA、或LCD的控制器等,那么它就可以保证直接使用这些处理器内置的接口去控制串口、液晶屏等对象,以达到最大的实时性能。

2.6.该厂商是否提供好的开发工具和环境

选择一款新的处理器,很可能就要使用一个新的开发工具和开发环境,包括软件的编译环境等;对于开发日程安排比较紧张的项目来说,开发人员往往无法抽出专门的时间来研究,熟悉新的开发工具,从而也无法全面掌握开发工具的使用技巧。

并且,有的开发工具价格也比较昂贵,而且很可能只能从制造商那里购买,还有仿真工具也是需要付费的,这些对我们在选择一款处理器的时候,是都应该考虑进去的成本因素。

2.7.处理器速度方面的考虑

主要考虑几个细节问题:

1)处理器速度与处理器时钟之间的关系

例:单片机8031为例,由该处理器可以适应12MHz频率的输入时钟,因此就可以认为它是一个速度为12MHz的处理器了吗?不是,实际上,由于该处理器内部逻辑电路执行每条指令需要多种不同频率的时钟脉冲,因此该处理器内部时钟电路要对输入的12MHz时钟12分频处理;最终为处理器提供的只是 1MHz主频。

有的时候,80MHz主频的处理器(80MHz输入时钟,80MHz执行速度)要比200MHz主频的处理器(200MHz输入时钟,50MHz执行速度)执行速度要快得多。

2)处理器指令系统

如果不需要执行复杂数学运算的应用,那么RISC指令集的处理器要快;如果执行比较复杂的操作,则CISC指令集的处理器速度要更快。

3)芯片结构体系

现在有的芯片是将多个不同功能的核封装到一个芯片IC中,定制某种特定的功能,比如DSP,其中包括用于实现数字解码、乘法运算的硬件乘法器和移相器等; 然而,这类处理器也由其自身局限,往往在执行某些普通操作之前必须要使用额外的指令来把RAM中的数据放入内部寄存器,相比之下,一般处理器只允许对 RAM中的数据进行直接访问。

2.8.只读存储器(ROM)的选择

多数工程项目在其开发阶段一般使用可擦写可编程只读存储器(EPROM)或快速存储器(Flash Memory);这类可擦写可重复写入存储器的主要优点是可多次使用。一旦产品研制完毕,就可以用一次写入设备(OTP)来取代EPROM存储器,一次性写入器件的外观与封装几乎与EPROM完全一样,惟一不同之处就是其表面没有擦出窗口,并且价格要比EPROM低很多。

但是,另外一种情况,如果该产品今后需要升级固件,或在线编程,那么我们还是应该选择可擦写可编程的存储器。

还有一种是非易失的存储器,例如制造一台电视机,就有可能需要该设备具有记忆上次观看最后一个频道的功能,即使在切断电源后,该频道信息也不会丢失。

总结:所以,根据不同的产品选择不同的存储器也是一门很讲究的学问。

2.9.电源的要求

在某些设计中方案中,电源根本不存在问题,对电源唯一的要求就是可以为电路正常供电;实际上,选择电源主要要考虑三个方面的问题:

1)要注意设计方案中是否对电源的供电方式有所限制,例如,是否像大多数家用电器那样需要使用屋内墙上的电源插座供电,或是是使用USB接口供电

2)看系统是否需要使用电池供电方式,如果这样,我们就要考虑选择那种对驱动电流要求不高的处理器,然后再为其选择合适的电池。

3) 休眠电流:许多微处理器都支持低功率运行模式,在这种模式下,系统的CPU处理器将处于休眠状态,同时所有外部设备的电源供电都被暂时切断,以便减少系统的电能消耗;某些微处理器在这种方式下需要的维持电流极小,但也有一些微处理器在这种方式下并不能节省多少功率;不管怎样,我们都要对系统在节点模式下的工作时间有一个估测,以便对具体情况选择使用的电池。

总之,无论哪种情况,我们都要对系统需要的供电总功率做到心中有数。

2.10.设备工作环境的要求

环境要求主要内容是考虑温度,湿度等;如果系统必须在温度范围较大的环境下运行,诸如用于军事设备或汽车的控制系统,那么处理器可选择的范围就要小得多;

并且由于大范围温度变化的设备通常比较昂贵,因此在设计过程中就不能再根据一般工业级器件的价格来制定预算。

2.11.使用周期成本

如果我们的产品是mp3,在一般情况下,可以不必考虑在用户现场对mp3程序进行修改的问题,也不用为是否可以得到设备备件而着急,这是因为mp3是一种消费产品;

换句话说,如果我们的产品是价值几万块的工业设备并且需要常年不断地运行,那么我们在产品设计过程中就必须从长计议了:

a、首先,我们需要选择一种处理器或存储体系结构都可以升级的器件

b、考虑到程序升级的可能,我们还要选择较大容量的内存

c、最后要注意的则是所选处理器是否可以长期供货,这一点的重要性远远大于处理器的价格

除了上面的考虑之外,使用周期成本也是在设计之初要考虑的因素。总的来说,生产的部件越多,则可以接受的前期开发成本也就越大。

但如果我们的产品是价格昂贵的工业用设备,那么在产品的使用期内,该设备的销售量将只有几百台,毫无疑问,开发这种产品最重要的就是降低开发成本(降低开发成本而不是硬件成本!!!);除此之外,工业产品的成本也不像家用电器或消费电子产品那么敏感。综上所述,开发工业产品当然要选择一种便于进行开发并且有助于缩短开发过程的处理器。

2.12.处理器相关资料是否丰富

如果该款处理器在市场上已经用得很广了,那么我们可以获取更多的相关资料,观察人家的产品是如何使用处理器的,也能在网络上找到不少的相关的设计资料以及相关技术主题,这样就进一步降低了技术门槛,确保了使用该处理器做产品可行性,减低了风险;

反之,如果是厂商全新推出的处理器,因为市场上还没有可以借鉴的产品,我们就只能从全英文的芯片手册开始阅读,了解这款芯片,这样开发周期不仅变长,而且不可预知的风险也很大。

三、开发成本的预测和估计

大多数项目或产品都有专人负责预测整个过程的开发成本,对于任何项目来说,其开发成本主要包括人力和材料开销。

预测开发成本在很大程度上需要根据经验,这也是为什么大型公司一般指定有经验的高级工程师来完成这一任务的原因,除了人力和材料的开销之外,总结下来,还有以下的开销:

1)人力成本(开发人员、管理人员、销售人员、其他行政等辅助人员)的开销

2)材料(硬件物料和损耗,有时候需要投几次PCB版才把产品稳定下来)的开销

3)开发系统和开发工具软件的开销

4)硬件工具的开销(例如示波器、仿真器等)

对于整个项目来说,上述的开销将直接可能导致产品成本增加,其中人力成本最为关键,尤其是在中国,呵呵

四、产品开发设计文档(需要包括硬件和软件两个方面)

4.1 硬件文档撰写思路

1)首先是需求定义或产品规格:

如果这些是产品最终目标的话,那么产品对硬件和软件的要求就是技术方案的最终目标;对硬件和软件的要求是从定义用户界面和系统功能开始的。

2)其次,根据需求,系统整体定义文档中给出硬件接口的具体定义:

定义硬件最有效的方法是从需求开始描述,由于硬件必须支持系统定义的所有功能,因此硬件定义是与系统说明不可分割的;

例如,我们设计一个定时器(事先需求说明定时器不能与个人电脑连接,故无法使用CRT显示时间),我们只有两种选择:一种是使用发光二极管(LED),另 一种是使用液晶显示器件(LCD);尽管LCD的显示效果比较好,但考虑到定时器要常年位于户外,并且早期LCD显示器不能在低温下工作,最终还是选择 LED设备(这整个过程描述了我们硬件选型时的一个思路,这个是密切跟需求挂钩的)

3)一旦完成了系统整体说明文档,就开始进行系统设计:

首先要对硬件说明的内容进行细化,包括添加能让工程师理解的设计意图,以及软件工程师围绕硬件进行程序设计时需要使用的硬件信息等。

完成硬件电路板说明文档后,我们还要在该文档中增加一个用来描述系统的原始要求的前言部分,包括说明方案的设计思路和方法,除此之外,还要附上软件工程师用来对硬件进行控制所需的各类信息,这类信息主要包括如下内容(软件工程所需信息):

-----内存和I/O端口地址(如果需要,还可以提供内存映射图)

-----可用内存容量

-----状态寄存器每一位的定义

-----每个端口管脚的用途

-----外部设备的驱动方法(例如,说明输入定时器电路的时钟频率等)

-----其他有管软件人员设计程序需要了解的信息

对于比较复杂的系统来说,硬件文档中经常使用两个独立的部分来进行说明;其第一部分用来描述硬件指标和工作原理,第二部分则主要为软件人员提供程序设计需要的信息。

4.2 软件文档撰写思路

1) 软件文档与硬件文档的组织方法类似,软件要求文档的主要内容则是定义软件要实现的功能;一种是在简单项目设计过程中,软件定义也可以只对一种电路板使用的 软件给予描述;对较复杂的项目来说,由于参与这种项目的软件人员分别负责设计驱动不同硬件部分的代码(同一电路板),因此每个软件人员可能会为自己的设计 代码指定不同的定义,这类软件说明需要提供下列的内容:

-----论述包括需求定义、工程指标、硬件参数等实施项目需要的内容

-----说明软件之间、处理器之间或处理器与其内部器件之间使用的通信协议:其内容应包括对缓冲区接口机制、命令/应答协议、信号控制等协议的具体说明。

-----借助流程图、伪代码或者其他可能的方法来描述软件的实现方法和过程

2) 软件与硬件所考虑的不同之处(此经验方便技术总监或其他相关管理者参考,因为无论是多高深的技术管理者,要么是硬件出身,要么是软件出身,要么就是非技术出身)

a、软件的灵活性远远大于硬件,要让软件人员搞清楚某个软件的内部格式是非常困难的任务,解决的办法:详细定义其他程序员需要了解的编程接口具体内容,以及其他工程人员在实施开发项目过程中需要使用的技术细节信息。

b、软件工程师只有在收到硬件说明文档后,才有可能知道如何对系统硬件进行操作;而硬件人员一般不需要了解软件程序的技术细节。

c、由于软件易于更改,因此程序内容经常会按销售人员提供的要求发生变更,在某些情况下,软件文档的内容无法及时反映程序的最新变化。

d、软件经常是工程项目最后完成的部分,因此其文档也经常因时间不够而欠缺完整。实际上,软件文档是否详细、完整,在某种程度上是与公司或客户的要求有关的。例如,军事或国家工程一般要求开发商就其所有软件实现的功能提供全面详细的文档

e、有个潜规则,对软件的要求越复杂,则需求的正确可能性就越小,这个是经验之谈了,我们需要把准需求这个准绳来做文章,而不是陷入个人主义以及对软件要求而凭空发挥自己不切实际的想象。

f、我们可以先硬件设计,接着围绕该硬件编制软件。虽然实际系统的实现过程可能是软硬件并行开发,但软件人员基本上也是围绕着已经实现的硬件来进行程序设计的;对于更为复杂的系统来说,开发过程可能会出现重复。

例如,某个项目的硬件工程师和软件工程师可能会坐下来开会,共同决定使用哪种硬件来实现某种功能;软件人员可能提出需要为数据缓冲区口冲内存容量,也可能要求提供某种外部设备接口,以便充分利用现成接口程序提供的各种驱动代码。

总的来说,必须在提高软件开发效率与硬件系统的复杂性与成本之间进行权衡.

五、嵌入式高手对技术的理解(含辛茹苦这么多年的精华体验)

有很多人认为:嵌入式系统性能的核心因素是软件功能,其实,如果按照这种逻辑,系统设计中存在的问题就应由软件人员来负责;其实这个观点实际上反映了设计嵌入式产品时如何考虑划分硬件和软件各自应实现的功能,也就是这个功能是软件实现,还是考虑用硬件来实现(硬件实现:需要购买处理该功能的硬件芯片,从而增加成本;软件实现:无需增加硬件成本,但会占用处理器以及内存的资源)。

例如:我们在这里设计的基于ARM的mp3嵌入式产品,我们可以使用专业的解码芯片来负责mp3音乐文件的解码和播放功能,也可以使用另一种方法来解码mp3语音文件,让ARM处理器利用软件控制寄存器来驱动耳机或音响,处理器通过对mp3语音文件解码之后再将解码后的数据流按照一定协议格式送给音频输出的硬件接口进行播放。

优点:这种方案在硬件方面节省了一个器件,降低了成本,并且该功能还方便调试(因为是软件实现的)。

缺点:从另一个角度来看,虽然节省了一块语音解码芯片,但同时要在三个方面增加成本。

首先,要在程序中增加语音协议解码的代码;

其次,可能要把增加ROM来存放语音解码的协议,这样可以增加速度;

最后,运行该程序将占用处理器的时间和资源。

其实,话又说回来,对于本案例来说,上述成本的节约并不会引发任何问题,包括驱动程序增加也只需少量的,我们讨论这个mp3产品的案例的目的在于说明如何对软件硬件的功能进行合理划分。

总的来说,交给软件实现的功能越多,则产品的成本就越低,当然这就要处理器必须有足够的处理速度和内存空间来实现设计指定的功能;常言说得好,天下没有免费的午餐;把功能分配给软件来实现,会增加软件的复杂性、开发时间、以及程序的调试时间;然而,随着处理器的处理能力的不断提高,可以预见,越来越多的功能将会由软件来实现。

虽然在软件中实现各种功能会增加开发成本,但如果把功能移植到硬件中实现,则会增加产品的成本,这类开销是在构造每个系统组件时不可避免的。在低成本设计方案中,增加任何额外的硬件都会对产品成本产生显著的影响,因此软硬件功能划分就是一个决定产品成本的大问题。在诸如大众消费产品这一类对成本非常敏感的设计方案中,一般都会把无法通过软件实现的功能排除在外的。



围观 449

越来越多的人选择从事嵌入式开发工作,伴随而来的便是各种对硬件和寄存器的抓耳挠腮。你真的认为你现在的调试方式就是最合适的吗?先看看小粥为你带来的嵌入式调试实用秘籍!

使用集成开发环境开发基于ARM 的应用软件,包括编辑、编译、汇编、链接等工作全部在PC机上即可完成,调试工作则需要配合其他的模块或产品方可完成,目前常见的调试方法有以下几种:

1、指令集模拟器

优点:部分集成开发环境提供了指令集模拟器,可方便用户在 PC 机上完成一部分简单的调试工作。

缺点:由于指令集模拟器与真实的硬件环境相差很大,因此即使用户使用指令集模拟器调试通过的程序也有可能无法在真实的硬件环境下运行,用户最终必须在硬件平台上完成整个应用的开发。

2、驻留监控软件

优点:驻留监控软件( Resident Monitors )是一段运行在目标板上的程序,集成开发环境中的调试软件通过以太网口、并行端口、串行端口等通讯 端口与驻留监控软件进行交互,由调试软件发布命令通知驻留监控软件控制程序的执行、读写存储器、读写寄存器、设置断点等。

缺点:驻留监控软件的不便之处在于它对硬件设备的要求比较高,一般在硬件稳定之后才能进行应用软件的开发,同时它占用目标板上的一部分资 源,而且不能对程序的全速运行进行完全仿真,所以对一些要求严格的情况不是很适合。

3、JTAG 仿真器

优点:JTAG仿真器也称为JTAG调试器,是通过 ARM 芯片的JTAG边界扫描口进行调试的设备。 JTAG 仿真器比较便宜,连接比较方便,通过现 有的JTAG边界扫描口与ARM CPU 核通信,属于完全非插入式 ( 即不使用片上资源 ) 调试,它无需目标存储器,不占用目标系统的任何端 口,而这些是驻留监控软件所必需的。

缺点:由于 JTAG 调试的目标程序是在目标板上执行,仿真更接近于目标硬件,因此,许多接口问题 ,如高频操作限制、 AC 和 DC 参数不匹配,电线长度的限制等被最小化了。

使用集成开发环境配合 JTAG 仿真器进行开发是目前采用最多的一种调试方式。

4、在线仿真器

优点:在线仿真器使用仿真头完全取代目标板上的 CPU,可以完全仿真 ARM 芯片的行为,提供更加深入的调试功能。

缺点:这类仿真器为了能够全速仿真时钟速度高于100MHz的处理器,通常必须采用极其复杂的设计和工艺,因而其价格比较昂贵。

在线仿真器通常用在ARM的硬件开发中,在软件的开发中较少使用,其价格高昂也是在线仿真器难以普及的因素。

看了这么多种调试方法,哪种适合你呢?

文章来源:周立功单片机

围观 522

1、概述:

WATCHDOG对于没有底层开发经验的开发人员来说,可能比较陌生,但是它在系统起到非常重要的作用,相当于系统警察,当系统发生严重错误(如程序进入死循环等)不能恢复的时候,WATCHDOG能够让系统重启。WATCHDOG的应用主要是在嵌入式操作系统中,避免了系统在无人干预时长时间挂起的情况。

2、WATCHDOG模块

在比较高档的嵌入式硬件芯片中,都有一个WATCHDOG模块,如果在MCU/MPU中没有集成WATCHDOG,一般会在此嵌入式系统中加一个专门的WATCHDOG芯片来实现WATCHDOG机制。此模块主要的功能包括:

(1)提供WATCHDOG控制寄存器和配置寄存器,供软件开发人员根据系统需要进行灵活配置。

(2)提供一接口,使应用软件能够定时给WATCHDOG“喂狗”。

(3)提供WATCHDOG机制,当系统进入不可恢复错误时,能产生一个不可屏蔽中断来通知系统自动重启(一般这样,也有改变为其他处理方式的),只有相应的复位信号才能清除它。

3、WATCHDOG的实现方式:

对于WATCHDOG模块的实现,不同的硬件芯片有不同的方式,这里介绍2中工作方式:

(1)利用系统操作系统时钟来实现WATCHDOG

在Intel XScale系列中,利用了操作系统时钟的比较寄存器3(OSMR3)做为WATCHDOG的运行主体,当系统的WATCHDOG激活后,软件就必须在一定时间内从OSMR3读出当前的计数,然后加上一定的计数值(下一次到期的计数值),再写回到OSMR3中,软件一直周期性的重复这个过程,如果软件没有重新写入新的计数使定时器到期,此OSMR3会利用一个GPIO触发系统复位。

(2)芯片的专门WATCHDOG模块

对于现在的很多芯片,已经集成了专门的WATCHDOG模块,比如ARM11的芯片,WATCHDOG模块中,提供了比较灵活的配置和控制机制:

A、宽范围设置过期时间间隔,从0。5秒到128秒可以用户配置

B、可以灵活配置在低功耗下,使用或者停止WATCHDOG功能

C、可以灵活配置在DEBUG等状态下,使用或者停止WATCHDOG功能

根据不同的系统,设置好相应的寄存器,激活WATCHDOG后,需要应用程序周期性的服务WATCHDOG,即我们所说的“喂狗”,对于WATCHDOG模块,需要定时向Watchdog Service Register按顺序写入0x5555、0xaaaa。一般在WATCHDOG模块中还会提供Watchdog Reset Status Register,从中可以找到复位的具体原因。

3、单片机的WATCHDOG实现

许多单片机片内自带看门狗电路,单片机复位时将片内自带看门狗电路禁止,只有当程序访问该电路时,电路启动。如51系列单片机对SFR中的0A6H地址顺序写入#01EH、#0E1H;而96系列单片机则对SFR中的0A6H地址顺序写入#1EH、#0E1H;工控主机板上看门狗电路本身并不要求复位后重新启动,但BIOS在复位后将板上看门狗禁止,启动和喂狗方法与单片机相同。通常在WatchDog编程状态,只要执行如下两条指令:

outportb(0x2e,0xf6);

outportb(0x2f,TIME-OUT-VALUE);

可实现WatchDog的启停,其中TIME-OUT-VALUE ≠0启动;TIME-OUT-VALUE =0停止[2]。能够用指令禁止看门狗是为了适应用户程序开发阶段的需要,这同时给看门狗启动和运行失败留下了后门,在看门狗启动时或启动前遇干扰而使程序跑飞,则看门狗启动失败,无法行使监控职能。

4、结论

WATCHDOG在嵌入式系统中发挥着非常重要的作用,其实现方式也千差万别,根据不同的硬件设计,可以选用不同的WATCHDOG,但它们的作用是一样的:保证系统在出现不可恢复错误时,能够自动让系统重启。

围观 1219

作者:何立民

“思考”与“行为”是人类智能的两种类型。“思考”是大脑独立的思维方式,“行为”是作用于客体的智力表现。

两种不同的智能类型决定了人工智能两种形式、两条道、两种工具、两个领域。人工智能源自图灵机模型,图灵机在实现了人工智能的实用化智力内核(微处理器)后,迅速分化成两种不同的智力内核(通用微处理器与嵌入式微控制器),以满足人工智能两个领域的全面需求。

人类智能的两种表现

思维与智力行为是人类智能的两种表现方式,人类思考方式是思维,人类的行为方式是智力。无论是思维还是智力,都是知识基础上的能力与行为。动物没有知识,人们很难窥见动物思考,只能从动物的行为中了解它们的智力。人们常常喜欢将某些宠物的智力与人类相比,殊不知两者有本质不同:马戏团的小狗会数数,只是条件反射的训练结果,没有任何知识内涵。因此,人类智能是知识基础上的行为与能力。

人类智能与动物智力的本质差异是人类几百万年演化的结果。人类与动物的根本差异在于:动物们在自然竞争中演化,人类摆脱了自然竞争,进入到“认识世界、改造世界”的特殊演化道路。认识世界的思考与改造世界的行为能力构成了人类特殊智能。人们可以从人类大脑的特殊进化中,了解到这种特殊智能的演化结果。

首先是大脑容量的异常进化。百万年来,人类相对于其他物种,唯一明显的进化特征,是脑容量的急剧增长。

据人类学家统计,几百万年前,黑猩猩的脑量平均为400毫升,作为人类祖先的“南方古猿”,脑量为400~770毫升,其后进化的“爪哇人”为775~900毫升、“北京人”为850~1300毫升,现代人脑量平均为1400毫升。与此同时演化的黑猩猩,其脑容量却没有明显变化。现代神经医学研究指出,人类大脑容量的增加,主要是大脑皮层的异常发育所致。大脑皮层主管高级神经活动,体现了人类感知、认知、思维、思考的知识效应,充分表明人类智能的基础是知识。

其次,是人类左大脑的异常进化。20世纪60年代,美国心理生物学家斯佩里博士发现了人类左右大脑的割裂现象,提出了大脑不对称性的“左、右脑分工理论”,荣获1981年诺贝尔生理学或医学奖。人类左右大脑不同功能的分工现象表现在:左半脑主要负责逻辑、理解、记忆、时间、语言、判断、排列、分类、逻辑、分析、书写、推理、抑制、感觉(视、听、嗅、触、味觉)等,其思维方式具有连续性、延续性和分析性,因此左脑可以称作“意识脑”、“学术脑”、“语言脑”。右半脑主要负责空间形象记忆、直觉、情感、身体协调、视知觉、美术、音乐节奏、想象、灵感、顿悟等,思维方式具有无序性、跳跃性、直觉性等,因此右脑又可以称作“本能脑”、“潜意识脑”、“创造脑”、“音乐脑”、“艺术脑”。

百万年来,在认识世界、改造世界中演化,为了生存成为人类进化的主旋律,人类的智能最终形成了以左脑为主的思维、行为方式。可以看出,人类智能主要是知识基础上左大脑的思维(思考)与行为(智力)能力。现阶段,人工智能也将沿着这两种能力表现进行探索与实践。

一个源头的两个分支

1956年夏天,一批有远见卓识的年轻科学家聚在一起,共同研究和探讨用机器模拟人类智能的一系列有关问题,并首次提出了“人工智能”这一概念,人们认为它标志着“人工智能”这门新兴学科的正式诞生。

人工智能,除了理论研究,还必须有能实现人工智能的先进技术与工具,这就是现代计算机。因此,不少人把人工智能看成是计算机的一个分支,其源头则是图灵学者们对“可计算原理”的开创性研究成果。

图灵学者们提出“万物皆可为函数”的可计算原理,1936年5月,图灵发表了著名论文《论可计算数及其在判定问题上的应用》,并提出了图灵机概念。1946年,在图灵机思想影响下,第一台数字计算机“ENIAC”在美国宾夕法尼亚大学诞生,但体积庞大、造价高昂,与图灵理想的人工智能机相距甚远,“ENIAC”的实用化发展也受到诸多限制,直到半导体微处理器诞生,情况才得到根本的转变。

人工智能之父图灵

20世纪60年代半导体集成电路诞生后,Intel于1971年、1972年相继推出了第一代4位微处理器4004与第一代8位微处理器8008。紧随其后的是微处理器的不断改进与微处理器基础上现代计算机的快速发展。在嵌入式系统领域,1974年仙童半导体公司推出了第一个微控制器系列F8,随后微控制器开始了爆发式的创新热潮。

1976年Intel公司开始了MCS 48探索,1980年又完善成经典的8位微控制器MCS 51系列。在通用计算机领域,1981年IBM 公司在8088微处理器基础上,创建了通用计算机IBMPC。

从上面的追溯中可以看出,20世纪30年代,一批图灵学者们以“一切皆可计算”的理论与模型,成为人工智能的源头;1955年,由约翰·麦卡锡(John McCarthy)等人发起的达特茅斯会议上正式定义“人工智能”,催生了人工智能革命;20世纪70年代微处理器诞生,开启了人工智能的实践时代,其后“人工智能”大行其道,成为20世纪与空间技术、能源技术并列的三大尖端科技,又与基因工程、纳米科学一起成为21世纪三大前沿技术。

两个并行发展的人工智能领域

与人类智能的两个领域(思维与行为)相对应,微处理器诞生后,也迅速分化为通用微处理器与嵌入式微处理器,这是一个十分有趣的科技现象。“思考”是大脑在知识基础上的“思维能力”;“行为能力”是人类个体与客观世界的交互状态,除知识以外,还必须有对外部世界的感知与控制。微处理器诞生后,现代计算机智力革命就是沿着这两个领域并行发展。通用微处理器基础上的通用计算机用于实现人类大脑思维能力仿真;嵌入式微处理器基础上的嵌入式系统用于实现人类智力行为替代的智能化工具。

早期,人们以为人工智能就是对人类思维信息过程的模拟,它包括人脑的结构机制模拟与制造“类人脑”的功能模拟。微处理器诞生后,通用计算机承担了思维信息过程模拟的重任;嵌入式系统以智能化工具来替代人类智力行为,这无疑将早先人工智能的“思维仿真”进一步扩大到“行为替代”的广义领域,从此掀开了人工智能历史的新篇章。对此,有人用“强人工智能”与“弱人工智能”来区别这两种不同的人工智能领域。

“强人工智能”,是研究人类大脑及大脑思维仿真的人工智能领域。1980年,美国加州大学伯克利分校哲学教授约翰·罗杰斯·希尔勒(JohnRogersSearle)认为:“计算机不仅是用来研究人的思维的一种工具,而且,只要运行适当的程序,计算机本身就是有思维的。”因此,强人工智能领域有两类,即类人的人工智能与非类人的人工智能。类人的人工智能目标是实现人造大脑,使机器能像人类一样思考和推理,是人工智能的顶级工程,也有人称它为超强人工智能。非类人的人工智能,即机器对人脑功能的仿真。深蓝计算机“国际象棋大师”、沃森计算机“智力竞赛”、AlphaGo“围棋大师”都是机器对人脑的功能仿真,它们起源于20世纪70年代计算机的专家系统研究。

“弱人工智能”,是指用机器实现人类的智能行为,用于代替人类个体的脑力劳动。由于现代计算机的完善与广泛应用,用专家系统及智能化工具形式实现的人工智能比比皆是,充斥在人们周围,人们却视而不见。约翰·麦卡锡这位在20世纪50年代提出人工智能概念的学者也感叹于我们日常生活中每天都在使用人工智能,同时也抱怨于“一旦一样东西用人工智能实现了,人们就不再叫它人工智能了”。另外,不要一提到人工智能就想着机器人,所有内部嵌有微控制器的工具,或在计算机上实现人类思维能力的计算机软件,都是人工智能的表现形式。

全方位渗透的人工智能革命

结合现代人工智能学者温斯顿教授的简明观点—人工智能就是研究如何使计算机去做过去只有人才能做的智能工作,可以看出,20世纪50年代人工智能诞生后,由于计算机工具的滞后,人工智能领域一直没有实质性的进展。20世纪70年代半导体微处理器诞生后,微处理器基础上的现代计算机才成为实现人工智能应用的有力武器,从此开始了以人工智能为中心的现代计算机智力革命。由此构成形形色色、用于替代人类智能的工具,如集成电路芯片、通用计算智力仿真的专家系统和嵌入式系统的智能化工具。

许多业内人士都知道,半导体集成电路可以替代电子工程师的部分智力工作。过去设计一个电子时钟要了解计时原理、设计与调试计时电路,有了集成电路时钟芯片后,电子工程师只要在时钟芯片基础上添加人机交互界面即可。16位模/数转换曾经是国家级科研项目,有了16位模/数转换芯片之后,再也无人从事模/数转换的科学研究。最具说服力的是目前工科院校中模拟电路、数字电路课程内容的不断萎缩,以及大量模拟电路、数字电路专家岗位的丧失现象。

在通用计算智力仿真领域,20世纪70年代兴起了专家系统热潮,随后是形形色色的商品化软件(办公软件、科学计算/分析软件、管理软件、工程设计软件等)问世。这些商品化软件渗透到各行各业,代替人们的脑力劳动。当这些智力仿真成果铺天盖地而来时,人们不以为然。幸好有深蓝计算机“国际象棋大师”、沃森计算机“智力竞赛”、AlphaGo的“围棋大师”对人工智能的普及,让人们对人工智能有了初步的认识。

在嵌入式系统领域,微控制器以智力内核角色嵌入到工具中,实现人类工具的智能化革命。早期的工具智能化是传统电子系统的智能化改造,改造后的智能化工具代替了使用者的智力劳动。自动洗衣机代替了洗衣工的智力劳动,汽车故障自动检测系统免除了维修技师的智力劳动,智能手机多方面代替了人们生活中的智力劳动。在前沿科技领域,众多的智能化设备代替了科学家的智力劳动。

如今,在AlphaGo掀起的这股人工智能热潮中,引发了人们对机器人的众多遐想与议论。在这些遐想与议论中,人们应该意识到,我们已沉浸在一个人工智能的汪洋大海之中。多年来,人工智能彻底改变了我们的生活方式,改变了我们的世界观,只是我们往往浑然不知。

文章来源: 嵌入式资讯精选

围观 377

页面

订阅 RSS - 嵌入式