⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 interruptcontroller.h

📁 一款国产的8051模拟器(全部源代码) 本软件是一款8051模拟器
💻 H
字号:
///////////////////////////////////////////////////////////////////////
// 圆梦51!圆梦51!圆梦51!圆梦51!圆梦51!圆梦51!圆梦51!圆梦51!圆梦51!圆梦51!
// 1998.x.x 多少遗憾,多少泪水,路在何方?? 为什么失败的总是我??梦想为什么这么遥远
// ........学x86很久了,书本都翻了n遍了......
// 虽然x86很强大,但要做台x86计算机真是太难了,8051单片机真的简单了很多,我想做个8051的计算机.
// 没有编程器的日子,真是不好受,自己又没条件能做电路板,要是能有台计算机模拟8051,那将是多莫令人兴奋的事情啊
// 但是我什么都没有............什么都没有
// 1999.x.x草稿纸上完成基本的框架图和基本算法,并完成部分核心代码,将项目名称定为圆梦51
// .......飘啊摇啊,淡漠了生活,忘记了梦想,就这样浑浑噩噩的活着........梦已死
// 2002.8.24 尘世间多少烦恼,从此不必再牵挂。为了梦想我终于可以从现实中解脱出来一段时间,不上学的日子真好,真令人怀念。
// 建立指令模拟instruction和memory 代码档。
// 不懂windows C编程是我最大的障碍,......1年时间......我想应该是我这一生中最有价值的时间,以前没有,以后可能更没有了
// 2003.12.x
// 因为要上学,所以能够静下心来学习的时间基本上再也找不到了
// 2004.9.2 基本初步完成,尚未完成中断返回,尚未debug
// 2004.11.17 调试浮点程序通过,^_^ :) ^o^ ^0^ :(  >_< 他的缺点就是他的优点,我无法权衡,指令类暂时先稳定下来吧
// 当学生真是无奈,我在倒退..............我在放弃梦想...............
// 2005.3.28 不管怎样我要圆梦,我不能做个永远失败的人,建立KernelMsg interruptcontroller代码档
// 2005.4.3 建立TIMER档,这可把我难倒了,效能,错误...............
// 2005.4.14 KernelMsg TIMER初步完成,莫名其妙的错误太多,KernelMsg真的很失败,增加了编写难度,更不易调试.....
// 2005.4.18 不管三七二十一,凑出来再说,我好想运行以下ucos ii,建立Serial类
// 2005.4.21 为了提供对多处理器系统的支持,并能够模拟多了处理器,对全局变量 函数作了修改,使之不但打破了C++的封装,
// 又使得全局函数类似类中的函数,所以在不增加代码的情况下,可直接模拟多处理器
// 2005.4.24 垃圾诞生,不得不对KernelMsg重新编写,以提高时间事件函数HOOK的安全性,降低时间HOOK的编写难度,
// 不用自己处理下层的HOOK问题,效率更高,随后TIMER Serial也作了大面积修改
// 2005.4.25 uCOS-II终于正确无误的运行成功了。0.10版核心到此为止告一段落。
// 尽管0.10没有经过完全的测试,我敢肯定定时器这部分还是有问题,而且串口,定时器还没有完善,
// 但是我已经对他没有很大主动测试方面的兴趣了,留着让用户来发现吧
// 着手开始0.11的开发,这更能吸引我的眼球,新的目标是利用KernelMsg思想大面积优化指令集的加速,以其其他速度方面的优化,
// 希望速度能追上Keil C
//////////////////////////////////////////////////////////////////////



// interruptcontroller.h: interface for the InterruptController class.
// 2004.9.11 建立代码档
// 2005.4.3 00:08 初始版本的编码工作基本完成,尚待测试
// 没有对~INTX做模拟,IT0 IT1没有作完全模拟
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_INTERRUPTCONTROLLER_H__2634D4EA_14D6_4C9A_A26C_5F31C1BF82FD__INCLUDED_)
#define AFX_INTERRUPTCONTROLLER_H__2634D4EA_14D6_4C9A_A26C_5F31C1BF82FD__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include "GlobalVar.h"
//#include "memory.h"
//#include "kernelmsg.h"
//之所以不将以下中断定义为靠近0或255,是因为以后可能会增加最高优先级或者最低优先级
#define IE0 125   //外部中断0
#define TF0 126   //定时器/计数器中断0
#define IE1 127   //外部中断1
#define TF1 128   //定时器/计数器1中断
#define RITI 129   //串口中断
#define RI 21 //串口中断,数值没有任何意义,自定义的,只是为了区别而已
#define TI 22 
#define IRQNUM 5   //定义中断源数目 
#define Triggeredge 1
#define TriggerLow 0
void IPC_IEIP_HOOK(BYTE  VarNum,int mode,BYTE data);
void IPC_IEIP_CLOCK_HOOK(BYTE  VarNum,unsigned short Clocknum);
class InterruptController  
{
public:
	int init();
	
	int CheakIRQ();//检查中断源寄存器TCON SCON看是否要执行中断,如果关中断,但有中断源责继续检查,直到中断源标志为0为止
	int Setinterrupt(BYTE num);
	int Setinterrupt(BYTE num, BYTE mode);//置中断 num中断号码(应该引用中断类中的定义),mode中断模式
	int SetSRIRQflag(BYTE num,BYTE flag);
	InterruptController();
	int SetMem(instruction * pinstc);
	virtual ~InterruptController();
	memory * mem;
	EVENT_POS CLOCKEVENTPOS;
	kernelMsg * pKMsg;
	//ClockHook IPC_IEIP_BackFun;
	//unsigned short IPC_IEIP_BackFunNum;

private:
	int SetIRQflag(BYTE num,BYTE flag);//设置中断状态标志,对串口中断无效
	int CheakIRQTriggerMode(BYTE num,BYTE mode);//判断中断触发模式是否正确,返回1表示触发模式与软件设置方式相同,否则无法发生中断
	int CheakSwitch(BYTE num);//返回1表示开中断
	//instruction * pinst;//指令类指针
	//BYTE * CurrentIRQLevel;
	//BYTE * CurrentCPULevel;
	
	//BYTE *pIRQP;
	
	int Cheaklevel(BYTE num);//检查是否可以中断,返回1表示判断优先级允许中断
};

#endif // !defined(AFX_INTERRUPTCONTROLLER_H__2634D4EA_14D6_4C9A_A26C_5F31C1BF82FD__INCLUDED_)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -