DSP中的Mailbox的學習

2021-05-08 06:18:07 字數 3647 閱讀 9449

在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 ...