ÔÚ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Îļþ£¬±ãÔÚ³ÌÐòÆô¶¯µÄ×î³õ½«ËüÃdzõʼ»¯Íê±Ï£¬ÒÔºó³ÌÐòµÄ¹¤×÷¾ÍÊÇÓÃËüÃÇÁË¡£
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ÍøÂç±à³Ì£¬¸Ð¾õ»¹ÊÇ¿ªÔ´À´µÄˬ¿ì£¬´óʦÃDZàµÄ³ÌÐòÕæÊÇÆ¯ÁÁ£©¡£
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£¬°¦£¬ÕæµÄÊÇÒ»¸öÐÅÏ¢¶¼½Ó²»µ½°¡£¬»¹ÊDz»ÒªÉèΪ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²ÎÊý»áÈýø³ÌµÈ´ýµ½³¬Ê±½áÊø£¬»òÊDz»µÈ¡£µÈ²»À´µÄ»°ÄØ£¬·µ»Ø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);
}
ÔËÐнá¹û£º
ÒÔºóÒªÔÚ×öÏîÄ¿µÄͬʱÈÏÕæ×ܽᣬ²é©²¹È±£¬ÕùȡÿÌì¶¼Äܽø²½£¡


