华为OJ RTOSck-软中断调度器 自定义优先级

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

 

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

 

/******************************************************************************

Copyright (C), 2001-2011, Huawei Tech. Co., Ltd.

******************************************************************************
File Name     :
Version       :
Author        :
Created       : 2010/3
Last Modified :
Description   :
Function List :

History       :
1.Date        : 2010/3
Author      :
Modification: Created file

******************************************************************************/
#include<cstdio>
#include<queue>
#include<cstring>
#include<map>
using namespace std;

typedef void (*PROC_FUN)(void);

typedef struct Node
{
	int swiId;
	int prio;
	PROC_FUN proc;
	friend bool operator <(Node node1,Node node2)
	{
		return node1.prio>node2.prio;
	}
}SwitchNode;

priority_queue<SwitchNode> g_swi_queue;//按照prio从小到大排列
map<int,SwitchNode> g_swi_map;
int runningID;
/*************************************************************************************************
函数说明:创建软中断
输入参数:
      swiId: 创建软中断ID;
	  prio:  创建软中断优先级;
      proc:  创建软中断处理函数。
输出参数:无
返回值  :成功返回0, 其它情况返回-1
**************************************************************************************************/
int SwiCreate(unsigned int swiId, unsigned int prio, void (* proc)(void))
{
	//TODO: 添加代码...
	SwitchNode node;
	node.swiId=swiId;
	node.prio=prio;
	node.proc=proc;
	if(node.prio<0||node.prio>31||node.proc==NULL||g_swi_map.count(node.swiId))
	{
		return -1;
	}
	else
	{
		g_swi_map[swiId]=node;
	}
	return 0;
}

/*************************************************************************************************
函数说明:软中断激活
输入参数:swiId: 待激活软中断ID
输出参数:无
返回值  :成功返回0, 其它情况返回-1
**************************************************************************************************/
int SwiActivate(unsigned int swiId)
{
	//TODO: 添加代码...
	if(!g_swi_map.count(swiId)) return -1;
	g_swi_queue.push(g_swi_map[swiId]);
	while(!g_swi_queue.empty())
	{
		SwitchNode node=g_swi_queue.top();
		if(runningID!=node.swiId)
		{
			int oldRunningID=runningID;
			runningID=node.swiId;
			node.proc();
			runningID=oldRunningID;
			g_swi_queue.pop();
		}
		else
		{
			break;
		}
	}
	return 0;
}

/*************************************************************************************************
函数说明:清空所有的信息
输入参数:无
输出参数:无
返回值  :无
**************************************************************************************************/
void Clear(void)
{
	//TODO: 添加代码...
	runningID=-1;
	g_swi_map.clear();
	while(!g_swi_queue.empty())
		g_swi_queue.pop();
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值