#include "includes.h"
#define TASK_STK_SIZE 512 //任务堆栈长度
OS_STK MyTaskStk[TASK_STK_SIZE]; //定义任务堆栈区
OS_STK YouTaskStk[TASK_STK_SIZE]; //定义任务堆栈区
INT16S key; //用于退出uCOS_II的键
INT8U y1=0,y2=0; //字符显示位置
BOOLEAN ac_key; //定义信号量
char* s="原始数据"; //定义要显示的字符
void MyTask(void *data); //声明任务
void YouTask(void *data); //声明任务
/************************主函数*********************************/
void main (void)
{
OSInit( ); //初始化uCOS_II
ac_key=1; //设置信号量初值
PC_DOSSaveReturn( ); //保存Dos环境
PC_VectSet(uCOS, OSCtxSw); //安装uCOS_II中断
OSTaskCreate(MyTask, //创建任务MyTask
(void*)0, //给任务传递参数
&MyTaskStk[TASK_STK_SIZE - 1], //设置任务堆栈栈顶指针
0); //使任务的优先级别为0
OSStart( ); //启动uCOS_II的多任务管理
}
/***********************任务MyTask********************************/
void MyTask (void *pdata)
{
#if OS_CRITICAL_METHOD == 3
OS_CPU_SR cpu_sr;
#endif
INT8U err;
pdata = pdata;
OS_ENTER_CRITICAL( );
PC_VectSet(0x08, OSTickISR); //安装uCOS_II时钟中断向量
PC_SetTickRate(OS_TICKS_PER_SEC); //设置uCOS_II时钟频率
OS_EXIT_CRITICAL( );
OSStatInit( ); //初始化uCOS_II的统计任务
OSTaskCreate(YouTask, //创建任务MyTask
(void*)0, //给任务传递参数
&YouTaskStk[TASK_STK_SIZE - 1], //设置任务堆栈栈顶指针
2); //使任务的优先级别为2
for (;;)
{
if(ac_key)
{
ac_key=FALSE; //使信号量无效
s="MyTask访问共享数据s";
PC_DispStr(5, ++y1, //显示字符的位置
s,
DISP_BGND_BLACK+DISP_FGND_WHITE);
ac_key=TRUE; //发信号
}
//如果按下Esc键则退出uCOS_II
if (PC_GetKey(&key) == TRUE)
{
if (key == 0x1B)
{
PC_DOSReturn( );
}
}
OSTimeDly(20); //等待20个时钟节拍
}
}
/************************任务YouTask****************************/
void YouTask (void *pdata)
{
#if OS_CRITICAL_METHOD == 3
OS_CPU_SR cpu_sr;
#endif
INT8U err;
pdata = pdata;
for (;;)
{
if(ac_key)
{
ac_key=FALSE; //使信号量为无信号
s="YouTask访问共享数据s";
PC_DispStr(28, ++y2, //显示字符串
s,
DISP_BGND_BLACK+DISP_FGND_WHITE );
OSTimeSet(0); //置OSTime为0
while(OSTime<500)
{
PC_DispStr(55, y2, //显示字符串
s,
DISP_BGND_BLACK+DISP_FGND_WHITE );
}
ac_key=TRUE; //发信号
}
OSTimeDly(10); //等待10个时钟节拍
}
这是任哲UCOS书中的一段代码,其中ac_key为一个公用信号量。想请教下大神,在这段程序中灰色的代码部分, YouTask的while循环中会发生什么?
我也在电脑上实验了一下,在YouTask的while循环中,循环次数为500个时钟节拍,而MyTask 的等待时间为20个时钟节拍,所以在 YouTask的while循环中,
MyTask每隔20个时钟节拍 也会运行。
现在就是不明白,while循环中MyTask运行了后,程序会怎样运行。
根据实验现象,while循环中发生了中断级调度->调用MyTask->MyTask运行了后继续回到中断处执行while循环。
按我的理解,while循环中发生了中断级调度->调用MyTask->运行到MyTask的延时函数->进行任务调度,运行YouTask。(这是我表面上的理解,肯定错误,但是就是不知道调用MyTask后,程序是怎么运行的,所以请高手解答一下)
|