嵌入式

嵌入式软件开发流程

参照嵌入式软件的开发流程。第一步:工程建立和配置。第二步:编辑源文件。第三步:工程编译和链接。第四步:软件的调试。第五步:执行文件的固化。

在整个流程中,用户首先需要建立工程并对工程做初步的配置,包括配置处理器和配置调试设备。编辑工程文件,包括自己编写的汇编和C语言源程序,还有工程编译时需要编写的链接脚本文件,调试过程中需要编写存储区映像文件和命令脚本文件,以及上电复位时的程序运行入口的启动程序文件。

对后四种文件的理解很重要,其作用解释如下。

(1)链接脚本文件:在程序编译时起作用。该文件描述代码链接定位的有关信息,包括代码段,数据段,地址段等,链接器必须使用该文件对整个系统的代码做正确的定位。在SDRAM中调试程序、在FLASH中调试或固化后运行的链接脚本文件应加以区分。(在IDE开发环境中使用扩展名*.ld)

(2)命令脚本文件:在SDRAM中调试程序时起作用。在集成环境与目标连接时、软件调试过程中以及目标板复位后,有时需要集成环境自动完成一些特定的操作,比如复位目标板、清除看门狗、屏蔽中断寄存器、存储区映射等。这些操作可以通过执行一组命令序列来完成,保存一组命令序列的文本文件称为命令脚本文件(在 IDE开发环境中使用扩展名*.cs)。

(3)存储区映像文件:在SDRAM中调试程序时起作用。在软件调试过程中访问非法存储区在部分处理器和目标板上会产生异常,如果异常没有处理,则会导致软件调试过程无法继续,为了防止以上问题并调整仿真器访问速度以达到最合适的水平,提供这样一种用于描述各个存储区性质的文件叫存储区映像文件(在IDE开发环境中使用扩展名*.map)。

在程序的调试过程中可以选择使用存储区映像文件*.map和命令脚本文件*. cs配合程序的调试。

(4)启动文件:它主要是完成一些和硬件相关的初始化的工作,为应用程序做准备。一般,启动代码的第一步是设置中断和异常向量;第二步是完成系统启动所必须的寄存器配置;第三步设置看门狗及用户设计的部分外围电路;第四步是配置系统所使用的存储区分配地址空间; 第五步是变量初始化;第六步是为处理器的每个工作模式设置栈指针;最后一步是进入高级语言入口函数(Main函数)。

中断程序设计

中断调试方面可以采用类似矢量中断动态处理方式,让中断对应的确定地址代码调转到RAM的固定地址处,定义一个函数指针指向该固定地址,就可以随时通过替换RAM固定地址处的代码,实现动态改变中断处理函数。

具体方法是:

(1)将中断源函数指针定义在RAM中相对的固定地址,建立中断矢量表;

  void SetInterrupt (U32 vector, void (*handler)()){ InterruptHandlers[vector] = handler;}

(2)在程序中,调用具体某中断源的中断处理函数;

  如: SetInterrupt(IIC_INT,IICWriteIsr);

  /* 声明IIC中断处理函数,其中IIC_INT为 IIC中断源序号,IICWriteIsr为 IIC的写中断处理函数 */

(3)在0x18处的IRQ或0x1C处的FIQ中断入口函数中,获取中断源、清除中断挂起标志、通过已定义的中断源函数指针进入用户具体某中断处理程序。

