不管裸機還是作業系統,都有任務間的通訊。在裸機程式中,我們大多數時候用全域性變數進行任務間的通訊。而在作業系統中,任務間通訊可以使用訊號量,互斥量,訊息佇列等。在osal中使用訊息佇列作為任務間通訊的手段。
osal中訊息佇列的本質就是乙個單向鍊錶,在這乙個鍊錶上掛接著所有任務的訊息事件,有乙個煉表頭指向佇列中第乙個節點中的訊息內容首位址,鍊錶的每個節點由訊息頭部和訊息內容組成,訊息頭部由訊息長度,目標任務id和乙個指向下個訊息內容首位址的指標組成。如下圖(圖中的task_id有可能重複,也就是說鍊錶節點以訊息為單元,來乙個訊息不管是哪個任務的都掛在隊尾或者隊頭):
//形參msg_ptr是訊息內容的首位址
static uint8 osal_msg_enqueue_push( uint8 destination_task, uint8 *msg_ptr, uint8 push )
//如果目標任務id大於總的任務數,則釋放為該訊息分配的記憶體
if ( destination_task >= taskscnt )
// check the message header
//如果即將入隊的這個訊息指向的下乙個訊息內容不為空或者目標任務id不為0,則釋放記憶體返回錯誤
if ( osal_msg_next( msg_ptr ) != null ||
osal_msg_id( msg_ptr ) != task_no_task )
//給目標任務id賦值
osal_msg_id( msg_ptr ) = destination_task;
if ( push == true )
else
// signal the task that a message is waiting
//給相應的任務傳送有訊息正在等在等待的訊號
osal_set_event( destination_task, sys_event_msg );
return ( success );
}void osal_msg_enqueue( osal_msg_q_t *q_ptr, void *msg_ptr )
else
// re-enable interrupts
hal_exit_critical_section(intstate);
}
//該函式功能:找到乙個屬於task_id的訊息,並且返回這個訊息指標,釋放該訊息記憶體;同時還要判斷是否需要再次執行該函式(傳送sys_event_msg訊號)
uint8 *osal_msg_receive( uint8 task_id )
else
}//保證每次找到乙個task_id的訊息時,記錄下該訊息的前乙個節點(不是task_id的訊息),以便後面刪除訊息節點使用
if ( foundhdr == null )
listhdr = osal_msg_next( listhdr );
} // is there more than one?
//不止乙個訊息,此時需要傳送訊號,待下次處理
if ( listhdr != null )
else
// did we find a message?
//發現了乙個訊息,需要釋放刪除該訊息節點並釋放記憶體
if ( foundhdr != null )
// release interrupts
hal_exit_critical_section(intstate);
//返回找到的訊息的指標
return ( (uint8*) foundhdr );
}//函式形參 q_ptr:訊息佇列頭指標(煉表頭指標)
// msg_ptr:要刪除的訊息指標
// prev_ptr:要刪除的訊息指標的前乙個節點
void osal_msg_extract( osal_msg_q_t *q_ptr, void *msg_ptr, void *prev_ptr )
else
osal_msg_next( msg_ptr ) = null;
osal_msg_id( msg_ptr ) = task_no_task;
// re-enable interrupts
hal_exit_critical_section(intstate);
}
訊息佇列二
queue只有maxsize乙個構造引數,用來指定佇列容量,指定為0的時候代表容量無限。主要有以下成員函式 queue.qsize 返回訊息佇列的當前空間。返回的值不一定可靠 queue.empty 判斷訊息佇列是否為空,返回true或false。同樣不可靠 queue.full 類似上邊,判斷訊息...
system v 訊息佇列(二)
1 功能 把一條訊息新增到訊息佇列中 2 原型 intmsgsnd int msqid,const void msgp.size t msgsz,int msg 3 引數 msgqid 由msgget函式返回的訊息佇列標識碼 msgp 是乙個指標,指標指向準備傳送的訊息 msgsz 是msgp指向的...
訊息佇列學習二
感覺有必要補充一篇訊息佇列技術的基本概念,無論rabbitmq activemq還是其他,都有的一些基本概念 術語 機制,分享給大家,希望大家在搞訊息佇列技術的時候能夠快速 理解 排上用場。1.訊息生產者 訊息者 佇列 主題 訊息生產者producer 傳送訊息到訊息佇列。訊息消費者consumer...