嵌入式学习笔记(C和C++嵌入式系統編程)【1】

来源:互联网 发布:tcp端口 编辑:程序博客网 时间:2024/06/04 21:57

1.什么是嵌入式系统 ?

答:一个嵌入式系统(embedded system)就是一个计算机硬件和软件的集合体,也许还包括其他一些机械部件,它是为完成某种特定的功能而设计的。通用计算机本身就是由很多嵌入式系统组成的。

2.实时系统

答:现在很有必要介绍一下嵌入式系统的一个子集。按照通常的定义,实时系统(realtimesystem)就是有一定时间约束的计算机系统。换句话说,实时系统可以部分地从及时完成计算或判断的能力来辨别。这些重要的计算有完成的明确期限,并且,对实际应用来说,一个延期的反应就像一个错误的结果一样糟糕。分类:硬实时,软实时嵌入式系统。

3.处理能力

答:要完成目标所需的运算能力。一个常用来衡量运算能力的指标是 MIPS(以百万计算的每秒可执行的指令数量)。如果两个处理器的指标分别是 25MIPS40MIPS,那么就说后者的运算能力更强一些。但是,还需要考虑处理器的其他一些重要特性。其中之一是寄存器字长,一般会是 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个引脚合在一起叫做端口 2P2LTCH 寄存器里的每一位都和相应的 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()*/

 

原创粉丝点击