多任务与单任务

所谓"单任务系统"是指该系统不能支持多任务并发操作,宏观串行地执行一个任务。而多任务系统则可以宏观并行(微观上可能串行)地"同时"执行多个任务。

多任务的并发执行通常依赖于一个多任务操作系统(OS),多任务OS的核心是系统调度器,它使用任务控制块(TCB)来管理任务调度功能。TCB包括任务的当前状态、优先级、要等待的事件或资源、任务程序码的起始地址、初始堆栈指针等信息。调度器在任务被激活时,要用到这些信息。此外,TCB还被用来存放任务的"上下文"(context)。任务的上下文就是当一个执行中的任务被停止时,所要保存的所有信息。通常,上下文就是计算机当前的状态,也即各个寄存器的内容。当发生任务切换时,当前运行的任务的上下文被存入TCB,并将要被执行的任务的上下文从它的TCB中取出,放入各个寄存器中。

嵌入式多任务OS的典型例子有Vxworks、ucLinux等。单任务OS有早期的DOS系统。

究竟选择多任务还是单任务方式,依赖于软件的体系是否庞大。例如,绝大多数手机程序都是多任务的,但也有一些小灵通的协议栈是单任务的,没有操作系统,它们的主程序轮流调用各个软件模块的处理程序,模拟多任务环境。

单任务的软件设计流程

(1)从CPU复位时的指定地址开始执行;
(2)跳转至汇编代码startup处执行;
(3)跳转至用户主程序main执行,在main中完成:
a.初试化各硬件设备; 
b.初始化各软件模块;
c.进入死循环(无限循环),调用各模块的处理函数

用户主程序和各模块的处理函数都以C语言完成。用户主程序最后都进入了一个死循环,其首选方案是:

while(1)
{
}

有的程序员这样写:

for(;;)
{
}

这个语法没有确切表达代码的含义,我们从for(;;)看不出什么,只有弄明白for(;;)在C语言中意味着无条件循环才明白其意。下面是几个"著名"的死循环:

(1)操作系统是死循环;
(2)WIN32程序是死循环;
(3)嵌入式系统软件是死循环;
(4)多线程程序的线程处理函数是死循环。

嵌入式编程中的多任务与单任务,以及单任务的软件设计流程相关推荐

  1. 窗体 局部变量转换为全局_从嵌入式编程中感悟「栈」为何方神圣?

    ID:技术让梦想更伟大 作者:李肖遥 何为变量? 变量一般可以细分为如下图: 本节重点为了让大家理解内存模型的"栈",暂时不考虑"静态变量" 的情况,并约定如下 ...

  2. 汇编在嵌入式编程中的作用_如何在嵌入式Power BI报表中以编程方式传递凭据

    汇编在嵌入式编程中的作用 In the article, How to embed a Power BI Report Server report into an ASP.Net web applic ...

  3. 嵌入式编程中的堆栈溢出检测

    在嵌入式编程中,栈是一个很重要的概念,不管是裸机编程还是基于RTOS编程.函数形参.局部变量.函数调用现场的保护及返回地址.中断函数执行前线程保护及中断嵌套的现场的保护都依赖于栈空间.栈空间不足,程序 ...

  4. 嵌入式编程中volatile的重要性

    1.引言 volatile影响编译器编译的结果输出,volatile 变量是随时可能发生变化的,与volatile变量有关的运算,不要进行编译优化,以免出错,(VC++ 在产生release版可执行码 ...

  5. 关于嵌入式编程中的uint8_t、uint16_t......

    在嵌入式编程中经常遇到用uint8_t.uint16_t.uint32_t.uint_fast16_t之类的关键字定义一些整型变量,但是具体表示什么意思,并不是太清楚,只是把它当成int之类的整型变量 ...

  6. 嵌入式编程中boot和app的s19简易合并方法(使用mfc编程)

    嵌入式中boot和app为两个项目,使用手动合并方式较慢,如何使用mfc编写程序实现自动合并 1.实现逻辑,首先将boot.s19和app.s19拷贝一份 CommonCopyFile((CStrin ...

  7. union 的概念及在嵌入式编程中的应用

    union 概念 union 在中文的叫法中又被称为共用体,联合或者联合体,它定义的方式与 struct 是相同的,但是意义却与 struct 完全不同,下面是 union 的定义格式: union ...

  8. 嵌入式编程规范及注意事项

    嵌入式系统已经在各行各业中得到了广泛的应用,随着人们的生活向信息化,智能化的发展,嵌入式技术将彻底融入到我们的生活,在我们的生活当中扮演越来越重要的角色.对于嵌入式系统来讲,嵌入式软件相当于嵌入式系统 ...

  9. 嵌入式开发中数值常量如何转化为内存地址?

    作者 | 李肖遥       责编 | 欧阳姝黎 最近在使用 Nordic 的最新蓝牙芯片 nRF52832 开发过程中,因为做一些测试涉及到对内存地址的操作,有(*(volatile unsigne ...

最新文章

  1. OpenGL Drawing Commands绘图命令的实例
  2. 怎么输出链表长度C语言,下面程序输出结果不,如输出的链表长度结果不对,不知有关问题在哪里。请高手看下...
  3. ARTetris-AR版俄罗斯方块的源码解析
  4. 1941套站点模版,终生收藏,个个精品
  5. 数据结构与算法python—12.二叉搜索树及python实现与leetcode总结
  6. Windows 10 如何添加开机启动项
  7. ARRI阿莱MXF修复方法
  8. 【脏数据】什么是脏数据:脏数据的种类、类型
  9. idea安装教程(傻瓜式操作、永久使用)
  10. ch340是什么芯片
  11. 计算机指数函数表示法,指数函数e^x的快速计算方法
  12. java毕业设计针织企业外包系统Mybatis+系统+数据库+调试部署
  13. ftp下载工具 免费,3款绝对让你喜欢的免费ftp下载工具
  14. 【python小技巧】 批量将.png格式图片转换为.jpg格式图片
  15. 2017年最新苹果开发者账号注册申请流程最强详解!
  16. Vue # Avoid mutating a prop directly since the value will be overwritten wheneve
  17. 吴恩达-机器学习-多元线性回归模型代码
  18. 关于学术文献推荐系统的调研报告
  19. 怎么判断机械表上满弦_腕表冷知识,知道两个以上算我输!
  20. 教你如何零基础学习视频剪辑,干货满满

热门文章

  1. 向外国作者要论文的范文
  2. 绘制屏幕报错:RFC callback call rejected by whitelist
  3. 2012/3/7 海辉/华傲数据处理
  4. 猜数字游戏 模拟用户登录场景 模拟屏幕输出 C语言代码实现详细
  5. 【用户登录】网关,token,全局异常处理
  6. elasticsearch数据类型--nested
  7. 美国媒体曝光斯诺登泄密文件
  8. 使用UCloud docker镜像库push/pull
  9. Java 求一个整数的个位,十位,百位,千位。
  10. android one miui,Xiaomi deletes Twitter poll after users choose Android One over MIUI