黄少天同人bg:嵌入式软件系统设计方法

来源:百度文库 编辑:中财网 时间:2024/04/28 06:19:15
       记得上一次师兄去应聘一嵌入式公司,当时有一道题问的就是关于嵌入式软件系统设计中的前后台系统的。听师兄说,他当时也是回答得含含糊糊的,确实没有真正地理解前后台系统的设计方法。这些天,翻阅张大波主编的《嵌入式系统原理、设计与应用》一书时,发现书中对嵌入式软件系统设计方法的描述很系统,也很清晰,故将其内容概括记录下来。
       嵌入式系统有复杂和简单之分。简单的嵌入式系统可以不使用嵌入式操作系统,直接在裸机上开发;而复杂的嵌入式系统则通常推荐使用嵌入式操作系统。
1、
无操作系统的嵌入式系统设计
(1)      
前后台系统
       不复杂的小系统可以设计成前后台系统。应用程序是一个无限循环,巡回地执行多个事件,完成相应的操作,这一部分软件称为后台,通常在主程序main()中被调用。中断服务程序处理异步事件,这一部分可以看成是前台。因此,后台也可称为任务级,而前台则被称为中断级。注意,强实时性的关键操作都必须用中断来实现。
       前后台系统的程序设计通常包括两大部分:主程序main循环和中断处理程序。程序框架如下:
               
               
                main()
{
    /* 硬件初始化 */
    /* 后台程序 */
    while (1)      
    {
        action1();
        action2();
        ...
        actionn();
    }
}
action1()
{
    /* 执行操作1 */
    ...
}
action2()
{
    /* 执行操作2 */
    ...
}
    ...
actionn()
{
    /* 执行操作n */
    ...
}
isr1()
{
    /* 中断1的中断服务程序 */
    ...
}
isr2()
{
    /* 中断2的中断服务程序 */
    ...
}
    ...
isrn()
{
    /* 中断n的中断服务程序 */
    ...
}
       这种系统的实时性有一定的问题,因为中断服务程序提供的数据直到后台程序运行到该处理这个数据时,才能得到处理。
(2)      
中断(事件)驱动系统
       对于省电系统的设计,可以采用中断驱动的程序设计方法,整个软件系统完全由中断服务程序实现。
       该设计方法包括主程序和中断服务程序两部分:主程序完成系统的初始化,如硬件的初始化等,初始化完成后执行低功耗指令进入低功耗方式;而每当外部事件发生时,相应的中断服务程序被激活,执行相关的处理,处理完成后,又进入到低功耗状态。其程序框架如下:
main()
{
    /* 系统初始化 */
    while (1)
        enter_low_power();
}
isr1()
{
    /* 处理中断事件 */
    ...
}
上面的代码中,主程序main()中除了系统开始运行时的初始化代码后,没有事件处理代码。
(3)      
巡回服务系统
       如果嵌入式微处理器/微控制器的中断源不多,那么采用中断驱动的程序设计方法有一定的局限性,因为无法将所有外部事件与中断源相关联。这时一般采用的方案有两种:一种是使用中断控制器之类的扩展中断源的芯片,进行中断扩展,但这种方法一般不推荐使用,因为扩展硬件带来的问题很多:系统复杂、成本高,同时也会浪费处理器的I/O引脚等资源。另一种方法则是采用软件的方法,即巡回服务系统,它把对外部事件的处理由主循环完成。这样的设计即使嵌入式微处理器没有中断源也可以完成软件的设计。
       程序框架如下:
main()
{
    /* 系统初始化 */
    while (1)
    {
        action1();      /* 巡回检测事件1并处理事件 */
        action2();      /* 巡回检测事件2并处理事件 */
        ...
        actionn();      /* 巡回检测事件n并处理事件 */
    }
}
(4)      
基于定时器的巡回服务系统
       巡回服务系统解决了中断源的数量小于外部事件数量的问题,但是处理器总是处于全速运行状态(即我们通常所说的Poll轮循方法),处理器的开销比较大,带来的问题是能耗高。如果系统的外部事件不是发生得很频繁,那么可以降低处理器服务事件的频率,同时这样也不会降低响应时间,这时就呆以采用定时器驱动的巡回服务系统。
       在定时器的中断服务程序中检测外部事件是否发生,如果发生就进行处理。下面是程序的框架:
main()
{
    /* 系统初始化 */
    /* 设置定时器 */
    while (1)
        enter_low_power();
}
isr_timer()     /* 定时器的中断处理程序 */
{
    action1();  /* 执行事件1的处理 */
    action2();  /* 执行事件2的处理 */
    ...
    actionn();  /* 执行事件n的处理 */
}
2、
有操作系统的嵌入式系统设计
(1)      
分时系统
       分时系统是由分时操作系统、多个任务组成的应用软件构成。分时操作系统使用定时器来调度任务的运行,它按时间片均匀地分配给每个任务。像一般的嵌入式Linux操作系统和WinCE都是分时系统。

(2)      
实时系统
       分时系统的缺点是无法体现任务的重要性即优先级。与分时系统不同,实时系统把系统处理的事件根据轻重缓急进行分类,并赋予优先级。高优先级任务先得到处理器处理,只有高优先级任务处理完成,才轮到低优先级任务运行。
       根据任务的调度策略的不同,实时系统的设计方法有两种:抢占式和非抢占式。
       非抢占式系统的优点是操作系统的设计比较简单,从而系统的总开销也就小;但其缺点却也是显而易见的,如果低优先级的任务不放弃CPU,就不会引起系统的重新调度,这样高优先级的任务就得不到及时的处理,这也就违背了实时系统设计的初衷。
       与非抢占式系统相比,抢占式系统时刻保证最高优先级的任务得到运行。在运行低优先级任务过程中,如果高优先级的任务就绪,即使低优先级的任务不主动放弃CPU,也会引起系统的重新调度。不过,抢占式系统的开销比较大,因为经常要进行任务切换。