基于dos的多任务系统实现课程设计(编辑修改稿)内容摘要:
estroy(int id) { disable()。 free(tcb[id].stack)。 tcb[id].stack = NULL。 tcb[id].state = FINISHED。 printf(\n**** The thread %s has been destroyed ****\n,tcb[id].name)。 tcb[id].name[0] = 39。 \039。 enable()。 } void over(void) { destroy(now)。 swtch()。 } /* InitDos()函数:功能是获得 INDOS 标志的地址和严重错误标志的地址 */ void InitDos(void) { union REGS regs。 struct SREGS segregs。 /* 获得 INDOS 标志的地址 */ =GET_INDOS。 /* intdosx() : Turbo C 的库函数,其功能是调用 DOS 的 INT21H 中断 */ intdosx(amp。 regs,amp。 regs,amp。 segregs)。 /* MK_FP():不是一个函数,只是一个宏。 */ /*其功能是做段基址加上偏移地址的运算,也就是取实际地址。 */ indos_ptr=MK_FP(,)。 /*获得严重错误标志的地址 */ /*代码中用到的 _osmajor、 _osminor 是 Turbo C 的全程变量,其中前者为 */ /*DOS 版本号的主要部分,后者为版本号的次要部分。 */ if (_osmajor3) crit_err_ptr=indos_ptr+1。 else if (_osmajor==3 amp。 amp。 _osminor==0) crit_err_ptr=indos_ptr1。 else { =GET_CRIT_ERR。 intdosx(amp。 regs,amp。 regs,amp。 segregs)。 crit_err_ptr=MK_FP(,)。 } } /* DosBusy():函数功能是获得 Indos 标志及严重错误标志的值,判断是否 dos 忙: */ /* 如果返回值是 1,表示 dos 忙; */ /* 如果返回值是 0,表示 dos 不忙; */ /* 如果返回值是 1,表示还没有调用 InitDos() */ int DosBusy(void) { if (indos_ptr amp。 amp。 crit_err_ptr) return(*indos_ptr || *crit_err_ptr)。 else return(1)。 /* InitDos() hasn39。 t been called */ } void interrupt new_int8(void) { int loop=0。 (*old_int8)()。 if(++timecount TL) return。 if(DosBusy()) return。 disable()。 /*保存旧线程的指针 */ tcb[now].ss = _SS。 tcb[now].sp = _SP。 if(tcb[now].state == RUNNING) tcb[now].state = READY。 if( ++now == NTCB ) now = 1。 while(tcb[now].state != READY amp。 amp。 ++loop NTCB1) { now++。 if(now == NTCB) now = 1。 } if(tcb[now].state != READY) now = 0。 _SS = tcb[now].ss。 _SP = tcb[now].sp。 tcb[now].state = RUNNING。 timecount = 0。 /* tcb_state()。 */ enable()。 } void interrupt swtch(void) { int loop=0。 disable()。 tcb[now].ss=_SS。 tcb[now].sp=_SP。 if(tcb[now].state==RUNNING) tcb[now].state=READY。 /* 放入就绪队列中 */ if(++now==NTCB) now=0。 while(tcb[now].state!=READY amp。 amp。 loop++NTCB1) { now++。 if(now==NTCB) now=0。 } if(tcb[now].state!=READY) now=0。 _SS=tcb[now].ss。 _SP=tcb[now].sp。 /* 保存现场 */ tcb[now].state=RUNNING。 timecount=0。 enable()。 } void block(unsigned *chan, struct TCB **qp) {/*线程阻塞原语 */ int id。 struct TCB *tcbp。 id = now。 tcb[id].state = BLOCKED。 tcb[id].chan = chan。 if ((*qp) == NULL) (*qp) = amp。 tcb[id]。 else { tcbp = *qp。 while (tcbpnext != NULL) tcbp = tcbpnext。 tcbpnext = amp。 tcb[id]。 } tcb[id].next = NULL。 swtch()。 } void wakeup_first(struct TCB **qp) { /*线程唤醒原语 */ int i。 struct TCB *tcbp。 if ((*qp) == NULL) return。 tcbp = (*qp)。 (*qp) = (*qp)next。 tcbpstate = READY。 tcbpchan = NULL。 tcbpnext = NULL。 } void p(semaphore *sem) { struct TCB **qp。 disable()。 semvalue=semvalue1。 if(semvalue0){ qp=amp。 (semwq)。 block((unsigned *)sem,qp)。 printf(\n***i dont have semaphore so hangup***\n)。 } enable()。 } void v(semaphore *sem) { struct TCB **qp。 disable()。 qp=amp。 (semwq)。 semvalue=semvalue+1。 if(semvalue=0) wakeup_first(qp)。 enable()。 } struct buffer *remov(struct buffer **mq, int sende) { struct buffer *p, *q, *buff。 q = NULL。 p = *mq。 while ((psender != sende) amp。 amp。 (pnext != NULL)) { q = p。 p = pnext。 } if (psender == sende) { buff = p。 if (q == NULL) *mq = buffnext。 else qnext = buffnext。 buffnext = NULL。 return (buff)。 } else { return (NULL)。 } } void send(char *receiver,char *a,int size) { struct buffer *buff。 int i,id=1。基于dos的多任务系统实现课程设计(编辑修改稿)
相关推荐
C887 的具体引脚功能如下: DS12887内部由振荡电路,分频电路,周期中断 /方波选择电路, 14字节时 钟和控制单元, 114字节用户非易失 RAM,十进制 /二进制累加器,总线接口电路,电源开关写保护单元和内部锂电池等部分组成。 DS12887引脚分配如图 ,各管脚说明如下: VCC:直流电源 +5V电压。 当 5V电压在正常范围内时,数据可读写;当 Vcc低于 ,读写被禁止
可以通过按下图所示设置 R0 和 R1位来设定 DS18B20 的精度。 上电默认设置: R0=1,R1=1( 12 位精度)。 注意:精度和转换时间之间有直接的关系。 暂存器的位 7 和位 04被器件保留,禁止写入;在读回数据时,它们全部表现为逻辑 1。 bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0 0 R1 R0 1 1 1 1 1 图 17 配置寄存器 表
t e m p 5 0H _ t e m p = 5 0 H _ t e m p = 5 0YYYYYYYYYY YNNNNN NNNNN 检测键盘扫描是否有返回值,判断是否有按键按下。 若无按键按下,则进行数码管显示数据处理;若有按键按下且为 K1 键, mode 自加 1 ,并判断 mode是否大于 2,若大于 2, mode 清零后输出,若不大于 2,直接输出 mode;若有按键按下且为
门群组配置 权限配置 数据库配置 帮助主题 签报审批 工作督办 公文编号管理 公文类型管理 公文流程管理 10 的完成情况给予批示意见,督办的管理部门负责督办的登记、呈报、传阅、分发和归档等相关工作。 公文配置管理模块 ( 1) 公文类型管理 创建、查询,修改公文类型,每种公文类型可以选择操作界面、打印页面,公文审批流程等。 ( 2)公文编号管理 创建、查询、修改,作废公文编号
是人工喷制,也可以直接以物体表面的自然纹理作为实验标记;另外仅需要单 个或两个固定的 CCD,来拍摄被测物体表面变形前后的数字图像。 通过计算拍摄过程中得到的一组数字图像即可得到物体表面的变形信息。 ( 2)对光源光源和隔震条件要求不高。 直接使用白光或者自然光作为照明光源,不需要激光光源和隔振台,这样对测量环境的要求非常低,非常容易实现现场测量。 ( 3)测量过程易于实现自动化。
e%10。 write_LCD_(0x80+0x40+add)。 write_LCD_da(0x30+shi)。 write_LCD_da(0x30+ge)。 write_LCD_da(0xdf)。 write_LCD_da(0x43)。 } void DS1302_write_byte(uchar a) { uchar i。 ACC=a。 RST=1。 for(i=8。 i0。 i) {