eCos Mbox机制
背景
總結(jié)下 ecos mbox這個(gè)通信機(jī)制。
ecos下面的通信機(jī)制真的很少,沒(méi)有信號(hào)、消息隊(duì)列、信號(hào)量、unix域…, 當(dāng)然,我看到里面不少地方用到了 網(wǎng)絡(luò)socket,如DHCP客戶端的開啟和關(guān)閉。
mbox我理解上應(yīng)該就是Linux下消息隊(duì)列吧,但是BRCM下面的 rc 中,用到的非常簡(jiǎn)單,僅僅使用這種機(jī)制來(lái)傳遞一個(gè)整數(shù),哈哈,真是蛋碎。
經(jīng)過(guò)擴(kuò)展后,能傳遞字符串了。下面,走進(jìn)去看下。
mbox的實(shí)現(xiàn)
tapf_sys_init->sys_main->(*sys_msg_init)() 這個(gè)函數(shù)指針?lè)庋b的,目前未發(fā)現(xiàn)有什么備用選擇。
->msg_init->cyg_mbox_create關(guān)鍵就是這個(gè)函數(shù)了,其它封裝后面說(shuō)。
函數(shù)原型這樣,很簡(jiǎn)單,一個(gè)ID, 一個(gè)結(jié)構(gòu)體。
這函數(shù)很坑,
3)handle保存mbox的地址,完全沒(méi)必要在這賦值啊。
估計(jì)是一些設(shè)計(jì)上的兼容性,才導(dǎo)致了這么奇怪的寫法。
第一個(gè)對(duì)象出場(chǎng):Cyg_Mbox
構(gòu)造函數(shù)為空,但它調(diào)用了模板類 Cyg_Mboxt2,
Cyg_Mboxt2<void *, CYGNUM_KERNEL_SYNCH_MBOX_QUEUE_SIZE> m;
這個(gè)模板中成員與C結(jié)構(gòu)中的成員一致,其構(gòu)建函數(shù)對(duì) base , count成員賦 0 (mboxt2.inl) 。
獲取mbox
cyg_mbox_get(rc_mbox_handle) & 0xffff) -> ((Cyg_Mbox *)mbox)->get()為啥&0xffff, 把get出來(lái)的結(jié)果 取 低16位。
-> m.get( p ) 再調(diào)用模板方法。
get與set都是使用模板中方法實(shí)現(xiàn)的。
對(duì)于其中的每個(gè)條目操作,又有點(diǎn)環(huán)形隊(duì)列 了。
這里很簡(jiǎn)單,僅僅是存儲(chǔ)指針數(shù)組,然后返回其中的一個(gè)原素。
put時(shí),找到一個(gè)位置,然后插入進(jìn)去。
當(dāng)然實(shí)現(xiàn)中會(huì)有些PV操作保證原子性、還有阻塞喚醒層面的操作。
再回頭看現(xiàn)有的封裝實(shí)現(xiàn) 。
struct msg_struct {cyg_handle_t mbox_msg_id;cyg_mbox mbox;PIU8 mbox_tag;PI8 msg_info[MAX_MBOX_MSG_NUM][MAX_MBOX_MSG_LEN]; };id / mbox同原來(lái)的調(diào)用函數(shù)。 msg_info用于存儲(chǔ)傳遞的字符串,二維的個(gè)數(shù)等同于系統(tǒng)中 mbox的存儲(chǔ)個(gè)數(shù)。
在操作時(shí),要考慮獲取到的消息與msg_info中的對(duì)應(yīng)關(guān)系。
這種感覺(jué),就像體制外,硬生生的附加上,當(dāng)然它能work well ,但缺少層次。
思考
變長(zhǎng)與定長(zhǎng) ,加入消息頭(類UDP)。
消息僅傳遞malloc的指針,指向存儲(chǔ)的消息,通過(guò)頭部中的字段指定長(zhǎng)度,來(lái)提取消息,完成后釋放。不知為什么,很多人(包括我)都會(huì)覺(jué)得ecos下面使用動(dòng)態(tài)內(nèi)容就不安全,會(huì)產(chǎn)生莫名其妙的問(wèn)題?會(huì)么?缺少獨(dú)立進(jìn)程、互不影響的分離機(jī)制(有了可能就不叫ecos了,會(huì)增加復(fù)雜度),導(dǎo)致其它任何一處的有問(wèn)題,必將壞掉一鍋湯。
但絕對(duì)不能“一朝被蛇咬,十年怕井繩”,這個(gè)機(jī)制是沒(méi)有問(wèn)題的。并且這樣地是發(fā)揮了mbox的作用。(在機(jī)制上進(jìn)行設(shè)計(jì))
如何把存儲(chǔ)空間放到消息對(duì)象的內(nèi)部,減少 申請(qǐng)與釋放內(nèi)容的動(dòng)作。
好吧,就能存儲(chǔ)10條消息、定長(zhǎng),那么就去擴(kuò)展struct 及class吧,注意其它使用mbox的地方。
總結(jié)
以上是生活随笔為你收集整理的eCos Mbox机制的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 16位cpu 移位处理
- 下一篇: 文化氛围对新人培养新人的影响