实验六 uCOS的中断与时钟
时间:2026-01-17
时间: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字,全部文档内容请下载后查看。喜欢就下载吧 ……
上一篇:校园网设计与组建方案(实验报告)