我使用UCOSIII內建訊息機制,想通過任務A給任務B發送一個訊息,任務B根據接收到訊息并列印,同時任務B還有其他作業要做,想通過OS_OPT_PEND_NON_BLOCKING,檢查如果沒有接收到A的訊息就繼續回圈,不對任務B進行阻塞。
問題是:使用了OS_OPT_PEND_NON_BLOCKING之后,程式一直在任務B中回圈不會再切換到任務A中運行了。
以下是任務B的接收函式
void modbus_tcp_thread(void *arg)
{
struct netbuf *p;
u8 i = 0;
u8 buf[10];
OS_MSG_SIZE size;
OS_ERR err;
// printf("**modbus_tcp_thread任務開始:\r\n");
printf("**modbus_tcp_thread任務 任務優先級:%d\r\n",MODBUSTCP_PRIO);
eMBEnable( );
while (1)
{
eMBPoll();
//請求訊息OS_OPT_PEND_BLOCKING 如果沒有任何訊息存在的話就阻塞任務,一直等待,直到接收到訊息
p=OSTaskQPend((OS_TICK )0,
(OS_OPT )OS_OPT_PEND_NON_BLOCKING,//OS_OPT_PEND_NON_BLOCKING 如果訊息佇列沒
//有 任何訊息的話任務就直接回傳
(OS_MSG_SIZE* )&size,
(CPU_TS* )0,
(OS_ERR* )&err );
if(err == OS_ERR_NONE)
{
printf("size:%d",size);
memcpy(buf,p,size);
printf("Modbus接收資料:");
for(i=0;i<size;i++)
{
printf("%d,",buf[i]);
}
printf("\r\n");
}
myfree(SRAMIN,p); //釋放記憶體
}
}
以下是任務A的發送函式:
printf("第%d組資料:",j);
for(i=0;i<10;i++)
{
buf[i] = i*j;
printf("%d,",buf[i]);
}
printf("\r\n");
//發送訊息
OSTaskQPost((OS_TCB* )&ModbusTCPTaskTCB, //向任務Msgdis發送訊息
(void* )buf,
(OS_MSG_SIZE)10,
(OS_OPT )OS_OPT_POST_FIFO,
(OS_ERR* )&err1);
補充以下:使用OS_OPT_PEND_BLOCKING,當任務A給任務B發送訊息后,任務B就會執行下面的列印。假如A不發送訊息任務B就會被掛起,直到有訊息接收。目前就是想讓任務B在沒有訊息接收的時候也進行while()大回圈!!!!
uj5u.com熱心網友回復:
優先級劃分對么?
uj5u.com熱心網友回復:
你這挖墳呢uj5u.com熱心網友回復:
應該是系統隨機推的吧?
有段時間沒來,我也只挖兩三頁而已
uj5u.com熱心網友回復:
規劃一下優先級的劃分uj5u.com熱心網友回復:
while(1)里面應該要加延時的吧(ucosIII系統的延時函式,不是自己寫的延時),要不然其他任務沒機會運行。我剛學這個,也不知道對不對轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/79957.html
標籤:單片機/工控
上一篇:arduino上傳出錯怎么辦
