基于事件和时间触发嵌入式系统编程思想
事件驱动的实时嵌入式系统的设计和实现

事件驱动的实时嵌入式系统的设计和实现摘要嵌入式实时操作系统具有嵌入式软件共有的可裁剪、低功耗等特点;而实时操作系统,可以满足系统对实时性的要求。
但嵌入式实时系统需要增加额外的系统开销,随着系统功能的增加,逐渐增加的开销将不容忽视。
对于某些功能简单的嵌入式系统,本文提出了一种实时嵌入式系统的设计方法,采用简单的方法和代码来建立一个快速、有效地系统。
该嵌入式软件系统主要包括主控循环系统、事件驱动任务、周期循环任务及软件计数器。
在冰箱嵌入式系统中进行了具体实现,满足实时性的同时降低了对系统资源的占用率。
关键字主控循环;事件驱动任务;周期任务;软件计时器1 引言嵌入式实时系统中采用的操作系统,我们称为嵌入式实时操作系统,它既是嵌入式操作系统,又是实时操作系统。
作为一种嵌入式操作系统,它具有嵌入式软件共有的可裁剪、低功耗等特点;而作为一种实时操作系统,可以满足系统对实时性的要求[1]。
但是,使用嵌入式实时操作系统还需要额外的ROM/RAM开销,2%~5%的CPU额外负荷以及内核的费用;同时如果任务之间抢占CPU控制权处理不好,会产生系统崩溃、死机等严重后果;而且随着对嵌入式实时操作系统需求的增长,将越来越多的功能添加到系统中,使其变得越来越臃肿。
对许多小型或中等嵌入式设备,尤其是对成本敏感的小型设备,使用嵌入式实时操作系统会大大增加设备的成本,因而在本文中提出一种实时嵌入式软件系统的设计方法。
本文的设计思想主要包括主控循环系统、事件驱动任务、周期循环任务及软件计时器四部分。
2 系统设计2.1 主控制循环该系统将软件分成独立的任务模块,支持事件驱动任务,将事件驱动任务输入到事件队列,当接收到恰当地触发事件时,才开始执行。
否则,使其空闲,只占用极少地处理时间;以预置地速度执行周期任务(即不需要触发就可执行地任务)。
根据需要,执行速度有准确计时和相对计时(与每次主控循环的执行速度相关联)两种方式。
该系统是非抢占式系统(其他的任务不会无法中断正在运行的任务),不需要使用信号量来保护数据。
嵌入式系统开发

嵌入式系统开发嵌入式系统是指内嵌在其他设备或系统中,实现特定功能的计算机系统。
它通常集成了硬件和软件,通过专门的开发平台进行开发和编程。
嵌入式系统广泛应用于各个领域,如汽车、家电、医疗设备、通信设备等。
本文将围绕嵌入式系统开发展开,介绍嵌入式系统的基本原理、开发流程以及相关技术。
一、嵌入式系统的基本原理嵌入式系统的基本原理是将处理器、存储器、输入输出设备等硬件组件集成在一起,通过操作系统和应用程序实现特定的功能需求。
常见的嵌入式系统采用单片机或微处理器作为核心处理器,具有较小的体积和功耗。
嵌入式系统的设计需要考虑硬件平台的选择、外设的接口设计、系统调度和任务管理等方面。
同时,软件开发也是嵌入式系统的重要组成部分,包括操作系统的移植、设备驱动程序的编写以及应用程序的开发。
二、嵌入式系统开发流程嵌入式系统的开发流程包括需求分析、硬件设计、软件开发、集成测试和发布等环节。
下面将逐一介绍各个环节的内容。
1. 需求分析在嵌入式系统开发之前,需要明确系统的功能需求和性能要求。
通过与用户沟通和需求分析,确定硬件平台、输入输出设备和外部接口等方面的需求。
2. 硬件设计硬件设计是指基于嵌入式系统的功能需求,选择合适的处理器、存储器、外设等硬件组件,并进行相应的电路设计和PCB布局。
硬件设计需要考虑系统的稳定性、扩展性和功耗等因素。
3. 软件开发软件开发是嵌入式系统开发的关键环节。
首先,根据硬件平台的选择,进行操作系统的移植和配置。
然后,编写设备驱动程序,实现对外设的控制和数据交换。
最后,根据系统需求,开发应用程序,实现特定功能。
4. 集成测试集成测试是将硬件和软件进行整合,测试系统的功能和性能是否满足需求。
通过功能测试、性能测试和稳定性测试,发现并修复系统中的缺陷和问题。
5. 发布在集成测试通过后,将嵌入式系统制作成最终产品,进行出厂测试和质量控制。
然后,将产品发布给客户或上线市场。
三、嵌入式系统开发的相关技术嵌入式系统开发涉及到多个技术领域,下面将介绍几个重要的技术。
嵌入式系统中的实时任务调度算法

