【DSP开发】mailbox的使用
在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文件,便在程序启动的最初将它们初始化完毕,以后程序的工作就是用它们了。
bios.MBX.create("mbx_alarm");
bios.MBX.instance("mbx_alarm").messageSize = 500;
bios.MBX.instance("mbx_alarm").length = 12;
下面是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 {
Int id; /* writer task id */
Char val; /* message value */
} 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()
{
/* Does nothing */
}
/*
* ======== reader ========
*/
Void reader(Void)
{
MsgObj msg;
Int i;
for (i=0; ;i++) {
/* wait for mailbox to be posted by writer() */
if (MBX_pend(&mbx, &msg, TIMEOUT) == 0) {
LOG_printf(&trace, "timeout expired for MBX_pend()");
break;
}
/* print value */
LOG_printf(&trace, "read ’%c’ from (%d).", msg.val, msg.id);
}
LOG_printf(&trace, "reader done.");
}
/*
* ======== writer ========
*/
Void writer(Int id)
{
MsgObj msg;
Int i;
for (i=0; i < NUMMSGS; i++) {
/* fill in value */
msg.id = id;
msg.val = i % NUMMSGS + (Int)(‘a’);
LOG_printf(&trace, "(%d) writing ‘%c’ ...", id,
(Int)msg.val);
/* enqueue message */
MBX_post(&mbx, &msg, TIMEOUT);
/* what happens if you call TSK_yield() here? */
/* TSK_yield(); */
}
LOG_printf(&trace, "writer (%d) done.", id);
}
运行结果:
以后要在做项目的同时认真总结,查漏补缺,争取每天都能进步!
【DSP开发】mailbox的使用的更多相关文章
- DSP开发资源总结,经典书籍,论坛
OMAP4开发资源总结: 一.TI OMAP4官网介绍: http://www.ti.com.cn/general/cn/docs/wtbu/wtbuproductcontent.tsp?templa ...
- Davinci DM6446开发攻略——DSP开发工程建立
前段时间一直忙一个项目,同时在生活上时时提防和抵抗中国地沟油.国外核心转基因调和油.大豆油.色拉油.大米玉米.可怕的喂药鱼.药水泡农药喷无虫咬的青菜,所以没时间打理自己的博客,让开发攻略停顿了一段时间 ...
- 你应该知道的4个DSP开发支持库
引言 在dsp开发中,为了节省开发时间和难度,TI将一些成熟的算法封装为模块,供开发者使用.如果能充分利用这些算法支持库,对于加快dsp开发进程与提高代码质量.稳定性有非常大的帮助. Digital ...
- 【DSP开发】利用CCS5.4开发基于DSP6455的JPEG2000图像解压缩过程
[DSP开发]利用CCS5.4开发基于DSP6455的JPEG2000图像解压缩过程 声明:引用请注明出处http://blog.csdn.net/lg1259156776/ 说明:前端是时间基于VS ...
- 【DSP开发】DSP能用VS2010生成的链接库文件吗?
[DSP开发]DSP能用VS2010生成的链接库文件吗? 声明:引用请注明出处http://blog.csdn.net/lg1259156776/ 说明:可能这个问题让行家看上去就会莞尔一笑,但是很多 ...
- 【DSP开发】如何获得浮点型的数据的IEEE的表示
[DSP开发]如何获得浮点型的数据的IEEE的表示 声明:引用请注明出处http://blog.csdn.net/lg1259156776/ 浮点数的存储规范,由IEEE指定的,具体的规范文件是:IE ...
- 【DSP开发】CCS数据格式 load
CCS支持的.dat文件详解(转载于hellodsp) CCS支持的.dat文件的格式为: 定数 数据格式 起始地址 页类型 数据块大小 1651 其后是文件内容,每行表示一个数据. 定数固定为&qu ...
- 【DSP开发】gel文件编写
以下转载自:http://blog.csdn.net/henhen2002/article/details/4573447 GEL--通用扩展语言,无类型语言,只有int类型,当CCS运行时首先执行这 ...
- 【Linux开发】【DSP开发】利用CCS6.1生成out文件的同时生成bin文件
[Linux开发][DSP开发]利用CCS6.1生成out文件的同时生成bin文件 标签:[DSP开发] [Linux开发] 尝试在windows上安装的CCS6.1开发AM4378-Linux下的应 ...
- 【DSP开发】【Linux开发】基于ARM+DSP进行应用开发
针对当前应用的复杂性,SOC芯片更好能能满足应用和媒体的需求,集成众多接口,用ARM做为应用处理器进行多样化的应用开发和用户界面和接口,利用DSP进行算法加速,特别是媒体的编解码算法加速,既能够保持算 ...
随机推荐
- 访问node后端接口示例(入门)
一.基础安装参考我的另一篇随笔 https://www.cnblogs.com/zhuxingqing/p/11526558.html 另在之前的基础上引入了jquery,方便使用ajax 二.前端代 ...
- Linux安装—IP设置
IP设置 务必不要把Linux的IP设置为和我们的真实机位于同一网段(这可能会跟其他机器造成冲突) 具体操作是:在安装虚拟机时Network Type设置选择:Use Host-Only networ ...
- Android NDK加载SD卡中的so
最近公司框架刚移植完成,由于框架程序要调用子程序,每个子程序都是一个so文件,有好几百个,把所有的so和apk打包不现实,及时可以升级维护也很麻烦.所以需要放SD卡中.考虑两种方式 1 放到设备中的 ...
- Xargs用法详解(自创)
简介之所以能用到这个命令,关键是由于很多命令不支持|管道来传递参数,而日常工作中有有这个必要,所以就有了xargs命令,例如: 这个命令是错误的find /sbin -perm +700 |ls -l ...
- 苹果用户转入mate30,被恶心到了
几年没更新博客了,今天入了新坑,一堆东西想吐槽,发一篇喷一波. 几千块的机器,牛皮癣广告居然这么鬼多,预装一打,推荐一打,不比千元机少,这TM是旗舰机啊.华为官方产的 app打着服务旗号,不给权限强退 ...
- Nginx-rtmp之 AMF0 的处理
1. 综述 当检测到接收到的 RTMP 消息中 Message Header 中 message type id 为 20 时,表示,接收到的是 AMF 类型的数据, 因此需要对接收的数据进行 AMF ...
- [go]go并发
同步协程 通过睡眠方法 // 通过睡眠方式等待 time.Sleep(time.Second) <-time.NewTimer(time.Second).C <-time.After(ti ...
- LC 163. Missing Ranges 【lock, hard】
Given a sorted integer array nums, where the range of elements are in the inclusive range [lower, up ...
- 技术选型之Docker容器引擎
https://mp.weixin.qq.com/s?__biz=Mzg3NjAyOTUzMQ==&mid=2247484524&idx=1&sn=ac041bf3e36dda ...
- 用Python在Android手机上架FTP服务器
当我们没有带数据线却将手机上的文件共享到电脑上时,架个简单的FTP服务器 可以帮我们快速解决问题.以共享手机里的照片为例: 首先将电脑.手机接入同一个wifi. 然后,手机上用QPython执行以下脚 ...