轮询系统:即在裸机编程时,先初始化相关硬件,让主程序在一个死循环里面不断循环,顺序地处理各种事件。不能说轮询是低端的,轮询系统是一种非常简单的软件结构,但适用于仅需要顺序执行代码且不需要外部事件来驱动就能完成的事情,这会变得简单可靠。

int main()
{
    /* 硬件初始化 */
    HardWareInit();

    /* 进入轮询 */
    for(;;){

    fun1();    //顺序程序1

    fun2();    //顺序程序2

    fun3();    //顺序程序3
    }

    return 0;
}

缺点:如果加入按键操作等需要检测外部信号的事件,整个系统的实时响应能力就会体现不好。试想一下,但按键按下时,程序正在运行顺序1程序,而且顺序1程序占用的程序时间片比较长,系统就有可能错过对按键的检测(直到按键松开),实时性极差,用户无法接受。

前后台系统:相比轮询系统,前后台系统在轮询系统的基础上加入了中断的概念,外部事件的响应在中断里面完成,事件的处理还是回到轮询系统中完成,中断我们称之为前台,main()函数中的无限循环称为后台。

void isr(){}

int main()
{

    HardWareInit();

    /* 注册中断 */
    isrregister(isr);

    for(;;){

    fun1();

    fun2();

    fun3();

    }

    return 0;
}

在顺序执行后台程序时,如果有中断,那么中断会打断后台程序的正常执行流,转而去执行中断服务程序,在中断服务程序中标记事件。如果事件要处理的事情很简短,则可在中断服务程序里面处理,如果事件要处理的事情比较多,则返回后台程序处理。通过中断可以大大提供程序的实时响应能力,避免造成外部事件的丢失。

多任务系统:相比前后台系统,多任务系统的事件响应也是在中断中完成的,但是事件的处理是在任务中完成的。在多任务系统中,任务与中断一样,也具有优先级,优先级高的任务会被优先执行。但一个紧急事件在中断中被标志之后,如果事件对应的任务优先级足够高,就会立刻得到响应,相比前后台系统,多任务系统的实时性又被提高了。

void task1(){}
void task2(){}
void task3(){}

int main()
{

    HardWareInit();

    /* 注册中断 */
    isrregister(isr);

    /* RTOS初始化 */
    RTOSInit();

    /* RTOS调度启动 */
    RTOSStart();

    return 0;
}

在多任务系统中,程序的主体会分割成一个个独立的、无限循环且不能返回的任务,每个任务都是独立的、互不干扰的,而且具备自身的优先级,由操作系统调度管理。整个系统的额外开销就是操作系统占据的少量FLASH和RAM,但是对于现在的片上资源,已经是微不足道。

 

1)轮询系统:主程序

2)前后台系统:中断+主程序

3)多任务系统:中断+子任务

Logo

openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。

更多推荐