SST-超级简单任务调度器结构分析

SST(Super Simple Task) 是一个基于任务优先级、抢占式、事件驱动、RTC、单堆栈的超级简单任务调度器,它基于Rober Ward一篇论文的思想,Miro Samek用C重新编程实现的,它是QP中QK的的基本思想。

QK加上状态机事件处理的方法QEP,再加上任务的注册与事件的保存与分发功能QF,再加上串口调试功能QSpy,再加上基于模型驱动的开发QM,就成了QP。

2015年,QP获得“嵌入式计算设计”顶级发明奖【1】。

1.SST层次结构

?

2.SST总体结构

?

  • 发送事件(产生事件)

    SST_post(目标任务优先级prio,信号sig,参数para ),发送事件到prio任务对应事件队列,置1队列状态位。

  • 调度(消耗事件)

    SST_schedule_(void ),调度任务函数,队列空时,清0队列状态位。

  • 队列状态表置1

    SST_readySet_ |= tcb->mask_ 队列中放入事件时,对应位置1;

  • 队列状态表清0

    SST_readySet_ &= ~tcb->mask_ 队列中无事件时,对应位清0.

3.SST TCB结构

?

4.发送事件SST_post()流程图

?

5.调度SST_schedule()流程图

?

6.头文件关系

?

7.进入中断宏、,退出中断宏、及中断中的使用

  • 中断的进入宏
#define SST_ISR_ENTRY(pin_, isrPrio_) do {   (pin_) = SST_currPrio_; \      /*1.保存被中断的任务优先级(当前优先级)到pin中*/
  SST_currPrio_ = (isrPrio_); \  /*2.设置ISR的优先级isrPrio为当前优先级*/
  SST_INT_UNLOCK(); \            /*3.开中断*/
} while (0)
  • 中断的退出宏
#define SST_ISR_EXIT(pin_, EOI_command_) do {   SST_INT_LOCK(); \          /*1.关中断*/
  (EOI_command_); \          /*2.结束当前中断*/
  SST_currPrio_ = (pin_); \  /*3.恢复被中断前任务优先级为当前任务*/
  SST_schedule_(); \         /*4.调度*/
} while (0)
  • 中断中使用宏例子
