RTOSck-软中断调度器

来源:互联网 发布:网络视频推广方案 编辑:程序博客网 时间:2024/06/14 18:32

一、背景介绍

   RTOSck是中软欧拉开发部自研的一款嵌入式实时操作系统。主要面向中低端嵌入式环境,具有体积小、效率高、易维测等特定。为了实现无上下文及栈切换的高效业务处理,RTOSck支持一种称为软中断的线程机制。软中断具有与中断类似的特性,支持优先级及优先级抢占,处理过程不能挂起。与硬中断通过硬件激活不同,软中断需要通过主动调用软中断激活函数进行激活。

 

二、题目描述

  请模拟实现一个简单软中断调度器。该软中断调度器支持32个优先级(0~31,数值越小,优先级越高)。并支持如下调度行为:
  1、在低优先级软中断中激活高优先级软中断,高优先级软中断将立即抢占执行;
  2、在高优先级软中断中激活低优先级软中断,需要在高优先级软中断执行完成后才能得到调度;
  3、低优先级软中断需要在所有直接或间接抢占的所有高优先级软中断执行完成后,再次恢复执行;
  4、同优先级软中断按照先入先出顺序进行调度;

  5、同一软中断可以连续多次激活,并响应同样多次。

三、代码

#include<map>#include<queue>#include<iostream>using namespace std;class process{public:int swiId;int prio;void (*proc)(void);friend bool operator <(process proc1,process proc2){return proc1.prio>proc2.prio;}};map<int,process> processsavemap;//存储所有中断priority_queue<process> prqueue;//优先队列中的process按照prio比较int currentID=100;//设置当前中断id/*************************************************************************************************函数说明:创建软中断输入参数:      swiId: 创建软中断ID;  prio:  创建软中断优先级;      proc:  创建软中断处理函数。输出参数:无返回值  :成功返回0, 其它情况返回-1**************************************************************************************************/int SwiCreate(unsigned int swiId, unsigned int prio, void (* proc)(void)){//TODO: 添加代码...   if(swiId>99 || prio>31 || prio<0 || proc==NULL)   return -1;process add;add.swiId=swiId;add.prio=prio;add.proc=proc;if(processsavemap.count(add.swiId)!=0)//判断里面是不是存在着这个idreturn -1;elseprocesssavemap[add.swiId]=add;// 如果符合条件则添加进mapreturn 0;}/*************************************************************************************************函数说明:软中断激活输入参数:swiId: 待激活软中断ID输出参数:无返回值  :成功返回0, 其它情况返回-1**************************************************************************************************/int SwiActivate(unsigned int swiId){//TODO: 添加代码...if(processsavemap.count(swiId)==0)return -1;prqueue.push(processsavemap[swiId]);//按照优先级放入优先队列while(!prqueue.empty()){process topprocess=prqueue.top();if(currentID != topprocess.swiId){           int tmp=currentID;   currentID=topprocess.swiId;   topprocess.proc();   currentID=tmp;   prqueue.pop();//出队列}else{break;//是同一个的时候继续}}return 0;}/*************************************************************************************************函数说明:清空所有的信息输入参数:无输出参数:无返回值  :无**************************************************************************************************/void Clear(void){//TODO: 添加代码...currentID=100;processsavemap.clear();while(!prqueue.empty()){prqueue.pop();}}


0 0
原创粉丝点击