【DSP开发】mailbox的使用
在DSP项目开发中,我用mailbox实现了进程间的通信,通过接收网络控制进程发来的mailbox,实现了云台的控制,其中需要学习的地方有两点:一是mailbox通信机制的学习,二是DSP时间管理机制,这里先学习一下mailbox的相关知识。
bios.MBX.create("mbx_alarm");
bios.MBX.instance("mbx_alarm").messageSize = 500;
bios.MBX.instance("mbx_alarm").length = 12;
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);
}
运行结果:
以后要在做项目的同时认真总结,查漏补缺,争取每天都能进步!
相关文章
- AI全流程开发难题破解之钥
- 送你的代码上太空,与华为云一起开发“最伟大的作品”
- 敏捷开发思想之自我组织
- 【GStreamer开发】GStreamer基础教程05——集成GUI工具
- 【DSP开发】【计算机视觉】EMCV:可在DSP上运行的OpenCV
- 【DSP开发】【并行计算-CUDA开发】TI OpenCL v01.01.xx
- 【Qt开发】QT中用函数把float转化成QString
- 【DSP开发】ccsv6添加simulator功能
- 【DSP开发】shared memory VS mailbox
- 【DSP开发】mailbox的使用
- 【DSP开发】【Linux开发】IIC设备驱动程序
- 【DSP开发】TI第二代KeyStone SoC诠释德仪的“云”态度
- 【Linux开发】【DSP开发】Linux设备驱动之——PCI 总线
- 【VS开发】【DSP开发】浅谈Linux PCI设备驱动(一)
- 【ARM-Linux开发】Linux的SOCKET编程详解
- 【DSP开发】帮您快速入门 TI 的 Codec Engine
- 【DSP开发】DSP能用VS2010生成的链接库文件吗?
- 【DSP开发】如何获得浮点型的数据的IEEE的表示
- 你应该知道的4个DSP开发支持库
- Android开发软件架构思考以及经验总结
- DSP开发中遇到的问题 - 类指针未初始化后果
- 《微信小程序商城开发实战》笔者的新书,欢迎各位粉丝上京东购买
- 服务器开发-对外接口返回数据-封装模板
- Windows下快速搭建安卓开发环境android-studio
- vux+vuex+vue+Es6开发微信公众号的坑
- 3d激光雷达开发(多雷达标定)
- 开发MT4连接失败最easy忽视的一个错误