//键盘中断ISR
static void interrupt kbdISR(){
    uint8_t pin;
    uint8_t key = inport(0x60); //取键值
    displayPreemptions(SST_currPrio_, KBD_ISR_PRIO); //测试用,显示被抢占次数
    SST_ISR_ENTRY(pin, KBD_ISR_PRIO);        /*1.进入中断*/
    SST_post(KBD_TASK_PRIO, KBD_SIG, key);   /*2.发事件到KbdTask任务*/
    SST_ISR_EXIT(pin, outportb(0x20, 0x20)); /*3.退出中断*
}

结束语

如果把Rober Ward的论文比喻成一粒不起眼的种子,Miro Samek的SST就是一个小树苗,而Miro Samek的QP则长成了参天大树,这棵树已经成长了十年,2015年,QP获得“嵌入式计算设计”顶级发明奖【1】。

参考:
【1】QP获得“嵌入式计算设计”2015年顶级发明奖

原文地址:https://www.cnblogs.com/water-sea/p/12059525.html

时间: 2024-11-10 05:53:21

SST-超级简单任务调度器结构分析的相关文章

TaskScheduler一个.NET版任务调度器

TaskScheduler是一个.net版的任务调度器.概念少,简单易用. 支持SimpleTrigger触发器,指定固定时间间隔和执行次数: 支持CronTrigger触发器,用强大的Cron表达式满足日历形式的复杂触发规则: 支持动态添加和删除任务,可根据具体需求实现复杂逻辑: static void Main(string[] args) { Scheduler scheduler = new Scheduler(); SimpleTrigger simpleTrigger = new S

JQuery表单验证插件EasyValidator,超级简单易用!

本插件的宗旨是:用户无需写一行JS验证代码,只需在要验证的表单中加入相应的验证属性即可,让验证功能易维护,可扩展,更容易上手. DEMO中已经包含了常用的正则表达式,可以直接复用,为了考虑扩展性,所以针对不同用户特殊需求,自行写正则吧. 顺便AD下刚出炉的小站,欢迎捧场:www.paipaiyou.com EasyValidator实现的功能: 1.提示功能(在表单或者其他标签中加入tip="想提示的文字") 如: <input name="name" tip

vcastr2.0插件超级简单使用

            Vcastr2.0简单使用 友情提示:1.蓝色文字为必修改内容.2.#字符后面是解释该代码段的主要内容 1. 引用swfobject.js文件 #public/videoplug/swfobject.js  vcastr2.0插件的文件位置 <script type="text/javascript" src="public/videoplug/swfobject.js"></script> 2. 创建页面并编写HTM

《CLR via C#》之线程处理——任务调度器

<CLR via C#>之线程基础--任务调度器 <CLR via C#>之线程基础--任务调度器线程池任务调度器设置线程池限制如何管理工作者线程同步上下文任务调度器自定义TaskScheduler派生类 FCL提供了两个派生子TaskScheduler的类型:线程池任务调度器(thread pool task scheduler),和同步上下文任务调度器(synchronization context task scheduler).默认情况下都使用线程池任务调度器. 线程池任务

JS基础(超级简单)

1     JS基础(超级简单) 1.1 数据类型 1.1.1   基本类型: 1)        Number:特别注意:NaN的检测方法:Nan!=NaN;或者使用isNaN方法 2)        string 3)        boolean 4)        null 5)        undefined 1.1.2   复杂类型 object:date,array,function 1.2 变量 var 变量名=值 变量的作用域:1.全局:以页面为单位.2局部:以函数为单位.

超级简单实用的.NET性能调试工具-----ANTS Performance Profiler

艺术字做到后期,性能成了一个比较大的瓶颈,优化性能的过程中接触了一些.NET性能调试工具,最喜欢的是ANTS Performance Profiler,操作简单,功能也跟我期望的差不多. ANTS Performance Profiler是出自大名鼎鼎的Red Gate,很多人使用过的.NET Reflector就是出自此公司,该公司还出品其他产品,具体请戳http://www.red-gate.com/products/.ANTS Performance Profiler支持.NET平台所有语

轻轻松松教你写日志-超级简单

最近在做一个项目,涉及到很多的服务,一步步调试相当麻烦,要在自己电脑上发布很多服务,又要全部开启.很费时间,出现问题,怎么解决最快呢?直接写日志,一步定位哪里出了错. Log4Net库是一个帮助程序员将日志信息输出到各种目标(控制台.文件 数据库等)的工具. Log4Net,相信哪个程序员都用过,但是可能是人家配置好了自己拿过来直接用,所以让自己写还是有点困难,听起来很高大上的样子,其实真的很简单.以前听别人讲,迷迷糊糊,知道那么回事,就是个写日志的.但是真正会用还是在项目中自己真正的实践. 下

windows简单调试器源码2700行左右代码

简单调试器项目中on开头的函数为接收系统的调试事件并做相应的处理,简单调试器实现过程中主要的调试事件为异常事件,相应的处理函数为DispatchException. 在异常事件中访问异常.int3异常.单步异常是跟实现调试器功能密切相关的异常事件,这里用三个函数分别处理三个函数分别为OnExceptionAccess.OnExceptionBreakPoint.OnExceptionSingleStep. 异常处理函数中如果为调试器自己设置的异常程序就会停下来接收用户输入等待下一步处理,相应的用

JQuery -&gt; 超级简单的下拉菜单

1. create a new accout, create orginazation, create repo 2. install git in your local pc Note: you can create ssh key to avoid username/password input for github operation https://help.github.com/articles/generating-ssh-keys https://help.github.com/a