·¢²©ÎÄ
¸öÈË×ÊÁÏ
  • ²©¿Í·ÃÎÊ£º196474
  • ²©ÎÄÊýÁ¿£º83
  • ²©¿Í»ý·Ö£º3020
  • ²©¿ÍµÈ¼¶£ºÖÐУ
  • ×¢²áʱ¼ä£º2006-03-27 17:08:49
¶©ÔÄÎҵIJ©¿Í
  • ¶©ÔÄ
  • ¶©Ôĵ½Ïʹû
  • ¶©Ôĵ½×¥Ïº
  • ¶©Ôĵ½Google
×ÖÌå´óС£º´ó ÖРС²©ÎÄ
DSPÖеÄMailboxµÄѧϰ (2007-08-22 22:47)
·ÖÀࣺ DSP

ÔÚ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);

}

ÔËÐнá¹û£º

ÒÔºóÒªÔÚ×öÏîÄ¿µÄͬʱÈÏÕæ×ܽᣬ²é©²¹È±£¬ÕùȡÿÌì¶¼Äܽø²½£¡

ǰһƪ£ºImage LibrapyʹÓÃ
[·¢ÆÀÂÛ] ÆÀÂÛ ÖØÒªÌáʾ£º¾¯ÌèÐé¼ÙÖн±ÐÅÏ¢!
  • chinaunixÍøÓÑ 2008-10-06 20:25
    ÄãºÃ£¡ ÎÒÔÚÍøÉÏËѵ½ Äã˵ dsp mailboxµÄÓ÷¨ ÕâÆªÎÄÕ£¬ ÎÒÏëÇë½ÌÄãÒ»¸öºÜ¼òµ¥µÄÎÊÌ⣬ ÎÒÕýÔÚѧϰʹÓÃddk £¬ ÀïÃæÓиöÀý³Ì ʹÓõÄÊÇtcf Îļþ ÎÒÈçºÎÔËÐÐÄǸö½Å±¾³ÌÐò°¡£¬ ¶¼´ÓÀ´Ã»ÓùýÄØ ÎÒ²é×ÊÁÏ ºÃÏñҲû²éµ½ÔõôŪ¡£ £¨ÒÔǰÎÒ×Ô¼º¶¼ÊÇÓÃͼÐη½Ê½ÅäÖÃbiosµÄÂï¡££© »¹ÍûÄã°ÙæÖгéµãʱ¼ä Ö¸µãһϠллÁË ÎÒµÄ ÓÊÏ䣺tujunhui622@gmail.com msnÊÇ tujunhui622@163.com thx£¡
Ç×£¬Äú»¹Ã»ÓеǼ,Çë[µÇ¼]»ò[×¢²á]ºóÔÙ½øÐÐÆÀÂÛ