嵌入式系统中的实时任务调度算法一、概述嵌入式系统是指在受限制的物理空间和资源下完成特定任务的计算机系统。
实时任务调度算法是嵌入式系统中实现任务调度的核心内容。
嵌入式系统中任务的调度依赖于实时时间和任务的优先级,有效的实时任务调度算法可以有效提高系统的响应速度和执行效率。
二、常见的实时任务调度算法1. 静态优先级调度算法静态优先级调度算法是基于任务的预定优先级进行调度的算法。
该算法在任务启动时确定各个任务的优先级,优先级高的任务先执行。
优先级越高的任务优先级越大。
缺点是不能及时响应紧急任务。
2. 轮询调度算法轮询调度算法是按照预定的时间片轮流为每个任务分配时间,即任务A执行一个时间片后切换执行任务B。
轮询算法实现简单,但不适用于实时任务。
3. 事件驱动调度算法事件驱动调度算法中,不同任务由事件触发执行。
事件可以是硬件中断、信号量等。
事件驱动调度算法能够更快地响应实时任务。
4. 默认调度算法默认调度算法计算任务需要的运行时间,按照时间从小到大排序。
执行时间短的任务先执行。
由于无法预知实际情况下任务执行时间,因此该算法不能完全适用于实时任务。
三、实时任务调度算法的选择及应用在选择实时任务调度算法时,需要根据实际应用场景考虑。
轮询算法可作为一种简单的实现方法,但仅适用于非实时场景。
静态优先级算法适用于任务优先级固定的场景,事件驱动算法则更适用于需要快速响应的实时场景。
在对不同类型任务的调度需求不同的情况下,混合调度算法逐渐展现出优势。
混合调度算法包括静态优先级算法,时间片轮询调度算法和时间限制算法。
其中静态优先级算法适用于高优先级任务,时间片轮询调度算法适用于中等优先级任务,时间限制算法适用于低优先级任务,同时具有响应时间短和任务效率高的优势。
此外,在实时任务调度中,可以通过优化任务调度,比如避免请求内存和缩短任务间切换时间来进一步提高实时任务调度性能。
四、总结实时任务调度算法是嵌入式系统中实现任务调度的核心内容,它对系统的响应速度和执行效率至关重要。
嵌入式实时操作系统的设计与开发

