Bcm96xx 系列芯片 SDK介绍(二)
生活随笔
收集整理的這篇文章主要介紹了
Bcm96xx 系列芯片 SDK介绍(二)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
3 啟動過程分析
這里所要分析的是linux系統起來之后的過程,因為在這之前相比于其他linux系統,它并沒有什么不同之處。1 busybox 的init中會執行 etc/inittab
2 inittab 中調用 "bcm_boot_launcher start"
3 bcm_boot_lanucher 是userspace中的一個應用程序,其作用是調用 /etc/rc3.d/ 中的全部腳本
4 rc3.d中的腳本創建 loopback 接口,掛載文件系統,創建/var 目錄,加載驅動模塊,最后啟動了 smd 應用程序
5 smd 是此 SDK 的核心應用程序,它通過 /etc/cms_entity_info.d/ 下的 EID 配置文件將其他應用程序依次啟動。以上過程對應的代碼和腳本如下:
1:
userspace/gpl/apps/busybox/init/init.c 部分代碼截取parser_t *parser = config_open2("/etc/inittab", fopen_for_read); //分析 inittab 文件run_actions(SYSINIT); // 執行 SYSINIT 的命令2:
/etc/inittab 中有一句:
::sysinit:/bin/sh -l -c "bcm_boot_launcher start" // 執行 bcm_boot_launcher 應用程序,傳入 start的參數3:
userspace/public/apps/bcm_boot_launcher/bcm_boot_launcher.c 部分代碼截取char *dir = "/etc/rc3.d"; // 定義腳本所在目錄snprintf(cmdline, sizeof(cmdline)-1, "%s/%s start", dir, curr->filename); // 構造執行腳本的命令if (0 != (rc = system(cmdline))) // 調用system系統函數執行腳本4:
rc3.d中的腳本:
S45bcm-base-drivers //加載各個驅動模塊 insmod *.ko
S35system-config //創建 loopback 接口 lo 127.0.0.1
S25mount-fs //掛載文件系統,創建 var/ 下各個子目錄
S63save-dmesg //保存linux內核啟動日志
S65smd //啟動 smd 應用程序5:
userspace/private/apps/smd/main.c
userspace/public/include/cms_params.h
部分代碼截取:#define CMS_EID_DIR "/etc/cms_entity_info.d" //定義 Eid 配置文件所在路徑rval = parse_eid_file(fullpathname); //解析 Eid 配置文件launchApp(dInfo); //根據 Eid 配置文件,啟動應用程序EID配置文件截取:
BEGINeid = EID_EPON_APP //其EID為 EID_EPON_APP ,非常重要name = eponapp //應用程序名稱flags = EIF_MDM|EIF_LAUNCH_ON_BOOT|EIF_MESSAGING_CAPABLE //smd是否啟動此應用程序的標志
END4 系統架構剖析
此 SDK 的應用層,是一些彼此獨立的應用程序,應用程序之間本身沒有依賴和關聯關系。
但整個系統的運作卻需要這些應用程序的交互來完成,這又是如何做到的呢,答案在于此 SDK 中維護的一套 CMS 機制。
而最核心的就是 smd 這個應用程序。前面已經說過了,其他應用程序的啟動都是 smd 做的,除此之外 smd 還維護各個應用程序之間的通信。
大致原理如下:
A應用程序要和B應用程序通信,則A應用程序首先發送消息給 smd,smd收到A的消息后解析消息頭,發現是發往B應用程序的,則smd將消息發給應用程序B。
當然這個過程對于應用程序A和B是不透明的,它們毫不知情,完全感覺不到 smd 的存在,就好像他倆之間在直接通信。這須要每個應用程序都調用cmsMsg_init的接口才行,例如
cmsReturn = cmsMsg_init(EID_OMCIPMD, &msgHandle); //這是 OMCI 應用程序調用的此函數創建一個 AF_LOCAL 的socket,并與 smd 建立連接,smd會保存它的 EID 和 socket連接文件描述符,以便做消息轉發。
EID就是表示這個應用程序的標識,需要與 /etc/cms_entity_info.d/ 中的 EID配置文件保持一致。例:
omci 應用程序調用cmsMsg_send 接口發送給 httpd應用程序
msgInfo.src = EID_OMCIPMD; // 表示消息來源是 omci 進程
msgInfo.dst = EID_HTTPD; // 表示消息發往 httpd 進程
cmsMsg_send(msgHandle, &msgInfo)由于 omci 調用 cmsMsg_init 接口初始化的 socket 是與 smd 應用程序建立的連接,那么顯然這里 cmsMsg_send 發送出去的消息會被 smd 收到。
smd 收到消息后會層次調用接口:
routeMessage
sendMessageByState
oalMsg_send
將消息轉發給 httpd 進程httpd 調用 oalMsg_receive 接口收到消息
到此:omci 與 httpd 進程完成通信最后整個 CMS 機制可以歸納為:
EID 的配置文件 + smd 的應用程序 + cmsMsg相關的自定義數據結構和接口5 應用層開發示例
目的:創建一個能夠被 smd 啟動的應用程序my_app,并且能夠與其他的應用程序之間互相通信
需要這樣幾個步驟:
1 定義 EID,并配置 EID配置文件
在 enum CmsEntityId(userspace/public/include/cms_eid.h) 中添加一個表示 my_app 的枚舉常量
EID_MY_APP=300,在 userspace/public/libs/cms_util/scripts/eid_bcm_base.txt 中添加 my_app 的eid配置
BEGINeid = EID_MY_APPname = my_appflags = EIF_MDM|EIF_LAUNCH_ON_BOOT|EIF_MESSAGING_CAPABLE
END2 編輯源代碼
在 userspace/private/apps/ 目錄下創建 my_app 子目錄
在 userspace/private/apps/my_app 子目錄下創建兩個文件,main.c 和 Makefilemain.c 中必須要有標示 C應用程序 main() 入口函數的實現,cmsMsg_init 接口的調用,以及消息接收和處理。
在本例中,專門起了2個pthread 線程,一個負責消息的接受,一個負責消息的發送。Makefile 編輯如下:
大概模樣可以參考其 userspace/private/app 下的其他用程序的 Makefile
但這樣幾個地方需要修改:
EXE = my_app
OBJS = main.o
LIBS = -lpthread最后上層Makefile中還要添加對于此Makefile的調用
在 userspace/private/apps/Makefile 中添加make_all_subdirs: my_app
my_app:$(MAKE) -C $@
總結
以上是生活随笔為你收集整理的Bcm96xx 系列芯片 SDK介绍(二)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Django模型关系
- 下一篇: Device eth0 does not