实验六 uCOS的中断与时钟

时间:2026-01-17

实验六中断与时钟

一:实验目的:

系统响应中断的过程是:系统接收到中断请求后,如果这时CPU处于中断允许状态,系统就会终止正在运行的当前任务,而按照中断向量的指向转而去运行中断服务子程序;当中断服务子程序运行结束后,系统就会根据情况返回到被终止的任务继续运行,或者转向另一个具有跟高优先级的就绪任务。

二:实验内容:

完成教材4-2的实验内容,观察结果,掌握时钟与中断机制。

#include "includes.h"

#define TASK_STK_SIZE 512

OS_STK MyTaskStk[TASK_STK_SIZE];

OS_STK YouTaskStk[TASK_STK_SIZE];

OS_STK InterTaskStk[TASK_STK_SIZE];

INT16S

INT8U key; x=0,y=0;

BOOLEAN InterKey=FALSE;

char *s = "运行了中断所要求运行的任务InterTask。";

voidMyTask(void *data);

voidYouTask(void *data);

voidInterTask(void *data);

/***************************主函数**********************/

void main(void)

{

char * s_M="M";

OSInit();

PC_DOSSaveReturn();

PC_VectSet(uCOS,OSCtxSw);

OSTaskCreate(

MyTask, s_M, &MyTaskStk[TASK_STK_SIZE-1], 0 );

OSStart();

}

/***********************任务MyTask******************/

voidMyTask(void *pdata)

{

char* s_Y="Y";

char* s_H="H";

#if OS_CRITICAL_METHOD == 3;

OS_CPU_SR cpu_sr;

#endif

INT8U err;

pdata = pdata;

OS_ENTER_CRITICAL();

PC_VectSet(0x08,OSTickISR);

PC_SetTickRate(OS_TICKS_PER_SEC);

OS_EXIT_CRITICAL();

OSTaskCreate(

YouTask, s_H, &YouTaskStk[TASK_STK_SIZE-1], 1 );

OSTaskCreate(

s_M, &InterTaskStk[TASK_STK_SIZE-1], 2 );

for(;;)

{

}

}

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

voidYouTask(void * pdata) if(x>50) { } PC_DispChar(x,y, *(char *)pdata, DISP_BGND_BLACK+DISP_FGND_WHITE); x+=1; if(PC_GetKey(&key)==TRUE) { } OSTimeDlyHMSM(0,0,3,0); if(key==0x1B) { } PC_DOSReturn(); x=0; y+=2;

# if OS_CRITICAL_METHOD==3

OS_CPU_SR cpu_sr;

#endif

pdata=pdata;

for(;;)

{

}

}

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

voidInterTask(void * pdata)

{

# if OS_CRITICAL_METHOD==3

OS_CPU_SR cpu_sr;

#endif

pdata=pdata;

for(;;)

{

if(InterKey) if(x>50) { } PC_DispChar( x,y, *(char *)pdata, ); x=0; y+=2; x+=1; OSTimeDlyHMSM(0,0,1,0);

} } if(x>50) { } } InterKey=FALSE; OSIntNesting--; OSTimeDlyHMSM(0,0,1,0); PC_DispChar( x,y, *(char *)pdata, DISP_BGND_BLACK+DISP_FGND_WHITE); x=0; y+=2; PC_DispStr(5,6,s, DISP_BGND_BLACK+DISP_FGND_WHITE); x+=1;

/***********************************************************************/ extern BOOLEAN InterKey;

INT16U InterCtr=0;

voidOSTimeTickHook(void)

{

if(InterCtr==10000)

{

}

InterCtr++;

} InterKey=TRUE;

将os_cpu_c.c文件中的以下代码:

#if OS_CPU_HOOKS_EN > 0

void OSTimeTickHook (void)

{

}

#endif

改为:

#if OS_CPU_HOOKS_EN > 0

extern BOOLEAN InterKey;

INT16U InterCtr=0;

voidOSTimeTickHook(void)

{

if(InterCtr==10000)

{

}

InterCtr++;

}#endif

程序分析:程序运行时,按照优先级的高低,先运行MyTask,输出字符串:MyTask。然后MyTask需要等待3s,在MyTask等待的时候,YouTask运行,输出字符串:YouTask。然后InterTask运行,但是不输出任何内容。等到3s之后,MyTask获得cpu,运行,然后再等待。在运行到节拍数10000的时候,中断位置位。等到下次运行InterTask的时候,就会输出:"运行了中断所要求运行的任务InterTask。

InterKey=TRUE;

三:实验结果:

程序运行结果如下图所示:

…… 此处隐藏:651字,全部文档内容请下载后查看。喜欢就下载吧 ……
实验六 uCOS的中断与时钟.doc 将本文的Word文档下载到电脑

    精彩图片

    热门精选

    大家正在看

    × 游客快捷下载通道(下载后可以自由复制和排版)

    限时特价:4.9 元/份 原价:20元

    支付方式:

    开通VIP包月会员 特价:19元/月

    注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
    微信:fanwen365 QQ:370150219