我移植通过了,创建任务、删除任务这些实验也做过,没问题,然后我就准备来学习信号量,就发现问题了。
//这个是起始任务
void TaskStart(void * pdata)
{
pdata = pdata;
Sem_Event = OSSemCreate(1); //创建信号量
OSTaskCreate(MY_STK, (void * )0,(OS_STK *)&TaskMy_STK[LED_STK_SIZE], LED_TASK_Prio);
OSTaskCreate(YOU_STK, (void * )0,(OS_STK *)&TaskYou_STK[LED_STK_SIZE], LED1_TASK_Prio);
err=OSTaskDel(OS_PRIO_SELF);//删除自己 OSTaskSuspend(START_TASK_Prio);
}
我在开始任务中创建了一个信号量 Sem_Event = OSSemCreate(1);
在运行完 TaskStart任务之后,就进入MY_STK任务。 MY_STK 优先级比 YOU_STK 高
如果这个创建信号量放在 MY_STK,YOU_STK前面创建的话, 信号量的(tpye)类型也会发生变化(即不是Sem信号类型了)。
这结果是我跟踪程序的时候发现的:
在MY_STK任务的信号量请求和释放的函数中,程序运行了下列 return (OS_ERR_EVENT_TYPE); 这行语句,说明了信号量的类型发生改变了 如果我删除了 err=OSTaskDel(OS_PRIO_SELF);//删除自己 OSTaskSuspend(START_TASK_Prio); 这条语句的话,信号量类型又不会发生变化
这到底是怎么回事的呢?
if (pevent->OSEventType != OS_EVENT_TYPE_SEM) { /* Validate event block type */
return (OS_ERR_EVENT_TYPE);
}
void MY_STK(void * pdata)
{
while(1)
{
OSSemPend(Sem_Event,0,&err); //请求信号量
GPIO_ResetBits(GPIOA,GPIO_Pin_8);
OSSemPost(Sem_Event); //发送(释放)信号量
OSTimeDlyHMSM(0,0,0,250);
}
}
这个任务的 OSSemPend(Sem_Event,0,&err); //请求信号量 前面 加上一个测量信号量Sem_Event->OSEventCnt的值发现,我都还没请求信号量的呢,OSEventCnt的值就变成0了。
下面这个是YOU_STK任务
void YOU_STK(void * pdata)
{
while(1)
{
OSSemPend(Sem_Event,0,&err); //请求信号量
GPIO_ResetBits(GPIOD,GPIO_Pin_2);
OSSemPost(Sem_Event); //发送(释放)信号量
OSTimeDlyHMSM(0,0,0,250);
}
}
经过我初步验证后 貌似是 每次切换任务的时候 信号量的CNT值就会发生变化。
还有,我在MY_STK 任务的 OSSemPost(Sem_Event); //发送(释放)信号量 后检测到了CNT的值会变为1,但是经过
OSTimeDlyHMSM(0,0,0,250); 之后跳入YOU_STK任务的时候,在 OSSemPend(Sem_Event,0,&err); //请求信号量
之前来检测CNT的值,发现又变为0了,真奇怪
我没发现任务切换和信号量有什么关系啊。
我百思不得其解,这是什么原因呢?
我粗略的跟踪了下程序,发现没有什么和信号量等变化有关的函数和变量。
请各位兄弟姐妹门忙帮解决一下