实验7 时钟中断

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验7 时钟中断
1 实验目的
掌握嵌入式实时操作系统µC/OS中中断的使用情况。

2 原理及程序结构
2.1 实验设计
在本实验中,设计了三个任务Task1、Task2、Task3,创建了一个信号量InterruptSem。

整个系统的运行流程如下:
1)系统初始化,在TaskStart任务中,创建并启动任务Task1、Task2、Task3,优先级分别为12,13,14。

2)在TaskStart任务中创建一个信号量InterruptSem(初值为1)。

3)任务在TaskStart任务中挂起自己,操作系统实施调度,进入Task1运行;
4)任务Task1睡眠100ticks;
5)任务Task2开始执行, 任务Task2获得信号量InterruptSem;
6)任务Task2睡眠500tick,任务Task3投入运行,打印输出语句后延时,任务Task1睡眠时间到继续投入运行,它申请信号量InterruptSem失败被阻塞;
7)任务Task3投入运行,循环地打印输出语句。

期间时钟中断不断产生,在中断处理程序中对任务Task2的睡眠时间进行计数;
8)Task2睡眠时间到后恢复运行,并释放信号量InterruptSem;
9)Task1获得信号量InterruptSem后抢占Task2运行;
10)Task1使用完信号量InterruptSem后释放该信号量;
11)系统从步骤4重复执行,一直运行下去……
程序代码如下:
/*起始任务*/
void TaskStart(void *pdata){
printf("uC/OS-II is Started\n==============================\n\n");
TargetInit(); /* 目标板初始化 */
OSTaskCreate(Task1, (void *)0, &TaskStk1[TASK_STK_SIZE - 1], 8);
OSTaskCreate(Task2, (void *)0, &TaskStk2[TASK_STK_SIZE - 1], 9);
OSTaskCreate(Task3, (void *)0, &TaskStk3[TASK_STK_SIZE - 1], 10);
for(;;){
O STaskSuspend(0); /* 挂起优先级为0的任务,即为TaskStart任务本身 */ }
}
/*应用任务1*/
void Task1 (void *pdata){
uint8 err;
pdata = pdata;
for (;;){
OSTimeDly(100); /* Task1延时100个时钟节拍 */
printf("\nTask1 is try to get semaphore.\n\n");
OSSemPend(InterruptSem, 0, &err); /* 申请信号量InterruptSem */
printf("Task1 has Succeed to obtain semaphore.\n");
printf("Task1 is delayed.\n\n");
OSTimeDly(200); /* Task1延时200个时钟节拍 */
printf("\nThe delay of Task1 finished .\n");
printf("Task1 release semaphore.\n");
OSSemPost(InterruptSem); /* 释放信号量InterruptSem */
OSTimeDly(200); /* Task1延时200个时钟节拍 */ }
}
/*应用任务2*/
void Task2 (void *pdata){
uint8 err;
pdata = pdata;
for (;;){
printf("\nTask2 is try to get semaphore.\n");
OSSemPend(InterruptSem, 0, &err); /* 申请信号量InterruptSem */
printf("Task2 has Succeed to obtain semaphore.\n");
printf("Task2 is delayed.\n\n");
OSTimeDly(500); /* Task2延时500个时钟节拍 */
printf("\nThe delay of Task2 finished .\n");
printf("Task2 release semaphore.\n");
OSSemPost(InterruptSem); /* 释放信号量InterruptSem */
OSTimeDly(200); /* Task2延时200个时钟节拍 */ }
}
/*应用任务3*/
void Task3 (void *pdata){
pdata = pdata;
for (;;){
printf("Task3 has got the CPU:|||||||||||||||||||||||||||||||||||||\n");
OSTimeDly(100); /* Task3延时100个时钟节拍 */ }
}
2.2 操作系统配置
修改uC_OS-II/OS_CFG.h:
#define OS_MAX_EVENTS 10 /*最多可以有10个事件*/
#define OS_MAX_FLAGS 5 /*最多可以有5个事件标志*/
#define OS_MAX_MEM_PART 10 /*最多可以划分5个内存块*/
#define OS_MAX_QS 2 /*最多可以使用2个队列*/
#define OS_MAX_TASKS 9 /*最多可以创建9个任务*/
#define OS_LOWEST_PRIO 24 /*任务优先级不可以大于24*/
#define OS_TASK_IDLE_STK_SIZE 1024 /*空闲任务堆栈大小*/
#define OS_TASK_STA T_EN 1 /*是否允许使用统计任务*/
#define OS_TASK_STA T_STK_SIZE 1024 /*统计任务堆栈大小*/
#define OS_FLAG_EN 0 /*是否允许使用事件标志功能*/
#define OS_MBOX_EN 1 /*是否允许使用邮箱功能*/
#define OS_MBOX_ACCEPT_EN 1 /*是否允许使用OSMboxAccept() */ #define OS_MBOX_DEL_EN 1 /*是否允许使用OSMboxDel()*/
#define OS_MBOX_POST_EN 1 /*是否允许使用OSMboxPost()*/
#define OS_MBOX_POST_OPT_EN 1 /*是否允许使用OSMboxPostOpt() */ #define OS_MBOX_QUERY_EN 1 /*是否允许使用OSMboxQuery()*/
#define OS_MEM_EN 1 /*是否允许使用内存管理的功能*/
#define OS_MEM_QUERY_EN 1 /*是否允许使用OSMemQuery()*/
#define OS_MUTEX_EN 1 /*是否允许使用互斥信号量的功能*/ #define OS_MUTEX_ACCEPT_EN 1 /*是否允许使用OSMutexAccept()*/
#define OS_MUTEX_DEL_EN 1 /*是否允许使用OSMutexDel()*/
#define OS_MUTEX_QUERY_EN 1 /*是否允许使用OSMutexQuery()*/
#define OS_Q_EN 1 /*是否允许使用队列功能*/
#define OS_Q_ACCEPT_EN 1 /*是否允许使用OSQAccept()*/
#define OS_Q_DEL_EN 1 /*是否允许使用OSQDel()*/
#define OS_Q_FLUSH_EN 1 /*是否允许使用OSQFlush()*/
#define OS_Q_POST_EN 1 /*是否允许使用OSQPost()*/
#define OS_Q_POST_FRONT_EN 1 /*是否允许使用OSQPostFront()*/
#define OS_Q_POST_OPT_EN 1 /*是否允许使用OSQPostOpt()*/
#define OS_Q_QUERY_EN 1 /*是否允许使用OSQQuery()*/
#define OS_SEM_EN 1 /*是否允许使用信号量功能*/
#define OS_SEM_ACCEPT_EN 1 /*是否允许使用OSSemAccept()*/
#define OS_SEM_DEL_EN 1 /*是否允许使用OSSemDel() */
#define OS_SEM_QUERY_EN 1 /*是否允许使用OSSemQuery()*/
#define OS_TASK_CHANGE_PRIO_EN 1 /*是否允许使用OSTaskChangePrio()*/ #define OS_TASK_CREATE_EN 1 /*是否允许使用OSTaskCreate()*/
#define OS_TASK_CREATE_EXT_EN 1 /*是否允许使用OSTaskCreateExt()*/ #define OS_TASK_DEL_EN 1 /*是否允许使用OSTaskDel()*/
#define OS_TASK_SUSPEND_EN 1 /*是否允许使用OSTaskSuspend() and OSTaskResume()*/ #define OS_TASK_QUERY_EN 1 /*是否允许使用OSTaskQuery()*/
#define OS_TIME_DL Y_HMSM_EN 0 /*是否允许使用OSTimeDlyHMSM()*/
#define OS_TIME_DL Y_RESUME_EN 1 /*是否允许使用OSTimeDlyResume()*/
#define OS_TIME_GET_SET_EN 1 /*是否允许使用OSTimeGet() 和OSTimeSet()*/
#define OS_SCHED_LOCK_EN 1 /*是否允许使用OSSchedLock()和OSSchedUnlock()*/ #define OS_TICKS_PER_SEC 200 /*设置每秒之内的时钟节拍数目*/
2 运行及观察应用输出信息
串口输出结果1
串口输出结果2
4 本实验中所用到的µC/OS-II相关函数
OSSemCreate()
OSSemPend()
OSSemPost()
OSTimeDly()
函数的具体介绍请参考实验“优先级继承”的相关内容。

相关文档
最新文档