void ISR_IrqHandler(void){ IntOffSet = (unsigned int)INTOFFSET; Clear_PendingBit(IntOffSet>>2) ;(*InterruptHandlers[IntOffSet>>2])();// 调用具体某中断处理程序}

采用动态的中断处理方法,在中断源较多的情况下,中断响应时间和程序性能得到优化。另外,在调试方面,此处理方法具有便于跟踪调试的优点,并且根据需要,可以方便变换中断处理函数。

中断调试

软件调试可以在SDRAM中或FLASH中进行。在SDRAM中,读写方便,访问速度快。一般软件调试应在RAM中完成,但当RAM空间小于FLASH程序空间,程序只能在FLASH运行和调试时,或者用户希望了解程序在FLASH中实际运行情况时,就可以在FLASH中进行程序调试。

进行中断调试时,应注意中断入口位于SDRAM中或FLASH中0x18或0x1c地址,链接脚本文件必须使整个系统的代码正确定位于0x0起始处,但SDRAM或FLASH对应的链接脚本文件及工程配置注意区别。

(1)程序在SDRAM中运行

在SDRAM中调试,使用SDRAM对应的链接脚本文件。调试过程需要以下几步:编译、链接工程;连接仿真器和电路板;下载程序(在IDE开发环境中使用扩展名*.elf);调试。

下载程序前必须启动命令脚本文件完成前述的一些特定的操作,命令脚本文件的启动在连接仿真器时自动进行,其中存储区映射应与程序在SDRAM中运行时相同,保证整个系统的代码正确定位于0x0起始处。下载程序的起始地址也为0x0,下载成功后便可进行调试工作。

(2)程序在FLASH中运行

在FLASH中调试,使用FLASH对应的链接脚本文件。调试过程需要以下几步:编译、链接工程;连接仿真器和电路板;程序格式转换(*.elf转换为*.bin);固化*.bin程序;调试。

连接仿真器后不需要下载程序,存储区映射由本身工程中启动文件运行完成,不需要命令脚本文件。在本环境调试过程中,可以设置两个硬件断点。

(3)程序从FLASH中调到SDRAM中运行

在某些应用场合,强调程序运行速度的情况下,希望程序在SDRAM中运行,这样就需要将FLASH中存储的程序,在系统上电后搬运到SDRAM某空间位置,然后自动运行。这种所谓的Bootloader技术,在DSP系统中常被采用。

调试过程分两步:

(a)首先将用户程序在SDRAM中调试通过,然后将*.bin文件固化到FLASH某一非0扇区地址空间;

(b)将自己编写的Bootloader搬运程序调试通过并将Bootloader.bin文件固化到FLASH的 0扇区地址空间,搬运程序在系统上电后,将(a)中FLASH某一非0扇区地址空间存储的程序,搬运到在SDRAM调试中同样的空间位置,实现程序在SDRAM中运行的目的。

另外注意,因为用户实际的程序中断入口必须位于FLASH的0x18或0x1c地址,所以Bootloader搬运程序还应具有中断入口的跳转功能,即把PC指针由此转向处于SDRAM空间的中断程序入口表,就是整个用户程序被搬运到SDRAM的那一位置。

如:LDR PC, =HandleIRQ

  // HandleIRQ位于SDRAM空间中断程序入口表

来源:网络、嵌入式ARM

围观 10

嵌入式软件开发编程规范很重要,很重要,很重要!

demi的头像

Ⅰ 写在前面

不知道大家有没有这样的感受:看到不规范(杂乱差)的代码,瞬间就没有看下去的欲望了。

相信大家看到标题都应该能明白编程的规范及原则对于每一个软件开发的工程师来说是多么重要。

初学者编写测试程序、小的模块程序也许不能感受它的重要性;但有经验及大型项目开发的人就知道程序的规范性对他们来说是有多么的重要。

Ⅱ 关于编程规范及原则

编程规范也就是编写出简洁、可维护、可靠、可测试、高效、可移植的代码,提高产品代码的质量。

本文针对嵌入式,主要结合C语言编程的规范给大家讲述。

1. 头文件

对于C语言来说,头文件的设计体现了大部分的系统设计,不合理的头文件布局是编译时间过长的原因。

有很多人将工程中所有的头文件包含在一个include.h文件中,然后在每一个.c源代码文件中包含include.h头文件,这样做可以让代码看上去简洁,但实际忽视了编译效率问题,而且代码的可移植性也不好。

原则:

A. 头文件中适合放置接口的声明,不适合放置实现;
B. 头文件应当职责单一;
C. 头文件应向稳定的方向包含。

规则:

硬件电路设计的几个注意事项!

demi的头像

嵌入式设计是个庞大的工程,今天就说说硬件电路设计方面的几个注意事项,首先,咱们了解下嵌入式的硬件构架。

我们知道,CPU是这个系统的灵魂,所有的外围配置都与其相关联,这也突出了嵌入式设计的一个特点硬件可剪裁。在做嵌入式硬件设计中,以下几点需要关注。

第一、电源确定

电源对于嵌入式系统中的作用可以看做是空气对人体的作用,甚至更重要:人呼吸的空气中有氧气、二氧化碳和氮气等但是含量稳定,这就相当于电源系统中各种杂波,我们希望得到纯净和稳定符合要求的电源,但由于各种因素制约,只是我们的梦想。这个要关注两个方面:

a、电压

嵌入式系统需要各种量级的电源比如常见的5v、3.3v、1.8v等,为尽量减小电源的纹波,在嵌入式系统中使用LDO器件。如果采用DCDC不仅个头大,其纹波也是一个很头疼的问题。

b、电流

嵌入式系统的正常运行不但需要稳定足够的电源,还要有足够的电流,因此在选择电源器件的时候需要考虑其负载,我设计时一般留有30%的余量。

嵌入式系统中boot的理解

demi的头像

1. 首先boot和boot loader是一个东西吗?是的,都是一个东西。

2. Boot中包含了CPU的初始化代码,Memory与外围接口的初始化代码,随后会回引系统(OS),最后将控制权交给OS,编译完成后将二进制文件烧入FLASH。如果板卡复位,CPU异常矢量或复位矢量指的地址就是FLASH地址,Flash中的Boot代码初始化CPU、Memory、简单的外设,随后把Flash中的OS移到内存里,随后OS就会引导起来。

3. boot其最大的作用就是系统初始化,分配内存,将应用代码(可以带OS,也可以不带)从FLASH中导入内存,最后将运行指针指向这段代码,把控制权交给应用程序。

4. Bootloader是在操作系统运行之前执行的一小段程序,通过这一小段程序,我们可以初始化硬件设备、建立内存空间的映射表,从而建立适当的系统软硬件环境,为最终调用操作系统内核做好准备。意思就是说如果我们要想让一个操作系统在我们的板子上运转起来,我们就必须首先对我们的板子进行一些基本配置和初始化,然后才可以将操作系统引导进来运行。

5. 没有操作系统的简单嵌入式计算机,系统上电后,通常直接进入用户应用程序,有操作系统的计算机中,上电后首先运行的是一个标准化的软件—–引导程序(bootloader)

嵌入式物联网(IoT)的六大硬件设计挑战

demi的头像

在开发嵌入式物联网设备时,硬件设计被视为物联网产品成功的关键组成部分。为了确保嵌入式物联网产品满足所需功能,功耗低、安全可靠,嵌入式物联网设备制造商在这些设备的硬件设计阶段面临许多挑战。随着物联网的出现,由于连接设备的快速发展,嵌入式系统市场出现了大幅增长。

嵌入式系统在物联网中的作用

物联网(IoT)被定义为一个过程,其中对象配备有涉及硬件板设计和开发的传感器,执行器和处理器,软件系统,Web API和协议,它们共同创建了嵌入式系统的连接环境。这种连接环境允许技术跨多个设备,平台和网络连接,创建一个通信网络,彻底改变我们与世界进行数字交互的方式。例如与我们的环境,社区和家庭的互动和行为,甚至与我们自己的身体。

我们周围的嵌入式系统采用商业系统的形式,如自动售货机,智能信息亭,AC控制器,联网汽车,酒店票据打印机等,它们能够执行独特的各种操作。因此,在设计这些嵌入式物联网系统时,需要针对特定​​功能进行设计,具有良好的产品设计质量,如低功耗,安全架构,可靠的处理器等。但是,设计嵌入式物联网硬件系统不简单。

在嵌入式系统上运行应用程序缺乏必要的灵活性

嵌入式开发项目中,首先需要做需求分析,然后根据需求分析进行综合考虑,这里给出几个嵌入式硬件设计时特别要注意的问题。

1、MCU的选择

选择 MCU 时要考虑 MCU 所能够完成的功能、MCU 的价格、功耗、供电电压、I/O 口电平、管脚数目以及 MCU 的封装等因素。MCU 的功耗可以从其电气性能参数中查到。供电电压有 5V、3.3V 以及 1.8V 超低电压供电模式。为了能合理分配 MCU 的I/O资源,在 MCU 选型时可绘制一张引脚分配表,供以后的设计使用。

2、电源

①考虑系统对电源的需求,例如系统需要几种电源,如24V、12V、5V或者3.3V等,估计各需要多少功率或最大电流(mA)。在计算电源总功率时要考虑一定的余量,可按公式“电源总功率=2×器件总功率”来计算。

②考虑芯片与器件对电源波动性的需求。一般允许电源波动幅度在 ±5% 以内。对于A/D转换芯片的参考电压一般要求 ±1% 以内。

③考虑工作电源是使用电源模块还是使用外接电源。

3、普通I/O口

①上拉、下拉电阻:考虑用内部或者外部上/下拉电阻,内部上/下拉阻值一般在 700Ω 左右,低功耗模式不宜使用。外部上/下拉电阻根据需要可选 10KΩ~1MΩ 之间。

②开关量输入:一定要保证高低电压分明。理想情况下高电平就是电源电压,低电平就是地的电平。如果外部电路无法正确区分高低电平,但高低仍有较大压差,可考虑用 A/D 采集的方式设计处理。对分压方式中的采样点,要考虑分压电阻的选择,使该点通过采样端口的电流不小于采样最小输入电流,否则无法进行采样。

③开关量输出:基本原则是保证输出高电平接近电源电压,低电平接近地电平。I/O 口的吸纳电流一般大于放出电流。对小功率元器件控制最好是采用低电平控制的方式。一般情况下,若负载要求小于10mA,则可用芯片引脚直接控制;电流在 10~100mA 时可用三极管控制,在 100mA~1A 时用 IC 控制;更大的电流则适合用继电器控制,同时建议使用光电隔离芯片。

4、A/D电路与D/A电路

①A/D电路:要清楚前端采样基本原理,对电阻型、电流型和电压型传感器采用不同的采集电路。如果采集的信号微弱,还要考虑如何进行信号放大。

②D/A电路:考虑 MCU 的引脚通过何种输出电路控制实际对象。

5、控制电路

对外控制电路要注意设计的冗余与反测,要有合适的信号隔离措施等。在评估设计的布板时,一定要在构件的输入输出端引出检测孔,以方便排查错误时测量。

6、考虑低功耗

低功耗设计并不仅仅是为了省电,更多的好处在于降低了电源模块及散热系统的成本。由于电流的减小也减少了电磁辐射和热噪声的干扰。随着设备温度的降低,器件寿命则相应延长,要做到低功耗一般需要注意以下几点:

①并不是所有的总线信号都要上拉。上下拉电阻也有功耗问题需要考虑。上下拉电阻拉一个单纯的输入信号,电流也就几十微安以下。但拉一个被驱动了的信号,其电流将达毫安级。所以需要考虑上下拉电阻对系统总功耗的影响。

②不用的I/O口不要悬空,如果悬空的话,受外界的一点点干扰就可能成为反复振荡的输入信号,而MOS器件的功耗基本取决于门电路的翻转次数。

③对一些外围小芯片的功耗也需要考虑。对于内部不太复杂的芯片功耗是很难确定的,它主要由引脚上的电流确定。例如有的芯片引脚在没有负载时,耗电大概不到1毫安,但负载增大以后,可能功耗很大。

7、考虑低成本

①正确选择电阻值与电容值。比如一个上拉电阻,可以使用4.5K-5.3K的电阻,你觉得就选个整数5K,事实上市场上不存在5K的阻值,最接近的是4.99K(精度1%),其次是5.1K(精度5%),其成本分别比精度为20%的4.7K高4倍和2倍。20%精度的电阻阻值只有1、1.5、2.2、3.3、4.7、6.8几个类别(含10的整数倍);类似地,20%精度的电容也只有以上几种值,如果选了其它的值就必须使用更高的精度,成本就翻了几倍,却不能带来任何好处。

②指示灯的选择。面板上的指示灯选什么颜色呢?有些人按颜色选,比如自己喜欢蓝色就选蓝色。但是其它红绿黄橙等颜色的不管大小(5mm以下)封装如何,都已成熟了几十年,价格一般都在5毛钱以下,而蓝色却是近三四年才发明的,技术成熟度和供货稳定度都较差,价格却要贵四五倍。(注: 这一已经是几年前的看法了)

③不要什么都选最好的。在一个高速系统中并不是每一部分都工作在高速状态,而器件速度每提高一个等级,价格差不多要翻倍,另外还给信号完整性问题带来极大的负面影响。

来源:网络

围观 82

基于STM平台且满足实时控制要求操作系统,有以下5种可供移植选择,分别为μClinux、μC/OS-II、eCos、FreeRTOS和都江堰操作系统(djyos)。

下面分别介绍这五种嵌入式操作系统的特点及不足。

1、μClinux

μClinux是一种优秀的嵌入式Linux版本,其全称为micro-control Linux,从字面意思看是指微控制Linux。同标准的Linux相比,μClinux的内核非常小,但是它仍然继承了Linux操作系统的主要特性,包括良好的稳定性和移植性、强大的网络功能、出色的文件系统支持、标准丰富的API,以及TCP/IP网络协议等。因为没有MMU内存管理单元,所以其多任务的实现需要一定技巧。

μClinux在结构上继承了标准Linux的多任务实现方式,分为实时进程和普通进程,分别采用先来先服务和时间片轮转调度,仅针对中低档嵌入式CPU特点进行改良,且不支持内核抢占,实时性一般。

综上可知,μClinux最大特点在于针对无MMU处理器设计,这对于没有MMU功能的stm32f103来说是合适的,但移植此系统需要至少512KB的RAM空间,1MB的ROM/FLASH空间,而stmf103拥有256K的FLASH,需要外接存储器,这就增加了硬件设计的成本。

μClinux结构复杂,移植相对困难,内核也较大,其实时性也差一些,若开发的嵌入式产品注重文件系统和与网络应用则μClinux是一个不错的选择。

2、μC/OS-II

μC/OS-II是在μC/OS的基础上发展起来的,是用C语言编写的一个结构小巧、抢占式的多任务实时内核。μC/OS-II能管理64个任务,并提供任务调度与管理、内存管理、任务间同步与通信、时间管理和中断服务等功能,具有执行效率高、占用空间小、实时性能优良和扩展性强等特点。

在文件系统的支持方面,由于μC/OS-II是面向中小型嵌入式系统的,即使包含全部功能,编译后内核也不到10 KB,所以系统本身并没有提供对文件系统的支持。但是μC/OS-II具有良好的扩展性能,如果需要也可自行加入文件系统的内容。

在对硬件的支持上,μC/OS-II能够支持当前流行的大部分CPU,μC/OS-II由于本身内核就很小,经过裁剪后的代码最小可以为2KB,所需的最小数据RAM空间为4 KB,μC/OS-II的移植相对比较简单,只需要修改与处理器相关的代码就可以。

综上可知,μC/OS-II是一个结构简单、功能完备和实时性很强的嵌入式操作系统内核,针对于没有MMU功能的CPU,它是非常合适的。它需要很少的内核代码空间和数据存储空间,拥有良好的实时性,良好的可扩展性能,并且是开源的,网上拥有很多的资料和实例,所以很适合向stm32f103这款CPU上移植。

3、eCos

eCos(embedded Configurable operating system),即嵌入式可配置操作系统。

它是一个源代码开放的可配置、可移植、面向深度嵌入式应用的实时操作系统。

最大特点是配置灵活,采用模块化设计,核心部分由小同的组件构成,包括内核、C语言库和底层运行包等。

每个组件可提供大量的配置选项(实时内核也可作为可选配置),使用eCos提供的配置工具可以很方便地配置,并通过不同的配置使得eCos能够满足不同的嵌入式应用要求。

eCos操作系统的可配置性非常强大,用户可以自己加入所需的文件系统。eCos操作系统同样支持当前流行的大部分嵌入式CPU,eCos操作系统可以在16位、32位和64位等不同体系结构之间移植。

eCos由于本身内核就很小,经过裁剪后的代码最小可以为10 KB,所需的最小数据RAM空间为10 KB。

在系统移植方面 eCos操作系统的可移植性很好,要比μC/OS-II和μClinux容易。

综上所述,eCos最大特点是配置灵活,并且支持无MMU的CPU的移植,开源且具有很好的移植性,也比较合适于移植到stm32平台的CPU上。但eCOS的应用还不是太广泛,还没有像μC/OS-II那样普遍,并且资料也没有μC/OS-II多。eCos适合用于一些商业级或工业级对成本敏感的嵌入式系统,例如消费电子领域中的一些应用。

4、FreeRTOS

由于RTOS需占用一定的系统资源(尤其是RAM资源),只有μC/OS-II、embOS、salvo、FreeRTOS等少数实时操作系统能在小RAM单片机上运行。

相对于C/OS-II、 embOS等商业操作系统,FreeRTOS操作系统是完全免费的操作系统,具有源码公开、可移植、可裁减、调度策略灵活的特点,可以方便地移植到各种单片机上运行,其最新版本为6.0版。

作为一个轻量级的操作系统,FreeRTOS提供的功能包括:任务管理、时间管理、信号量、消息队列、内存管理、记录功能等,可基本满足较小系统的需要。

FreeRTOS内核支持优先级调度算法,每个任务可根据重要程度的不同被赋予一定的优先级,CPU总是让处于就绪态的、优先级最高的任务先运行。

FreeRT0S内核同时支持轮换调度算法,系统允许不同的任务使用相同的优先级,在没有更高优先级任务就绪的情况下,同一优先级的任务共享CPU的使用时间。

FreeRTOS的不足:

相对于常见的μC/OS—II操作系统,FreeRTOS操作系统既有优点也存在不足。

其不足之处, 一方面体现在系统的服务功能上,如FreeRTOS只提供了消息队列和信号量的实现,无法以后进先出的顺序向消息队列发送消息;另一方 面,FreeRTOS只是一个操作系统内核,需外扩第三方的GUI(图形用户界面)、TCP/IP协议栈、FS(文件系统)等才能实现一个较复杂的系统, 不像μC/OS-II可以和μC/GUI、μC/FS、μC/TCP-IP等无缝结合。

5、都江堰操作系统(djyos)

都江堰操作系统,简称djyos,得名于一个伟大的水利工程:都江堰。

与传统操作系统不同,djyos不是以线程而是以事件为调度核心,这种调度算法使程序员摆脱模拟计算机执行过程编写程序的思维方式,而是按人类认知世界的方式编写应用程序,就如同在嵌入式编程中引入了VC似的。

djyos的调度算法使程序员可以摆脱线程和进程的束缚,djyos没有有关线程的api,一个完全不懂线程知识的程序员也可以顺利地在djyos下编写应用程序。

djyos 操作系统是以事件为核心进行调度的,这种调度策略使程序员可以按人类认知事物的习惯而不是计算机的习惯来编程。

由上所述,对于stm32f103来说,移植μC/OS-II、eCos、FreeRTOS、都江堰操作系统是合适的。

围观 165

1 嵌入式系统的知识体系

嵌入式系统的应用范围可以粗略分为两大类:
(1)电子系统的智能化(工业控制,现代农业、家用电器、汽车电子、测控系统、数据采集等等);
(2)计算机应用的延伸(MP3、手机、通信、网络、计算机外围设备等)。从这些应用可以看出,要完成一个以MCU为核心的嵌入式系统应用产品设计,需要有硬件、软件及行业领域相关知识。硬件主要有MCU的硬件最小系统、输入/输出外围电路、人机接口设计。软件设计有固化软件的设计,也可能含PC机软件的设计。行业知识需要通过协作、交流与总结获得。

概括地说,学习以MCU为核心的嵌入式系统,需要以下软件硬件基础知识与实践训练:

1:硬件最小系统(包括电源、晶振、复位、写入调试接口);

2:通用I/O(开关量输入/输出,涉及各种二值量检测与控制);

3:模数转换A/D(各种传感器信号的采集与处理,如红外、温度、光敏、超声波、方向等等);

4:数模转换D/A(对模拟量设备利用数字进行控制);

5:通信(串行通信接口SCI、串行外设接口SPI、集成电路互联总线I2C,CAN、USB、嵌入式以太网、ZigBee技术等);

6:显示(LED、LCD等等);

7:控制(控制各种设备,包含PWM等控制技术);

8:数据处理(图形、图像、语音、视频等处理或识别);

9:各种具体应用。

事实上,万变不离其宗,任何应用都可以归入这几类。而应用中的硬件设计、软件设计、测试等都必须遵循嵌入式软件工程的方法、原理与基本原则。所以,嵌入式软件工程也是嵌入式系统知识体系的有机组成部分,只不过,它融于具体项目的开发过程之中。

以上实践训练涉及硬件基础、软件基础及相关领域知识。计算机语言、操作系统、开发环境等均是完成这些目的的工具。有些初学者,容易把工具的使用与所要达到的真正目的相混淆。例如,有的学习者,学了很长时间的嵌入式操作系统移植,而不进行实际嵌入式系统产品的开发,到了最后,做不好一个嵌入式系统小产品,偏离了学习目标,甚至放弃了嵌入式系统领域。这就是进入了嵌入式系统学习误区的情况,下面对此做一些分析。

2 嵌入式系统的学习误区

关于嵌入式系统的学习方法,因学习经历、学习环境、学习目的、已有的知识基础等不同,可能在学习顺序、内容选择、实践方式等方面有所不同。但是,应该明确哪些是必备的基础知识,哪些应该先学,哪些应该后学,哪些必须通过实践才能获得的,哪些是与具体芯片无关的通用知识,哪些是与具体芯片或开发环境相关的知识。

由于微处理器与微控制器种类繁多,也可能由于不同公司、不同机构出于自身的利益,给出一些误导性宣传,特别是我国嵌入式微控制器制造技术的落后及其他相关情况,使得人们对微控制器的发展,在认识与理解上存在差异。导致一些初学者,进入了嵌入式系统的学习误区,浪费了宝贵的学习时间。下面分析初学者可能存在的几个误区。

如果说,学习嵌入式系统不是为了开发其应用产品,那就没有具体目标了,许多诸如学习方法问题也就不必谈了。实际上,这正是许多人想学,又不知从何开始学习的关键问题所在,不知道自己学习的具体目标。于是,看了一些培训广告,看了书店中书架上种类繁多的嵌入式系统的书籍,或上网以“嵌入式系统”为关键词进行查询,然后参加培训或看书,开始“学习起来”。对于有计算机阅历的人,往往选择一个嵌入式操作系统就开始学习了。不好听的比喻,有点象“瞎子摸大象”,只了解其一个侧面。这样如何能对嵌入式产品的开发过程有个全面了解呢?针对许多初学者选择“xxx嵌入式操作系统+xxx处理器”的嵌入式系统入门学习模式,我认为是不合适的。我的建议是:首先把嵌入式系统软件与硬件基础打好了,再根据实际需要,选择一种实时操作系统(RTOS)进行学习实践。要记住:RTOS是开发某些类嵌入式产品的辅助工具,是手段,不是目的。许多类嵌入式产品,并不需要RTOS。所以,一开始就学习RTOS,并不符合学习“由浅入深、循序渐进”的学习规律。

RTOS本身由于种类繁多,实际使用何种RTOS,一般需要工作单位确定。基础阶段主要学习RTOS的基本原理与在RTOS之上的软件开发方法,而不是学习如何设计RTOS。以开发实际嵌入式产品为目标的学习者,不要把过多的精力花在设计或移植RTOS上面。正如很多人使用Windows操作系统,而设计Windows操作系统只有Microsoft。许多人“研究”Linux,但不使用它,浪费时间了,人的精力是有限的,学习必须有所选择。

2.2 嵌入式系统学习误区2-硬件与软件的困惑

以MCU为核心的嵌入式技术的知识体系必须通过具体的MCU来体现、实践与训练。但是,选择任何型号的MCU,其芯片相关的知识只占知识体系的20%,80%是通用知识。但是80%的通用知识,必须通过具体实践才能进行,所以学习嵌入式技术要选择一个系列的MCU。但不论如何,系统含有硬件与软件两大部分,它们之间的关系如何?

有些学者,仅从电子角度认识嵌入式系统。认为“嵌入式系统=MCU硬件系统+小程序”。这些学者,大多学习背景是具有良好的电子技术基础知识。实际情况是,早期MCU内部RAM小、程序存储器外接,需要外扩各种I/O,没有象现在这样USB、嵌入式以太网等较复杂的接口,因此,程序占总设计量小于50%,使人们认为嵌入式系统(单片机)是“电子系统”,以硬件为主、程序为辅。但是,随着MCU制造技术的发展,不仅MCU内部RAM越来越大,Flash进入MCU内部改变了传统的嵌入式系统开发与调试方式,固件程序可以被更方便地调试与在线升级,许多情况与开发PC机程序方便程度相差无几,只不过开发环境与运行环境不是同一载体而已。这些情况使得嵌入式系统的软件硬件设计方法发生了根本变化。

有些学者,仅从软件开发角度认识嵌入式系统,甚至有的仅从嵌入式操作系统认识嵌入式系统。这些学者,大多具有良好的计算机软件开发基础知识,认为硬件是生产厂商的事,没有认识到,嵌入式系统产品的软件与硬件均是需要开发者设计的。我常常接到一些关于嵌入式产品稳定性的咨询电话,发现大多数是由于软件开发者对底层硬件的基本原理不理解造成的。特别是,有些功能软件开发者,过分依赖于底层硬件的驱动软件设计完美,自己对底层驱动原理知之甚少。实际上,一些功能软件开发者,名义上再做嵌入式软件,实际上,仅仅使用嵌入式编辑、编译环境而已,本质与开发通用PC机软件没有两样。而底层硬件驱动软件的开发,若不全面考虑高层功能软件对底层硬件的可能调用,也会使得封装或参数设计得不合理或不完备,导致高层功能软件的调用困难。从这段描述可以看出,若把一个嵌入式系统的开发孤立地分为硬件设计、底层硬件驱动软件设计、高层功能软件设计,一旦出现了问题,就可能难以定位。实际上,嵌入式系统设计是一个软件、硬件协同设计工程,不能象通用计算机那样,软件、硬件完全分开来看,要在一个大的框架内协调工作。 面对学习嵌入式系统以软件为主还是以硬件为主,或是如何选择切入点,如何在软件与硬件之间取得一些平衡。对于这个困惑的建议是:要想成为一名真正的嵌入式系统设计师,在初学阶段,必须重视打好嵌入式系统的硬件与软件基础。以下是从事嵌入式系统设计二十多年的一个美国学者John Catsoulis 在《Designing Embedded Hardware》一书中关于这个问题的总结:嵌入式系统与硬件紧密相关,是软件与硬件的综合体,没有对硬件的理解就不可能写好嵌入式软件,同样没有对软件的理解也不可能设计好嵌入式硬件。

嵌入式系统产品种类繁多,应用领域各异。在2.1小节中,我们把嵌入式系统的应用范围粗略分为电子系统的智能化与计算机应用的延伸两大类,从初学者角度,可能有分别从这两个角度片面认识嵌入式系统的问题。因此,一些从电子系统智能化角度认识嵌入式系统的学习者,可能会忽视编程结构、编程规范、软件工程的要求、操作系统等知识的积累。另一些从计算机应用的延伸角度认识嵌入式系统的学习者,可能会把通用计算机学习过程中的概念与方法生搬硬套到嵌入式系统的实践中,忽视嵌入式系统与通用计算机的差异。

实际上,在嵌入式系统学习与实践的初始阶段,应该充分了解嵌入式系统的特点,根据自身的已有知识结构,制定适合自身情况的学习计划。目标应该是打好嵌入式系统的硬件与软件基础,通过实践,为成为良好的嵌入式系统设计师建立起基本知识结构。学习过程,可以通过具体应用系统为实践载体,但不能拘泥于具体系统,应该有一定的抽象与归纳。例如,有的初学者开发一个实际控制系统,没有使用实时操作系统,但不要认为实时操作系统不需要学习。又例如,有的初学者以一个带有实时操作系统的样例为蓝本进行学习,但不要认为,任何嵌入式系统都需要使用实时操作系统,甚至把一个十分简明的实际系统加上一个不必要的实时操作系统。因此,片面认识嵌入式系统,可能导致学习困惑。应该根据实际项目需要,锻炼自己分析实际问题、解决问题的能力。这是一个比较长期的学习与实践过程,不能期望通过短期培训完成整体知识体系的建立,应该重视自身实践,全面地理解嵌入式系统的知识体系。

嵌入式系统的大部分初学者需要选择一个微控制器(MCU)进行入门级学习,面对众多厂家生产的微控制器系列,不知如何是好。

首先是关于位数问题,目前主要有8位、16位、32位,面对嵌入式系统应用的多样性,不同位数的MCU各有应用领域,这一点与通用微机有很大不同。你做一个遥控器,不需要使用一个32位MCU,可能一个MCU芯片价格已经超过遥控器价格需求。对于首次接触嵌入式系统的学习者,可以根据自己的知识基础选择入门芯片的位数。建议大多数初学者,可以选择一个8位MCU作为快速入门芯片,了解一些汇编与底层硬件知识,之后再选一个16位或32位芯片进行学习实践。

关于芯片选择的另一个误区,认为有“主流芯片”存在,嵌入式系统也可以形成芯片垄断。这完全是一种误解,是套用通用计算机系统的思维模式,而忽视了嵌入式系统应用的多样性。

关于学习芯片选择还有一个误区,是系统的工作频率。误认为选择工作频率高的芯片进行入门学习,表示更先进。实际上,工作频率高可能给初学者带来学习过程中的不少困难。

实际嵌入式系统设计不是追求芯片位数、工作频率、操作系统等因素,而是追求稳定可靠、维护、升级、功耗、价格等指标。而初学者选择入门芯片,是通过某一MCU作为蓝本获得嵌入式系统知识体系的通用基础,其基本原则是:入门时间较快、硬件成本较少,知识要素较多,学习难度较低。

3 基础阶段的学习建议

基于以上讨论,下面对广大渴望学习嵌入式系统的学子提出几点基础阶段的学习建议:

(1)嵌入式系统软件硬件密切相关,一定要打好软件硬件基础。其实,只要找到正确的方法,加上努力,任何理工科学生,甚至非理工科学生,都能学好嵌入式系统。

(2)选择一个芯片及硬件评估板(入门芯片最好是简单一点,例如8位MCU)、选择一本好书(最好有规范的例子)、找一位好老师(最好是有经验且热心的)。硬件评估板的价格一定要在1000元以下,不要太贵,最好能有自己动手的空间。不花一分硬件钱,要想学好嵌入式系统不实际。因为,这是实践性很强的学科。好书,可以使你少走弯路,不会被误导,要知道有的书是会使人进入学习误区的。好老师也可以是做过一些实际项目的学长(一定要找做过几个成功项目的学长或老师做指导,否则,经验不足也可能误导),有教师指导,学习进程会加快(人工智能学科里有个术语叫无教师指导学习模式与有教师指导学习模式,无教师指导学习模式比有教师指导学习模式复杂许多)。

(3)许多人怕硬件,其实嵌入式系统硬件比电子线路好学多了。只要深入理解MCU的硬件最小系统,对I/O口、串行通信、键盘、LED、LCD、SPI、I2C、PWM、A/D(包括一些传感器)、D/A等逐个实验理解,逐步实践。再通过自己做一个实际的小系统,底层硬件基础就有了。各个硬件模块驱动程序的编写是嵌入式系统的必备基础。学习嵌入式系统的初期,这个过程是必须的。

(4)至于嵌入式实时操作系统RTOS,一定不要一开始就学,这样会走很多弯路,也会使你对嵌入式系统感到畏惧。等你软件硬件基础打好了,再学习就感到容易理解。实际上,众多嵌入式应用,并不一定需要操作系统。也可以根据实际项目需要再学习特定的RTOS。一定不要被一些嵌入式实时操作系统培训班宣传所误导,而忽视实际嵌入式系统软件硬件基础知识的学习。

(5)要避免片面地单纯从“电子”或“计算机软件”角度认识嵌入式系统。前面说过,嵌入式系统是软件与硬件的综合体。因此,要逐步从MCU的最小系统开始,一点一点理解硬件原理及底层硬件驱动编程方法。要通过规范的例子,理解软件工程封装、可复用等思想。通过规范编程,积累底层构件(Component),也就是一个一个模块,但是要封装得比较好,可复用。

(6)注重实验与实践。这里说的实验主要指通过重复或验证他人的工作,目的是学习基础知识,这个过程一定要经历。实践是自己设计,有具体的“产品”目标。如果你能花500元左右自己做一个具有一定功能的小产品,且能稳定运行1年以上,就可以说接近入门了。

(7)关于入门芯片的选择。不要选太复杂的微控制器作为入门芯片,不能超越学习过程。不要一下子学习几种芯片,可以通过一个芯片入门并具有一个实践经验后,根据实际需要选择芯片开发实际产品。注意,不要把微处理器(MPU)与微控制器(MCU)概念相混淆,微处理器只是微控制器的内核。

(8)关于操作系统的选择。可以等到你具有一定实践后,选择一个简单容易理解原理的进行学习,不要一开始就学习几种操作系统,理解了基本原理,实践中确有实际需要再学习也不迟。人总是要不断学习的。

(9)关于汇编与C语言的取舍。随着MCU对C编译的优化支持,对于汇编可以只了解几个必须的语句,直接使用C语言编程。但必须通过第一个程序理解芯片初始化过程、中断机制、程序存储情况等区别于PC机程序的内容。另外,为了测试的需要,最好掌握一门PC机编程语言。

(10)要明确自己的学习目的,并注意学习方法。关于学习目的要明确是打基础,还是为了适应某些工作而进行的短训;而学习方法方面,要根据学习目的选择合适的学习途径,注意理论学习与实践、通用知识与芯片相关知识、硬件知识与软件知识的平衡,要在理解软件工程基本原理基础上理解硬件构件与软件构件等基本概念。

以上建议,仅供参考。 当然,以上只是基础阶段的学习建议,要成为良好的嵌入式系统设计师,还需要在实际项目中锻炼,并不断学习与积累经验。

来源:单片机精讲吴鉴鹰

围观 56

时间片轮询法,在很多书籍中有提到,而且有很多时候都是与操作系统一起出现,也就是说很多时候是操作系统中使用了这一方法。不过我们这里要说的这个时间片轮询法并不是挂在操作系统下,而是在前后台程序中使用此法。也是本文要详细说明和介绍的方法。

对于时间片轮询法,虽然有不少书籍都有介绍,但大多说得并不系统,只是提提概念而已。下面本人将详细介绍本人模式,并参考别人的代码建立的一个时间片轮询架构程序的方法,我想将给初学者有一定的借鉴性。

这里我们先介绍一下定时器的复用功能。

使用1个定时器,可以是任意的定时器,这里不做特殊说明,下面假设有3个任务,那么我们应该做如下工作:

1. 初始化定时器,这里假设定时器的定时中断为1ms(当然你可以改成10ms,这个和操作系统一样,中断过于频繁效率就低,中断太长,实时性差)。

2. 定义一个数值:

代码:
#define TASK_NUM (3) // 这里定义的任务数为3,表示有三个任务会使用此定时器定时。
uint16 TaskCount[TASK_NUM] ; // 这里为三个任务定义三个变量来存放定时值
uint8 TaskMark[TASK_NUM]; // 同样对应三个标志位,为0表示时间没到,为1表示定时时间到。

3. 在定时器中断服务函数中添加:

代码:
void TimerInterrupt(void)
{
uint8 i;

for (i=0; i
{
if (TaskCount[i])
{
TaskCount[i]--;
if (TaskCount[i] == 0)
{
TaskMark[i] = 0x01;
}
}
}
}

代码解释:定时中断服务函数,在中断中逐个判断,如果定时值为0了,表示没有使用此定时器或此定时器已经完成定时,不着处理。否则定时器减一,知道为零时,相应标志位值1,表示此任务的定时值到了。

4. 在我们的应用程序中,在需要的应用定时的地方添加如下代码,下面就以任务1为例:

代码:
TaskCount[0] = 20; // 延时20ms
TaskMark[0] = 0x00; // 启动此任务的定时器

到此我们只需要在任务中判断TaskMark[0] 是否为0x01即可。其他任务添加相同,至此一个定时器的复用问题就实现了。用需要的朋友可以试试,效果不错哦。

通过上面对1个定时器的复用我们可以看出,在等待一个定时的到来的同时我们可以循环判断标志位,同时也可以去执行其他函数。

循环判断标志位:
那么我们可以想想,如果循环判断标志位,是不是就和上面介绍的顺序执行程序是一样的呢?一个大循环,只是这个延时比普通的for循环精确一些,可以实现精确延时。

执行其他函数:
那么如果我们在一个函数延时的时候去执行其他函数,充分利用CPU时间,是不是和操作系统有些类似了呢?但是操作系统的任务管理和切换是非常复杂的。

下面我们就将利用此方法架构一直新的应用程序。

时间片轮询法的架构:

1.设计一个结构体:

代码:
// 任务结构
typedef struct _TASK_COMPONENTS
{
uint8 Run; // 程序运行标记:0-不运行,1运行
uint8 Timer; // 计时器
uint8 ItvTime; // 任务运行间隔时间
void (*TaskHook)(void); // 要运行的任务函数
} TASK_COMPONENTS; // 任务定义

这个结构体的设计非常重要,一个用4个参数,注释说的非常详细,这里不在描述。

2. 任务运行标志出来,此函数就相当于中断服务函数,需要在定时器的中断服务函数中调用此函数,这里独立出来,并于移植和理解。

代码:
void TaskRemarks(void)
{
uint8 i;
for (i=0; i// 逐个任务时间处理
{
if (TaskComps[i].Timer) // 时间不为0
{
TaskComps[i].Timer--; // 减去一个节拍
if (TaskComps[i].Timer == 0) // 时间减完了
{
TaskComps[i].Timer = TaskComps[i].ItvTime; // 恢复计时器值,从新下一次
TaskComps[i].Run = 1; // 任务可以运行
}
}
}
}

大家认真对比一下次函数,和上面定时复用的函数是不是一样的呢?

3. 任务处理

代码:
void TaskProcess(void)
{
uint8 i;
for (i=0; i// 逐个任务时间处理
{
if (TaskComps[i].Run) // 时间不为0
{
TaskComps[i].TaskHook(); // 运行任务
TaskComps[i].Run = 0; // 标志清0
}
}
}

此函数就是判断什么时候该执行那一个任务了,实现任务的管理操作,应用者只需要在main()函数中调用此函数就可以了,并不需要去分别调用和处理任务函数。

到此,一个时间片轮询应用程序的架构就建好了,大家看看是不是非常简单呢?此架构只需要两个函数,一个结构体,为了应用方面下面将再建立一个枚举型变量。

下面我就就说说怎样应用吧,假设我们有三个任务:时钟显示,按键扫描,和工作状态显示。

1. 定义一个上面定义的那种结构体变量

代码:

static TASK_COMPONENTS TaskComps[] =
{
{0, 60, 60, TaskDisplayClock}, // 显示时钟
{0, 20, 20, TaskKeySan}, // 按键扫描
{0, 30, 30, TaskDispStatus}, // 显示工作状态
// 这里添加你的任务。。。。
};

来源:网络

围观 47

ARM嵌入式系统硬件设计

图1是系统硬件结构图“系统采用外部3.6864MHz的晶振产生内核所需要的18.432MHz、36.864MHz、49.152MHz或73.728MHz的时钟。

一招教你ARM嵌入式系统硬件怎么用?

以下主要针对此硬件开发平台,进行结构、储存器扩展、主要接口、显示及其外设方面设计的介绍。

1、电源部分设计

电源是系统可靠工作的保证,包括供电和复位电路部分。系统复位模块提供CS89712启动信号。系统采用nPOR信号作为复位信号,使用复位芯片产生复位信号。如图2:

一招教你ARM嵌入式系统硬件怎么用?

整个系统的外部电源输入采用直流18V-36V,系统的供电较为复杂,电压等级多,其中CS89712芯片I/0和内核分别采用3.3V.2.5V供电,而扩展的MAX125、LCD显示器采用5V供电,同时LCD对比度调节需负电压偏置(选用MAX686芯片);而模拟量采集MAX125前向通道中滤波和电压跟随电路所用运放电源电压为正、负12V。

这里采用Ericsson的DC/DC电源模块PKC2131PI,提供隔离的正负12V和+5V,同时选用MICREL公司MIC2211-2.5/3.3BML型双输出LDO提供CS89712的3.3V和2.5V。图3为CS89712双电源供电电路:

一招教你ARM嵌入式系统硬件怎么用?

2、存储器部分设计

本系统采用FLASH存储程序和参数,使用SDRAM作为程序的运行空间。数据及堆栈。CS89712内置了SDRAM控制器和内存接口。其中FLASH部分采用2片Intel公司TE28F320B3BA110,构成32位宽8MB的FLASH,SDRAM采用2片NEC公司uPD-4564163G5,构成32位宽16MB的SDRAM,如图4:

一招教你ARM嵌入式系统硬件怎么用?

3、LCD硬件扩展设计

液晶显示器(LCD)具有显示信息丰富、功耗低、体积小、重量轻等其他显示器无法比拟的优势,目前在智能仪表仪器和低功耗电子产品中得到了广泛的应用。

CS89712内置了LCD控制器,LCD控制器就相当于嵌入式系统的显卡,接口有以下信号:DD[0:3](数据线)、FRM(帧同步信号)、CL1(行同步信号)、CL2(象素数据时钟)、M(交流偏置信号)。这里我们扩展的是一个STN的彩色LCD,该LCD显示屏提供8位数据接口。表1为CS89712和该LCD控制信号接线对应表。

一招教你ARM嵌入式系统硬件怎么用?

4、触摸屏硬件扩展设计

触摸屏输入部分由触摸屏、触摸屏控制器组成,和LCD配合可以实现完整的人机操作界面。图7为实际的触摸屏输入系统部分,采用四线电阻式触摸屏,触摸屏控制器采用T[(BB)公司的ADS7846,其可以通过SPI接口直接和CS89712相接。

一招教你ARM嵌入式系统硬件怎么用?

5、以太网接口的设计

由于CS89712内部集成了CS8900A以太网控制器其本身带有802.3MAC引擎、Buffer、串行EEP-ROM接口和10BASE-T的模拟前端。只需增加I/O隔离滤波器和RJ45接口即可。此部分电路如图8:

一招教你ARM嵌入式系统硬件怎么用?

6、数据采集硬件扩展设计

MAX125是MAXIM公司生产的高速2X4通道同步采样14位逐次比较型A/D转换芯片,其模拟输入范围为正负5V,内部具有2.5V参考电源,内置有四个采样/保持放大器(T/H)。输入分为A、B两组,通过开关的切换可以对八个通道进行采集,转换所得的数字量都存储在4X14的RAM中。

其并行接口数据访问和总线释放的定时特性与CS89712芯片总线的特性兼容,故两者可以直接相连而不需等待状态。由于MAXI25为+5V供电,在与I/O电源电压为3.3V的CS89712联接时需要使用总线电平转换芯片74LVC245A,其中采用读写控制信号控制总线转换方向,转换完成后自动申请CS89712的外部中断EINT1,读取A/D数据自动会撤消该中断。通过在前向通道加接限幅保护、电压跟随和滤波输入电路,即可完成模拟数据采集电路的设计。

税控收款机应用举例

一、基于S3C44B0的税控收款机

1、采用嵌入式CPU(S3C44B0)
2、从系统结构上改变目前收款机应用系统中出现的高端机(由PC机组成系统)成本过高与低端机(由单片机组成系统)资源不足的状况,使嵌入式系统在税控收款机上得到广泛应用。

二、税控收款机组成框图

一招教你ARM嵌入式系统硬件怎么用?

三、税控收款机硬件组成

1、CPU:S3C44B0
2、存储器:FLASH、SDRAM、NANDFLASH
3、显示器:LCD、VFD
4、触摸屏:四线电阻式触摸屏
5、PS/2外设接口:键盘、条码扫描器、磁卡扫描器
6、RS232、并行口扩展接口:用外设扩展芯片实现
7、网络扩展接口
8、电源模块:主板电源、MODEM电源、VFD电源等

四、POS机软件组成

1、操作系统
1)采用uCLinux操作系统,不需要MMU支持,内核可裁减
2)包括了完善的TCP/IP协议栈,PPP拨号网络

2、图形系统
采用MiniGUI,中国人自行开发,界面美观,移植简单

3、应用程序
1)商业功能模块
2)税控功能模块
3)报表功能模块
4)管理设置功能模块
5)其它功能模块

来自:电源网

围观 101

页面

订阅 RSS - 嵌入式