|
OSSemPend(Fun_Semp,0,&err);函数运行时并不处于等待状态。
当信号量初始化为0时,Fun_Semp=OSSemCreate(0); 理论上两个程序都应该处于等待状态,但在电脑上运行时发现两个程序一直在运行,没有处于等待状态。
/*编写一个应用程序,其中有一个函数Fun()和两个用户任务:MyTask和YouTask。应用程序中的两个任务都可以
调用此函数,但不能同时调用*/
#include "INCLUDES.h"
#define TASK_STK_SIZE 512 /* 任务堆栈长度*/
char *s1="MyTask";
char *s2="YouTask";
INT8U err;
INT8U y=0;
OS_EVENT *Fun_Semp; //声明信号量
OS_STK StartTaskStk[TASK_STK_SIZE]; //定义任务堆栈区
OS_STK MyTaskStk[TASK_STK_SIZE];
OS_STK YouTaskStk[TASK_STK_SIZE];
void Fun(INT8U x,INT8U y);
void StartTask(void *data);
void MyTask(void *data); /* 声明任务 */
void YouTask(void *data);
/*
*********************************************************************************************************
* MAIN主函数
*********************************************************************************************************
*/
void main (void)
{
Fun_Semp=OSSemCreate(0); //定义信号量
OSInit(); /* 初始化uC/OS-II */
PC_DOSSaveReturn(); /* 保存DOS环境 */
PC_VectSet(uCOS, OSCtxSw); /* 安装uC/OS-II的中断 */
OSTaskCreate(StartTask,(void *)0, &StartTaskStk[TASK_STK_SIZE - 1], 0); //创建起始函数
OSStart(); /* 启动多任务管理 */
}
void StartTask(void *pdata)
{
#if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
OS_CPU_SR cpu_sr;
#endif
INT16S key; /*用于退出的建*/
pdata = pdata; /* Prevent compiler warning */
OS_ENTER_CRITICAL();
PC_VectSet(0x08, OSTickISR); /* 安装时钟中断向量 */
PC_SetTickRate(OS_TICKS_PER_SEC); /* 设置时钟频率 */
OS_EXIT_CRITICAL();
OSStatInit(); /* 初始化统计任务 */
OSTaskCreate(MyTask,(void *)0, &MyTaskStk[TASK_STK_SIZE - 1], 1); //创建任务函数
OSTaskCreate(YouTask,(void *)0, &YouTaskStk[TASK_STK_SIZE - 1], 2); //创建任务函数
for (;;)
{
//如果恩下ESC键,则退出UC/OS-II
if (PC_GetKey(&key) == TRUE)
{ /* See if key has been pressed */
if (key == 0x1B)
{ /* Yes, see if it's the ESCAPE key */
PC_DOSReturn(); /* Return to DOS */
}
}
OSTimeDlyHMSM(0,0,3,0); /* 等待3S*/
}
}
void MyTask(void *pdata)
{
#if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
OS_CPU_SR cpu_sr;
#endif
pdata = pdata; /* Prevent compiler warning */
for (;;)
{
OSSemPend(Fun_Semp,0,&err); //请求信号量
PC_DispStr(0,++y,s1,DISP_BGND_BLACK+DISP_FGND_WHITE);
Fun(7,y);
// OSSemPost(Fun_Semp); //发送信号量
OSTimeDlyHMSM(0,0,1,0); /* 等待1S*/
}
}
void YouTask(void *pdata)
{
#if OS_CRITICAL_METHOD == 3 //Allocate storage for CPU status register
OS_CPU_SR cpu_sr;
#endif
pdata=pdata;
for (;;)
{
OSSemPend(Fun_Semp,0,&err); //请求信号量
PC_DispStr(0,++y,s2,DISP_BGND_BLACK+DISP_FGND_WHITE);
Fun(7,y); //调用FUN函数
// OSSemPost(Fun_Semp);
OSTimeDlyHMSM(0,0,2,0); //等2s
}
}
void Fun(INT8U x,INT8U y)
{
PC_DispStr(x,y," Calling FUN()",DISP_BGND_BLACK+DISP_FGND_WHITE);
}
|
阿莫论坛20周年了!感谢大家的支持与爱护!!
知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)
|