嵌入式实时操作系统的设计与开发随着科技的不断发展,嵌入式系统在很多领域得到了广泛的应用,例如智能家居、物联网、智能医疗等。
嵌入式系统是一种专门为特定应用领域设计的计算机系统,具有高效、稳定、耐用等特点。
而实时操作系统是嵌入式系统的重要组成部分,它能够确保系统在实时性、可靠性、安全性等方面具有高水平的性能。
因此,嵌入式实时操作系统的设计与开发是嵌入式系统开发中的重要环节。
一、嵌入式实时操作系统的基本概念实时操作系统是指能够在规定的时间内响应某个事件的操作系统。
在一个实时系统中,时间是非常宝贵的资源,系统必须在预定时间内完成所需的操作,才能保证系统的可靠性和安全性。
嵌入式实时操作系统是一种应用于嵌入式系统中的实时操作系统,它有着更高的实时性和可靠性,可以为嵌入式系统提供更好的性能和稳定性。
在嵌入式实时操作系统中,任务的优先级和时间限制是非常重要的。
每个任务都有各自的时间限制和执行优先级,系统必须保证任务不会发生竞争或死锁,以免影响系统的正常运行。
而在一些高要求的场景中,例如商业飞机、炮火定位等领域,实时性是首要的,对于一些时间非常敏感的应用,响应时间和执行速度必须能够达到毫秒或者微秒级别。
二、嵌入式实时操作系统的特点嵌入式实时操作系统与其他操作系统相比有着许多独特的特点。
1.轻量级嵌入式实时操作系统必须是轻量级的,在保证实时性和可靠性的前提下,尽可能减少系统的资源占用和功耗。
由于嵌入式设备通常的资源比较有限,因此轻量级的操作系统在这种情况下显得尤为重要。
2.快速响应嵌入式实时操作系统必须能够快速响应各种事件,在规定的时间内完成任务。
在这种现实的场景中,延迟和响应速度的问题在业务上是不能被容忍的。
3.优先级调度嵌入式实时操作系统中,每个任务都有自己的优先级和时间限制,系统必须按照优先级轮询任务,及时分配资源。
优先级调度是嵌入式实时操作系统中最核心的功能之一,也是实时性和可靠性的重要保证。
三、嵌入式实时操作系统的设计和开发环节非常关键,关系到整个系统的性能和可靠性。
基于嵌入式实时操作系统的程序设计

基于嵌入式实时操作系统的程序设计引言嵌入式系统在现代科技中扮演着重要的角色,而嵌入式实时操作系统(RTOS)则是嵌入式系统中一个关键的组成部分。
嵌入式实时操作系统的程序设计对于确保系统稳定性和可靠性至关重要。
本文将就嵌入式实时操作系统的程序设计进行全面、详细、完整且深入的探讨。
二级标题1:嵌入式实时操作系统概述嵌入式实时操作系统是一种特殊类型的操作系统,其目标是实时响应和控制嵌入式系统的任务。
它通常针对资源有限的系统设计,如传感器、手机和汽车等。
嵌入式实时操作系统需要满足以下三个关键特性: - 实时性:嵌入式实时操作系统必须能够满足严格的时间要求,并保证任务在规定的时间内完成。
- 可靠性:嵌入式实时操作系统必须具备高度的可靠性,能够应对各种异常情况并保持系统稳定。
- 高效性:嵌入式实时操作系统需要高效地利用系统资源,以最大程度地提高系统性能。
二级标题2:嵌入式实时操作系统的任务调度嵌入式实时操作系统通过任务调度来管理系统中的各个任务。
任务调度的目标是按照一定的策略和优先级来合理地分配系统资源和控制任务执行。
下面是常用的任务调度算法: 1. 先来先服务(FCFS)调度算法:按照任务到达的顺序进行调度,适用于任务长度相同时。
2. 最短作业优先(SJF)调度算法:按照任务所需的执行时间进行调度,适用于任务执行时间差异较大的情况。
3. 优先级调度算法:根据任务的优先级来决定任务的执行顺序,适用于对任务执行顺序有较高要求的情况。
4. 最短剩余时间优先(SRTF)调度算法:在SJF算法的基础上,根据任务剩余执行时间来进行调度,适用于任务的执行时间可以动态变化的情况。
二级标题3:嵌入式实时操作系统的任务通信在嵌入式系统中,各个任务之间需要进行通信,以便进行数据传输和协调工作。
以下是常用的任务通信机制: 1. 信号量:信号量用于控制对共享资源的访问,通过对信号量进行P(申请资源)和V(释放资源)操作来实现任务的同步和互斥。
基于时间触发嵌入式系统的设计和应用

