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介绍(二)相关推荐

  1. ISD系列语音芯片电路介绍及其应用

    ISD系列语音芯片电路介绍及其应用 语音芯片简介:<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:o ...

  2. 甲基化系列 2. 甲基化芯片数据介绍与下载(GEO)

    点击关注,桓峰基因 桓峰基因的教程不但教您怎么使用,还会定期分析一些相关的文章,学会教程只是基础,但是如果把分析结果整合到文章里面才是目的,觉得我们这些教程还不错,并且您按照我们的教程分析出来不错的结 ...

  3. 嵌入式学习:Cortex-M系列芯片介绍

    一.Cortex-M系列芯片分类 以意法半导体芯片为例子:Cortex-M0:主频在48M,一般用于低功耗: Cortex-M3:主频为72M,是现在市面上最为流行的芯片之一,一般用于工业等部分控制功 ...

  4. STM32F4系列芯片RTC模块介绍

    RTC是"实时时钟"的缩写,它是一种芯片,在计算机等电子产品中广泛应用.RTC提供了实时时钟计时功能和存储时间的能力,即时钟模块,常用于控制和记录时间的应用场合. RTC的工作原理 ...

  5. 【ESP32-C3 系列芯片 技术规格书学习笔记 (二、原理图)】

    共33个管脚. 电源管脚7个,数字电源管脚11.17.18.模拟电源管脚2.3.31.32.18管脚可复用. 复位管脚1个,7号. Flash管脚,6个,19-24为外接Flash管脚可不接. 晶振时 ...

  6. 海康威视DS-4100、4000HC 系列板卡SDK编程指南

    本文转自:http://blog.csdn.net/wwl33695/article/details/8990514 目    录 板卡介绍篇............................. ...

  7. 离线语音识别芯片-开发指南及芯片规格介绍

    ​   云知声(Unisound)作为行业内领先的人工智能企业,针对AI语音芯片各个不同的细分市场,共发布5款离线语音识别芯片,芯片及模块出货量已达百万级别.   下面介绍这5款芯片的各自特点:   ...

  8. axi dma 寄存器配置_FPGA Xilinx Zynq 系列(三十二)AXI 接口

    大侠好,欢迎来到FPGA技术江湖,江湖偌大,相见即是缘分.大侠可以关注FPGA技术江湖,在"闯荡江湖"."行侠仗义"栏里获取其他感兴趣的资源,或者一起煮酒言欢. ...

  9. 【花雕体验】09 行空板硬件控制pinpong库的系列测试(之二)

    行空板板身集成了光线传感器.麦克风.蜂鸣器.Wifi.蓝牙.加速度传感器.按键,正面配置有一块LCD彩屏,可实时呈现多种Python运行结果,包括文字.图片.视频,游戏画面,以及数据图表等. [花雕体 ...

  10. STM32 系列 DAC的介绍与使用

    STM32网上资料多,对自己来说基本的使用也是很简单的, 我的STM32专栏并没有什么系统的基础教学,基本上是某个项目用到了,或者产品使用过程出过问题 才会来记录一下,正好用到了 DAC ,一般产品还 ...

最新文章

  1. bat 批量提取指定目录下的文件
  2. 选择之后触_发宜常梳:4种材质的梳子,我们最常用的梳子却对头发最不好,该如何选择?...
  3. 前端学习(2286):react之无状态组件
  4. java哈希映射干什么的_java – 为什么在哈希映射中有空值或空键是有用的?
  5. qgis 图片_QGIS教程09QGIS中如何制作萤火虫地图?
  6. 交换机VLAN工作模式介绍
  7. 微波射频学习笔记2--------传输线理论
  8. 从零学iFIX视频教程 2.01版 完整目录 (总共220节视频)
  9. SQL中的go、begin、end的用法
  10. Learning the Model Update for Siamese Trackers学习笔记
  11. psd文件怎样导出html5,PSD格式的文件怎么转换成CAD格式?
  12. 有一个人有一百块钱, 打算买一百只鸡, 现在大鸡三块钱一只, 小鸡一块钱三只, 不大不小的鸡两块钱一只. Java编程实现,刚好用一百块钱买一百只鸡.
  13. mysql有numeric类型吗_mysql数值类型 - numeric
  14. java飞机大战设计收获_飞机大战编写以及Java的面向对象总结
  15. Pandas工具包实战(16)apply函数操作:numpy, pandas,
  16. java+天地图,天地图开发之Android-天地图显示
  17. 【二】微信开发中的https
  18. 小白学Docker(四) docker配置阿里云国内镜像加速器
  19. 与文字相拥 舞尽人间芳华
  20. uni-app 小程序点击右上角分享设置

热门文章

  1. vertica中sql正则表达式
  2. Java 操作Word书签(二):添加文本、图片、表格到书签内容
  3. SQL Server不允许保存更改的解决方法
  4. 海康威视网络摄像机连接、使用方法
  5. VS2015 C#程序打包成.exe之installshield使用教程
  6. SAP License:ERP项目升级评标会偶遇以前同事感慨
  7. 驾校一点通电脑版客户端 v7.1 最新PC版
  8. 迈道科技生产安全风险调度管控系统
  9. linux w3m命令
  10. java 操作mdb文件_Java操作MDB文件