2012-04-26 62 views
0

我一直有一些問題,我正在運行幾個任務。我有三個任務,其中一個是LCD更新任務,另外兩個是電機驅動任務。我還有兩個ISR將消息發佈到兩個電機驅動程序任務中。至於傳遞指針安全,我在想創建一個結構:實時操作系統 - 通過分配一個結構並傳遞它通過一個隊列

typedef struct message{ 
    enum BUTTON_1 = 0, BUTTON_2 = 1, NO_BUTTON = 3; //button ISR to increase motor drive 
    int timestamp; //A timestamp for the RPM of the motors 
    } 

現在,共享內存的問題進來,所以我想:

struct message* update_msg = (struct message*)malloc(sizeof(struct message)); //from here I dont know how to creat an object that fills the space allocated. 

我會再發指針通過隊列的結構:

OSTASKQPOST((void *)(st_size) 
    .... 
) 

在最後一次任務後最終得到的消息,並做它需要與成員變量是什麼,我將不得不解除分配內存。

free(st_size) 

會是這樣的似是而非?

回答

2

這是在線程之間傳遞數據的'線程間通信101'方法。它會正常工作。假設32位寬的隊列,發佈結構地址或對象實例開始贏得相當快,(隨着消息大小的增加,直接通過值發佈數據)。

還有其他的機制。在我的ARM嵌入式項目中,RAM是有限的,內存空間比速度更重要,我傾向於使用一個由255個全局消息實例組成的數組作爲池(對於'無效索引',保留一個值是有用的,255)。 。這意味着每個消息只能被一個字節引用,而每個消息中的兩個字節允許它們被鏈接到列表中和從列表中移出。鏈表頭字節,互斥量和信號量爲線程間通信創建了阻塞隊列 - 不需要額外的存儲空間。所有消息在啓動時都鏈接到一個「池」隊列中,並被彈出,在線程之間排隊並通過應用程序線程釋放回池中。

從硬件接收數據的ISR無法調用malloc,獲取互斥鎖或等待消息索引的信號量。我使用另一個沒有鎖的隊列類,只是一個字節索引的循環隊列。我在啓動時推送了幾條消息。中斷處理程序可以從這個ISRpool出列消息,從硬件中填充它們,設置int(位域!),識別ISR,將消息索引推送到'ISRout'循環隊列,發出信號並通過信號退出OS。等待信號量的線程喚醒並知道ISRout上有數據,將其彈出並排隊等待任何線程處理來自該ISR的消息。 'ISRhandler'線程還負責用信息'補足'ISRpool,以便ISR在數據到達時總是有消息準備好。這個簡單的共享'ISRpool'系統只有在中斷不能重新啓用更高優先級的中斷時才能工作!

以類似的方式,將tx ISR的消息推送到循環隊列中供ISR使用(中斷暫時禁用以查看硬件是否空閒並且硬件FIFO需要「啓動」以啓動tx再次中斷)。 'used'tx消息被轉儲到rx ISRpool上 - 它們也可能被重新用於輸入。

彙集計劃有一些優勢,並不是很明顯。一個是「沒有malloc,沒有空閒」。消息當然可以泄漏,但是我注意到 - 我的'monitor/debugger'運行的UART的終端提示符是'223>'這個數字是池級別。如果這個數字下降並且不再回來,我知道我已經泄露了。當你不能在Valgrind下運行應用時,這是非常重要的:)