求教 UC/OS_2信号量问题

留住最美好的时光 2012-07-04 04:47:24
我建立2个任务切换画圆,任务一画个圆再任务二画一个,然后释放信号量给在等待的任务一,任务一的优先级为10,任务二11,一个信号量pevent 任务二总是在执行,而任务一只能执行很少的时间,怎样才能让2个任务执行的时间一样,
代码:#include "includes.h"
//-----------堆栈-----------
#define TASK_STK_SIZE 512 //定义堆栈大小
OS_STK Task1Stk[TASK_STK_SIZE]; //定义 Task1Stk任务堆栈区


OS_STK Task2Stk[TASK_STK_SIZE]; //定义 Task2Stk任务堆栈区


OS_STK Task3Stk[TASK_STK_SIZE]; //定义 Task3Stk任务堆栈区

//-----------函数声明-----------
void Task1(void *data);

void Task2(void *data);

void Task3(void *data);

void DelayMS(uint32 dly);

OS_EVENT *pevent;
/******************************************************************************
main函数
******************************************************************************/
void main (void)
{
uint8 err;

//---------显示静态的图形框架------
uCOSFrame_Disp(3);
Title_Disp(6,"Lixiang");

OSInit();
PC_DOSSaveReturn();
PC_VectSet(uCOS, OSCtxSw);

pevent = OSSemCreate(0); //创建信号量
//---------------创建任务----------------
OSTaskCreate(Task1, (void *)0, &Task1Stk[TASK_STK_SIZE - 1], 10);
Task_Map(10,"Task1"); //任务名称映射
//---------------------------------------------------------------------------
OSTaskCreate(Task2, (void *)0, &Task2Stk[TASK_STK_SIZE - 1], 11);
Task_Map(11,"Task2"); //任务名称映射
// OSTaskCreate(Task3, (void *)0, &Task3Stk[TASK_STK_SIZE - 1], 9);
// Task_Map(9,"Task3"); //任务名称映射
//----------------------------------------------------------------------------

OSStart();
}
/******************************************************************************
Task任务
******************************************************************************/
void Task1(void *data)
{
#if OS_CRITICAL_METHOD == 3
OS_CPU_SR cpu_sr;
#endif
INT8U err, key, i=0;



//---------------时钟节拍设置----------
OS_ENTER_CRITICAL(); //安装UCOS-II时钟中断向量
PC_VectSet(0x08, OSTickISR);
PC_SetTickRate(OS_TICKS_PER_SEC); //设置UCOS-II时钟频率
OS_EXIT_CRITICAL();

data = data;
//----------------------死循环------------------

while(TRUE)
{
// GUI_Circle(15,440,5,2);
OSSemPend(pevent,0,&err); // 等待信号量

if (PC_GetKey(&key) == TRUE) //按ESC键,退出程序
if((key == 0x1B)) PC_DOSReturn();
else
{ switch(key)
{
case 'w': GUI_Circle(100,280,5,2); break;
case 'a': GUI_Circle(100,270,5,2); break;
case 's': GUI_Circle(100,260,5,2); break;
case 'd': GUI_Circle(100,250,5,2); break;
default : ;break;
}
// OSSemPost(pevent);
}
// OSTimeDly(30);
}

}

void Task2(void *data)
{
#if OS_CRITICAL_METHOD == 3
OS_CPU_SR cpu_sr;
#endif
INT8U err,key;

data = data;
//----------------------死循环------------------
while(TRUE)
{
// GUI_Circle(25,320,10,8);
// OSSemPend(pevent,0,&err);
if (PC_GetKey(&key) == TRUE) //按ESC键,退出程序
{
if((key == 0x1B)) PC_DOSReturn();
else{
switch(key)
{
case 'w': GUI_Circle(25,300,10,8);break;
case 'a': GUI_Circle(25,310,10,8);break;
case 's': GUI_Circle(25,320,10,8);break;
case 'd': GUI_Circle(25,330,10,8);break;
default : ;break;
}

}

OSSemPost(pevent); //释放信号量

OSTimeDly(20);
}

}
}
...全文
55 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

3,882

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