[导读]近年来,嵌入式发展迅速,采用51单片机死循环的事件触发编程方式已逐渐不能满足企业对产品稳定性和安全性的要求。
在实际应用中,往往会面临同时应付多外设、多任务的情况,则对它们的相互调度必不可少。
时间触发嵌入式系统就是这样的简单实用的操作系统。
1.引言近年来,嵌入式发展迅速,采用51单片机死循环的事件触发编程方式已逐渐不能满足企业对产品稳定性和安全性的要求。
目前,嵌入式系统软件有VxWork、Linux、WinCE、μC/OS-II等,可出于成本和技术上的考虑,微控制器往往不会选取其进行设计。
在实际应用中,往往会面临同时应付多外设、多任务的情况,则对它们的相互调度必不可少。
时间触发嵌入式系统就是这样的简单实用的操作系统。
本文设计了基于AVR微控制器的时间触发多任务调度器并应用于实际。
该调度器使用传递消息(message)的方式使得微控制器在多个任务及设备间切换。
2.AVR微控制器的结构特点AVR是目前使用以该系列的ATmega128为例说明,它采用哈佛结构,RISC指令集、低功耗、片上资源丰富的特点,极大简化了外围电路,使系统更加稳定可靠。
其特点为嵌入式系统设计提供了良好的硬件保证。
3.嵌入式两种触发方式的对比在嵌入式系统中,通常采用两种本质上不同的调度方式:事件触发和时间触发。
事件触发方式往往使用多级中断来实现,其发生时间具有随机性;而时间触发方式由一个全局时钟驱动,系统的行为在功能与时间上都是确定的,即具有可预测性。
3.1 事件触发方式存在的问题嵌入式系统开发人员有一种中断事件绝不会丢失的错误观念,这往往给开发的产品带来灾难性的后果。
中断事件丢失在实际应用中是一个不争的事实,产生的原因有多方面,但无外乎内因和外因两种。
外因指嵌入式系统外产生的原因,这里主要指中断源信号丢失或过于频繁;而内因又可分为硬件原因和软件原因,硬件原因主要由所用嵌入式器件的中断嵌套能力所致,软件原因主要由开发者编程时对任务中断优先级设置错误以及任务处理不当所致。
嵌入式系统应用程序方案之一——基于事件驱动的应用程序框架

