RTOS与裸机系统的区别

裸机系统通常分成轮询系统和前后台系统,

1、轮询系统轮询系统

	轮询系统轮询系统是在裸机编程的时候,先初始化好相关的硬件,然后让主程序在一个死循环里面不断循环,顺序地做各种事情,大概的伪代码具体如代码清单所示:
int main(void)
{
  /* 硬件相关初始化 */
  HardWareInit();

  /* 无限循环 */
  for (;;) {
    /* 处理事情 1 */
    DoSomething1();

    /* 处理事情 2 */
    DoSomethingg2();

    /* 处理事情 3 */
    DoSomethingg3();
  }
}

轮询系统是一种非常简单的软件结构,通常只适用于那些只需要顺序执行代码且不需要外部事件来驱动的就能完成的事情。在上述代码中,如果只是实现 LED 翻转,串口输出,液晶显示等这些操作,那么使用轮询系统将会非常完美。但是,如果加入了按键操作等需要检测外部信号的事件,用来模拟紧急报警,那么整个系统的实时响应能力就不会那么好了。这个时候就要用到前后台系统。

2、前后台系统

相比轮询系统,前后台系统是在轮询系统的基础上加入了中断。外部事件的响应在中断里面完成,事件的处理还是回到轮询系统中完成,中断在这里我们称为前台, main 函数里面的无限循环我们称为后台,大概的伪代码见代码清单所示:

int flag1 = 0;
int flag2 = 0;
int flag3 = 0;

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

  /* 无限循环 */
  for (;;) {
    if (flag1) {
      /* 处理事情 1 */
      DoSomething1();
    }

    if (flag2) {
      /* 处理事情 2 */
      DoSomethingg2();
    }

    if (flag3) {
      /* 处理事情 3 */
      DoSomethingg3();
    }
  }
}

void ISR1(void)
{
  /* 置位标志位 */
  flag1 = 1;
  /* 如果事件处理时间很短,则在中断里面处理
  如果事件处理时间比较长,在回到后台处理 */
  DoSomething1();
}

void ISR2(void)
{
  /* 置位标志位 */
  flag2 = 2;

  /* 如果事件处理时间很短,则在中断里面处理
  如果事件处理时间比较长,在回到后台处理 */
  DoSomething2();
}

void ISR3(void)
{
  /* 置位标志位 */
  flag3 = 1;
  /* 如果事件处理时间很短,则在中断里面处理
  如果事件处理时间比较长,在回到后台处理 */
  DoSomething3();
}

3、多线程系统

相比前后台系统,多线程系统的事件响应也是在中断中完成的,但是事件的处理是在线程中完成的。在多线程系统中,线程跟中断一样,也具有优先级,优先级高的线程会被优先执行。
当一个紧急的事件在中断被标记之后,如果事件对应的线程的优先级足够高,就会立马得到响应。相比前后台系统,多线程系统的实时性又被提高了。
多线程系统大概的伪代码具体见代码清单所示:

int flag1 = 0;
int flag2 = 0;
int flag3 = 0;

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

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

  /* OS 启动,开始多线程调度,不再返回 */
  RTOSStart();
}

void ISR1(void)
{
  /* 置位标志位 */
  flag1 = 1;
}

void ISR2(void)
{
  /* 置位标志位 */
  flag2 = 2;
}

void ISR3(void)
{
  /* 置位标志位 */
  flag3 = 1;
}

void DoSomething1(void)
{
  /* 无限循环,不能返回 */
  for (;;) {
    /* 线程实体 */
    if (flag1) {

    }
  }
}

void DoSomething2(void)
{
  /* 无限循环,不能返回 */
  for (;;) {
    /* 线程实体 */
    if (flag2) {

    }
  }
}

void DoSomething3(void)
{
  /* 无限循环,不能返回 */
  for (;;) {
    /* 线程实体 */
    if (flag3) {

    }
  }
}

相比前后台系统中后台顺序执行的程序主体,在多线程系统中,根据程序的功能,我们把这个程序主体分割成一个个独立的,无限循环且不能返回的小程序,这个小程序我们称之为线程。
每个线程都是独立的,互不干扰的,且具备自身的优先级,它由操作系统调度管理。加入操作系统后,我们在编程的时候不需要精心地去设计程序的执行流,不用担心每个功能模块之间是否存在干扰。
加入了操作系统,我们的编程反而变得简单了。整个系统随之带来的额外开销就是操作系统占据的那一丁点的 FLASH 和 RAM。现如今,单片机的 FLASH 和 RAM 是越来越大,完全足以抵挡 RTOS 那点开销。

4、三者的区别

在这里插入图片描述

5、总结

RTOS有以下几点优势:

  1. 硬实时响应基于优先级抢占的RTOS,根据任务的实时需求,执行优先调度。有严格时序限制的任务可以优先执行,提高应用程序对时间关键事件的响应。

  2. 系统性能最大化针对大型的、复杂的嵌入式应用,使用一个事件驱动的RTOS,来替代基于轮询的超循环结构,可以生成一个更有效的设计,更小的存储占用,应用可以获得更多的处理器时间。

  3. 降低复杂度RTOS允许应用划分为一个个小的自主运行的任务。任务执行自己的上下文中,不依赖其它任务或调度器。

  4. 高峰负载管理RTOS提供了为管理系统高峰活动提供了一个有效的方法。更高的优先级分配给执行峰值负载活动的任务,确保他们在临界时间内访问处理器,在此期间,较低优先级的任务被延迟。

  5. 紧密集成的中间件RTOS的模块化设计使得它可以很容易的增加中间件。中间件组件以任务和驱动的方式增加。他们使用RTOS提供的资源与其它任务通信。基于相应的事件被RTOS调度。

  6. 更大的开发团队每个任务可以被认为是一个项目。通过RTOS提供的资源(队列、信号量等)来定义输入输出。将系统定义为一个个的任务,可以更容易的部署更多开发人员到一个项目。

  7. 易于调试和验证系统划分为功能明确的任务,不依赖其它任务。在整个系统集成之前,可以很容易的调试和验证每个任务。

  8. 代码重用RTOS系统中的模块化设计,鼓励将软件功能创建为独立的、验证过的任务。其独立性使得在其它设计中重用这些模块变得很简单。

RTOS缺点:

  1. RTOS对资源的消耗会增加一点。

部分引用文章来自微信公众号:StrongHuang

  • 14
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值