linux信号量参数能在线改吧,UCOSII信号量有问题,CNT值会自己变化
我移植通過了,創建任務、刪除任務這些實驗也做過,沒問題,然后我就準備來學習信號量,就發現問題了。
//這個是起始任務
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了,真奇怪
我沒發現任務切換和信號量有什么關系啊。
我百思不得其解,這是什么原因呢?
我粗略的跟蹤了下程序,發現沒有什么和信號量等變化有關的函數和變量。
請各位兄弟姐妹門忙幫解決一下
總結
以上是生活随笔為你收集整理的linux信号量参数能在线改吧,UCOSII信号量有问题,CNT值会自己变化的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 00后明星帅哥排行榜(00后明星)
- 下一篇: 全品作业本九上数学答案新课标(全品作业本