在dsp專案開發中,我用mailbox實現了程序間的通訊,通過接收網路控制程序發來的mailbox,實現了雲台的控制,其中需要學習的地方有兩點:一是mailbox通訊機制的學習,二是dsp時間管理機制,這裡先學習一下mailbox的相關知識。
mbx模型為mailbox提供了一系列函式支援,比如mbx_pend 和 mbx_post。而mailbox可以用來在同一塊處理器上執行的程序相互通訊。mailbox是同步通訊機制,而且mailbox在傳遞之前就已經確定了大小,這樣可以保證成堆的資訊接踵而來的時候不會超出系統的處理能力。我們網路監控系統的mailbox初始化的時候mailbox每條資訊容量的上限為500位元組,長度為12,也就是可以儲存12條資訊。
mbx_create和mbx_delete顧名思義就是分別用來建立和銷毀mailbox的。當然你也可以靜態的建立mailbox。靜態建立對記憶體的分配方面有好處,而動態建立在於靈活,但是dsp的記憶體分配策略據說不是很好,我也有所體會了。當然,別人德州器械久負盛名的ti晶元族,我是沒資格說三道四了。在我們組的工程中,每個程序都靜態配置了mailbox的建立,這樣的話,在task的原始碼中就不會看到mbx_create函式以及呼叫這個函式的函式了。這個配置檔案寫在.tci檔案中,在最終的.tcf檔案中呼叫,在板子啟動時讀取這份tcf檔案,便在程式啟動的最初將它們初始化完畢,以後程式的工作就是用它們了。
下面是mbx_create和mbx_delete的函式引數的介紹。沒辦法,這不是linux,它們的函式原型恐怕無法得知了。(這兩天看unix網路程式設計,感覺還是開源來的爽快,大師們編的程式真是漂亮)。
mbx_handle mbx_create(msgsize, mbxlength, attrs)
uns msgsize;
uns mbxlength;
mbx_attrs *attrs;
void mbx_delete(mbx)
mbx_handle mbx;
mbx_pend這個函式用來讀取mailbox裡的資訊。如果郵箱是空的,或是說沒有有效的資訊,mbx_pend會阻塞。這種狀況下呢,timeout引數可以讓程序在此等待到超時結束,或是完全不等(設為0,唉,真的是乙個資訊都接不到啊,還是不要設為0,推薦2),呵呵。
bool mbx_pend(mbx, msg, timeout)
mbx_handle mbx;
void *msg;
uns timeout; /* return after this many */
/* system clock ticks */
這裡要注意的是,dsp時間單位不是秒,而是system clock ticks,下一次我會研究比較一下linux和dsp時間機制的不同。
相對的,mbx_post是用來傳送資訊的。如果mailbox是滿的話,(在我的工程中,就是待發出的資訊量大於12)mbx_post會阻塞。在這種情況下,timeout引數會讓程序等待到超時結束,或是不等。等不來的話呢,返回0,就說明什麼也沒發出去咧,返回1呢,就是傳送成功了啦。
下面是mbx_post的原始碼:
bool mbx_post(mbx, msg, timeout)
mbx_handle mbx;
void *msg;
uns timeout; /* return after this many */
/* system clock ticks */
值得一提的是,我和實驗室的乙個mm一起除錯雲台的時候,我在客戶端狂點雲台按鈕,她在伺服器端比較鬱悶的發現大多數mbx_post都會返回0,就是傳送不成功。可以設想,如果超時時間設長一點的話,可能會保證收到訊息的絕對處理,但不能保證收到訊息的實時處理。對於監控系統這樣對實時性要求很高的韌體來說,我認為還是丟棄一部分比較好。但丟棄帶來的問題就是,可能命令執行不連續,對雲台控制質量保證不了,這需要我們進一步對雲台控制的程序進行優化和排程,保證資訊的及時穩定的傳遞。
下面奉上dsp的**,講的就是兩個程序通訊,多個人發郵件,乙個人收郵件,結果也附帶奉上:
/** *****=== mbxtest.c *****===
* use a mbx mailbox to send messages from multiple writer()
* tasks to a single reader() task.
* the mailbox, reader task, and 3 writer tasks are created
* by the configuration tool.
** this example is similar to semtest.c. the major differences
* are:
* - mbx is used in place of que and sem.
* - the 『elem』 field is removed from msgobj.
* - reader() task is *not* higher priority than writer task.
* - reader() looks at return value of mbx_pend() for timeout
*/#include
#include
#include
#include
#define nummsgs 3 /* number of messages */
#define timeout 10
typedef struct msgobj msgobj, *msg;
/* mailbox created with config tool */
extern mbx_obj mbx;
/* "trace" log created with config tool */
extern log_obj trace;
void reader(void);
void writer(int id);
/** *****=== main *****===
*/void main()
/** *****=== reader *****===
*/void reader(void)
/* print value */
log_printf(&trace, "read 』%c』 from (%d).", msg.val, msg.id);
}log_printf(&trace, "reader done.");}/*
* *****=== writer *****===
*/void writer(int id)
log_printf(&trace, "writer (%d) done.", id);
}執行結果:
以後要在做專案的同時認真總結,查漏補缺,爭取每天都能進步!
Erlang的Mailbox或者MQ的效能問題
erlang questions mailing list上的討論low disk logging performane in smp caoyuan s blog a case study of scalability related out of memory crash in erlang c...
DSP中的查詢與中斷
以前用2407程式設計,主程式就在乙個main迴圈中,所有的資源響應 資料處理都要在這個裡面,就相當於只有乙個執行緒來幹所有的事情,大家都想搶時間。外設資源訊號我們不能確定什麼時候能來,採用查詢方式就不是那麼好使,而且查詢方式有一點蒙的感覺。當然,你可以延長查詢的時間,但這樣就影響了dsp處理其他資...
DSP中GEL檔案的作用
gel檔案的功能同emuinit.cmd的功能基本相同,用於初始化dsp。但它的功能比emuinit的功能有所增強,gel在ccs下有乙個選單,可以根據dsp的物件不同,設定不同的初始化程式。以tms320lf2407為例 define scsr1 0x7018 定義scsr1暫存器 define ...