列,以启动相应的处理。
数据流程
技术支持:028-85136173
2
嵌入式系统应用程序方案之一
各个任务模块的主要功能之一就是对各级应用数据进行必要的加工,并形成新的数据。 典型的数据加工可以是:
对串口来的数据进行帧格式分析,提取相关数据,即通常的通讯规约分析; 对 AD 采集的原始数据进行某种统计处理,提取特征数据; 读取数字输入状态,进行必要处理; 读取网络报文,进行必要的应用层规约解析 应用数据存文件,文件数据处理等等 由于每个任务的执行机会具有一定的不确定性,因此需要对数据开设一定的缓冲区,对 一般的应用来说,数据处理通常都是顺序进行的,所以数据缓冲区的结构通常采用 FIFO 数 据结构,缓冲区的数据单元即可是简单的字节、字,也可以是复合的数据结构。在英创提供 的程序中,串口的数据缓冲区就是采用的 FIFO 数据结构,数据单元为一个字节,FIFO 结 构的数据缓冲区也称为环型 buffer。 可以由一个任务作数据处理,另一个任务作数据传送,对多任务共享的单一数据单元, 可通过设置信号灯的方法来确保数据单元的完整性,对多个数据单元,同样可考虑采用 FIFO 数据结构。对数据响应时间有严格要求的应用,也可以用一个任务实现数据采集处理和网络 通讯全过程。 以下具体介绍实现上述方案的主要代码。建议用户在阅读本文之前,已对英创嵌入式模 块的功能测试程序有了基本了解。
// 可以根据应用定义更多的命令
#define #define
MaxCmdStack 400
PARLEN
14
// 定义系统任务队列的长度 // 每个命令所带参数的长度
class TaskQueue
{
static unsigned int PutIdx;
嵌入式系统第4章 嵌入式系统软件开发基础

为什么我们需要多处理器调度模式1. 复杂系统可能需要分布式、多节点处理汽车上有超过40个处理器,工业火警报警,可能超过几百个IO数量大,连接起来难,故障点多价格方面,多个便宜cpu够用,比用一个强cpu便宜多处理器工作,速度快,多核CPU如果处理器界面清楚,那么软件设计复杂度降低
多处理器带来的挑战
PID控制器的调度
采样时间的影响多PID系统的影响
单片机软件调度就介绍到这里
谢谢
不可重入
static int sum = 0;int cout_pear(int *package,int n){ int i; for(i = 0; i < n; i++) sum += *(package ++); //(1) return sum;}
可重入函数
int *package;int count_apple(int n){ int temp = 0; int i; P操作(申请信号量); if(package == NULL) { V操作(释放信号量); exit(1) } for(i = 0; i < n; i++) temp += *(package++); V操作(释放信号量); return temp;}
嵌入式系统
软件开发基础
嵌入式软件开发面临的问题
实时性可靠性可验证性
实时系统
自动驾驶系统结构
实时性问题
1. 实时性约束2. 快速不等于实时性
事件触发系统
举一个最简单的例子:值班医生 没事睡觉(节能) 有病人出现问题(唤醒处理),可能记录状态 处理完了继续睡觉(节能) 嵌套处理
时间触发
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于事件和时间触发嵌入式系统编程思想1 传统编程结构的局限性当不使用RTOS时,嵌入式软件通常采用两种传统的编程结构进行编程,一种叫“前后台结构”或者叫“超级循环结构”,本质上是事件触发的编程方式,另一种叫时间触发的编程方式,Michael J.Pont的“基于时间触发的编程模式”即属于此。
在实际工作中,当系统稍微复杂时,会发现这两种方式都有一定局限性,下面以一个实际产品设计中遇到的问题为例来说明。
在设计一个用于配电柜的壁装式智能配电仪表时,CPU的程序设计需完成以下任务:(1)每半秒对前显示屏的显示数据进行一次刷行。
(2)每0.1秒对DI/DO进行一次刷新。
(3)每0.2秒对键盘进行一次扫描。
(4)每半秒对测量数据进行一次重新采集和计算。
(5)异步串行口与上位机使用Modbus通信,速率最高19200bps。
(6)CPU通过IIC总线与时钟芯片和EEprom通信。
(7)CPU通过SPI总线与LED数码管及采集芯片通信。
(8)CPU要对所采集的6路信号进行FFT变换。
(9)当系统掉电时,CPU要能快速响应以把当前的电度底数写入EEprom中。
上述任务中,任务(5)和任务(9)是强实时性的,如果对串口的收发事件得不到及时响应,接收时会导致字节丢失,发送时会导致字节间时间间隔太大造成接收方的Modbus帧定界错误,对系统掉电事件如果不能及时响应会造成EEprom的写入失败。
其它任务只要在指定的周期内能得到执行就行,但是任务(8)比较特殊,使用通常的8位CPU进行6种信号的FFT变换,哪怕每种信号只做128点的FFT,运算一次也要好几秒。
下面来看用传统编程结构实现上述设计时遇到的困扰。
1.1 使用“前后台方式”进行编程使用“前后台方式”进行编程时,为保证任务(5)的及时性,使用了UART中断,当UART完成一个字节的收发后产生中断,在中断程序中将接收到的字符保存在接收缓冲区或从发送缓冲区取下一个待发字符装入UART进行发送,对Modbus协议的处理可以单独用一个任务在中断外处理,这保证了中断程序的简短。
为保证任务(9)响应的及时性,也必须为它安排一个中断。
因为当系统掉电时,系统只有不到10ms的过渡时间,系统如果不能在这个时间内完成相关的操作,系统电压将跌落至有效电压以下而丧失工作能力。
安排好了后台的中断任务后再来看看前台的任务如何完成。
这里遇到的最大的挑战是对任务(8)的处理,因为任务(8)需要的执行时间太长了,简单的把它当成一个任务处理将影响系统对其它任务的响应,在超级循环中的代码结构如下:while(1){任务(1);任务(2);………任务(8);}由于任务(8)执行一次要几秒钟的时间,整个超级循环执行一次至少大于任务(8)需要的时间,也就是说这个超级循环循环一次要几秒钟时间,将满足不了各任务响应时间的要求。
要解决这个问题,只有把任务(8)拆分成很多个子任务,将每个子任务的耗时压缩到10个毫秒左右,并定义好各子任务完成后的状态,在超级大循环中每次根据状态只执行一个子任务,程序结构如下while(1){任务(1);任务(2);………Switch (子任务状态){case 子任务状态1:子任务1;break;case 子任务状态2:子任务2;break;…………case 子任务状态n:子任务n;break;}}这样,就需要把一个耗时几秒的FFT运算任务拆分成几百个耗时10ms左右的子任务,这显然是不可接受的。
除此之外,超级大循环结构隐含地一个缺点就是随着任务的增加,循环体的执行时间是线性增加的,在实际设计中即使没有象任务(8)那样的高耗时任务,当系统功能增加时要保证系统响应的及时性也是一个不小的挑战。
1.1 使用“时间触发编程模式”进行编程“时间触发编程模式”的核心是建立一个基于时间触发的合作式的任务调度器,在系统中尽量减少事件触发(减少中断的使用),系统通过任务调度器完成各任务的调度执行,下面是“时间触发编程模式”的典型程序结构:/*--------------------主函数-----------------------*/Void main(void){SCH_Init();//设置调度器SCH_Add_Task(任务函数名,任务调度延迟,任务调度周期);//将任务加入调度器的任务队列 SCH_Start();//刷新任务队列while(1){SCH_Dispatch_Tasks(); //执行任务调度器}}/*-------------------定时中断函数---------------------*/Void SCH_Update(void) interrupt{//刷新任务队列}系统中每个任务都定义了优先级、任务循环周期和任务延迟时间,系统时器中断程序SCH_Update()按设定的节拍对任务队列进行刷新,在超级大循环中只执行任务调度器SCH_Dispatch_Tasks(),根据任务队列的状态安排任务的执行。
这种编程结构避免了超级大循环结构循环时间随代码量的增加而线性增加的问题,但是,由于任务是不可剥夺的,一旦任务启动执行,任务调度器只有在当前任务完成后才有机会执行,这就要求每个任务占用CPU 的时间不能太长,否则将影响整个系统的响应速度。
所以,FFT运算在这种编程模式下还是必须进行有效的拆分,否则就必须提高CPU的档次或使用可剥夺型的抢先式RTOS,这势必造成系统成本的增加。
那么有没有更好的解决办法呢?下面的编程结构对“时间触发编程模式”进行了改进,使之在不提高硬件成本的情况下,使编程人员更直观地定义任务,减少任务特性对系统程序结构的冲击,使程序结构简单明了并提高系统的实时响应速度。
2 对“时间触发编程模式”的改进根据多年嵌入式系统编程的经验,通常嵌入系统的任务可以划分成3种类型:(1)及时型任务;(2)周期型任务;(3)背景型任务;及时型任务的特点:这类任务是事件触发型的,一旦事件发生,系统必须在限定的时间内进行响应,对这类任务,最自然的方法就是使用中断来完成,即定义成“前后台方式”中的后台任务。
周期型任务的特点:这类任务是时间触发式周期型的,系统必须保证在指定的周期内执行任务,“时间触发编程模式”可以很好地满足这类任务的需求。
背景型任务的特点:这类任务是非实时型的,实时性不是非常重要,系统在运行过程中可随时中断这类任务以便执行前两类任务,系统只要能充分利用资源尽最大可能快速完成这类任务即可,这类任务最适合定义成“前后台方式”中的前台任务。
根据以上任务分类,对“时间触发编程模式”的改进可概括成以下需求:(1)任务分3类,1类任务优先级最高,3类任务优先级最低;(2)高优先级的任务可中断低优先级任务的执行,同级的任务之间不可相互剥夺。
(3)实际设计中为提高系统的可预测性,应尽量减少1类任务的数量及1类任务的执行时间。
(4)为降低系统资源的占用,系统不给任务划分单独的堆栈空间。
以上改进的本质是设计一个3优先级的简单的任务调度机制,高优先级的任务可中断低优先级的任务,同优先级的任务之间不能相互剥夺,该调度机制不为每个单独的任务保存任务上下文和单独的堆栈,这样可以减少该编程模式对系统资源的需求。
可剥夺式RTOS中的一个高优先级任务中断一个低优先级的任务时,会保存好低优先级任务的上下文并把该低优先级任务的局部变量保存在本任务单独的堆栈中,如果系统不给任务分配单独的堆栈,如何保证高优先级任务退出后低优先级任务执行环境的恢复呢?对这个问题,可以借鉴中断的处理机制用以下办法予以解决:(1)在系统中设计一个定时中断函数,该函数的功能就是执行周期性任务的调度,该定时中断在所有中断中优先级最低;(2)在系统中设计另一个定时中断函数,该函数的功能是刷新周期型任务的任务管理队列,为任务调度提供支持,本定时中断函数的优先级在系统中次低;(3)周期型任务就是一个函数,该函数入口的第一个操作是开中断(问:这个中断指的是触发及时性任务的中断,那么在周期性任务外,是开还是关?如果是开,),允许任务执行期间被中断以便响应及时型任务。
(4)背景型任务就是在主函数超级循环中执行的代码,该代码可随时被及时型和周期型任务中断,当系统没有及时型任务和周期型任务时才循环执行背景型任务的代码。
通过以上措施,“改进型时间触发编程模式”的程序结构如下:/*--------------------主函数-----------------------*/Void main(void){SCH_Init();//设置调度器SCH_Add_Task(任务函数名,任务调度延迟,任务调度周期);//将任务加入调度器的任务队列SCH_Start();//刷新任务队列while(1){背景型任务1;………背景型任务n;}}/*-------------------次低优先级定时中断函数---------------------*/Void SCH_Update(void) interrupt{//刷新任务队列}/*-------------------最低优先级的定时中断函数---------------------*/Void SCH_Dispatch_Tasks(void) interrupt{//调度周期型任务}/*-------------------周期型任务典型结构---------------------*/Void SCH_Cycle_Task1(void){//开中断 /*此函数中可以靠中断触发来执行及时性任务*///执行任务return;//任务返回}结语使用“改进型时间触发编程模式”进行小型嵌入式系统编程,就像使用RTOS进行编程一样,设计者规划好任务后,就可以专心于每个任务的设计,任务对处理器时间的占用可以由系统统一管理,减少任务之间的耦合,使产品的程序设计和改动都变得简洁清楚。
使用该编程模式很好地解决了壁装式智能配电仪表所面临的复杂的设计问题,证明该方法简单有效。
目前该设计模式仅仅设计了任务调度器,任务间的变量传递还需要使用全局变量,如果能加入信号量和消息机制,那么该模式将更加完善,会使低成本的小型嵌入式系统的编程更加方便和清晰。