1.什么是嵌入式系统 ?
答:一个嵌入式系统(embedded system)就是一个计算机硬件和软件的集合体,也许还包括其他一些机械部件,它是为完成某种特定的功能而设计的。通用计算机本身就是由很多嵌入式系统组成的。
2.实时系统
答:现在很有必要介绍一下嵌入式系统的一个子集。按照通常的定义,实时系统(realtimesystem)就是有一定时间约束的计算机系统。换句话说,实时系统可以部分地从及时完成计算或判断的能力来辨别。这些重要的计算有完成的明确期限,并且,对实际应用来说,一个延期的反应就像一个错误的结果一样糟糕。分类:硬实时,软实时嵌入式系统。
3.处理能力
答:要完成目标所需的运算能力。一个常用来衡量运算能力的指标是 MIPS(以百万计算的每秒可执行的指令数量)。如果两个处理器的指标分别是 25MIPS和40MIPS,那么就说后者的运算能力更强一些。但是,还需要考虑处理器的其他一些重要特性。其中之一是寄存器字长,一般会是 8到 64位。现在的通用计算机一般使用 32 位或 64 位的处理器,但是嵌入式系统通常仍使用更老、更便宜的 8位和 16位处理器。
表 1-1 嵌入式系统常见的设计需求
4.LED 闪烁程序的高层部分如下所示。这部分程序是与硬件无关的。不过,
它还要依赖分别使用和硬件有关的toggleLed()和delay()来改变LED的状态和控
制计时。
/******************************************************************/
* Function main()
* Description: Blink the green LED once a second
* Notes: This outer loop is hardware-independent. However.
* it depends on two hardware-dependent functions.
* Returns: This routine contains an infinite loop.
/******************************************************************/
void
main(void)
{
while(1)
{
toggleLed(LED_GREEN); /*Change the state of the LED.*/
delay(500); /*Pause for 500 millisenconds.*/
}
} /*main()*/
toggleLed
在 Arcom 的电路板上,有两个 LED:一红一绿。每个 LED 的状态都被一
个叫做端口 2I/O 锁存寄存器(缩写是 P2LTCH)的一个位来控制。这个寄存器
和 CPU在同一个芯片里,它实际上包含了芯片外围的 8个 I/O 引脚的锁存状态。
这 8个引脚合在一起叫做端口 2。P2LTCH 寄存器里的每一位都和相应的 I/O 引
脚的电压联系到一起。比如,第 6位控制送到绿色 LED 的电压:
#define LED_GREEN 0X40 /* The green LED is controlled by bit 6.*/
通过修改这一位,就可以改变相应外部引脚的电压从而改变了绿色LED的状态。
如图 2-1 所示,当 P2LTCH 的第 6 位是 1 的时候 LED 关,第 6 位是 0 则 LED
打开。
* Function toggleLed()
* Description: Toggle the state of one or both LEDs.
* Notes: This function is specific to Arcom’s Target188EB board.
* Returns: None defined.
/******************************************************************
void
toggleLed(unsigned char ledMask)
{
asm {
mov dx, P2LTCH /*Load the address of the register.*/
in al, dx /*Read the content of the register.*/
mov ah, ledMask /*Move the ledMask into a register.*/
xor a1, ah /*Toggle the requested bits.*/
out dx, al /*Write the new register contents.*/
}
} /*toggleLed()*/
delay()
我们也需要在切换 LED 的动作之间实现一个半秒(500ms)的延时。这是
通过在如下所示的 delay 例程里使用忙等待技术实现的。这个例程接受以毫秒计
的参数作为请求的延迟时间,然后用这个参数和常数 CYCLES_PRE_MS 相乘
来得到为了延迟制定时间需要的 while循环重复次数。
/******************************************************************
* Function delay()
* Description: Busy-wait for the requested number of milliseconds.
* Notes: The number of decrement-and-test cycles per millisecond
* was determined through trial and error. This value is
* dependent upon the processor type and speed.
* Returns: None defined.
/******************************************************************
void
delay(unsigned int nMilliseconds)
{
#define CYCLES_PER_MS 260 /*Number of decrement-and-test cycles.*/
unsigned long nCycles = nMilliseconds * CYCLES_PER_MS;
while(--nCycles);
}
} /*delay()*/