网站公告列表

  没有公告

加入收藏
设为首页
联系站长
您现在的位置: 61IC中国电子在线 >> DSP >> 代码示例 >> TI DSP代码示例 >> C6000 >> 文章正文
  利用DSP/BIOS中的mailbox作为中介来在几个任务之间进行值的传递         ★★★ 【字体:
利用DSP/BIOS中的mailbox作为中介来在几个任务之间进行值的传递
作者:A007    文章来源:本站    点击数:    更新时间:2007-3-15    

 

这是一个利用dsp/bios中的mailbox作为中介来在几个任务之间进行值的传递的例子
(1)通过打开ccs中的dsp/bios-》messagelog&kernel/object view 这两个分析工具来监视mailbox中的值,每个任务的blocked(挂起)以及running(运行)状态。通过在MBX_pend,MBX_post这两个函数上面加上端点,然后每运行一次通过messagelog&kernel/object view 这两个内核工具来查看运行挂起状态然后就可以彻底的知道程序是怎样通过邮箱的发送等待在几个任务之间切换的。
(2)如果把TSK_yield()这个函数加到程序里面去,那么每次写任务0运行一次后tsk_yield()函数会把自己的运行权让出,接着写任务1会接着运行。然后通过messagelog&kernel/object view ,加上几个端点就可以很清楚的看出每个任务是怎么样blocked和running的,运行结果如下:
0 (0) writing 'a' …
1 (1) writing 'a' …
2 read 'a' from (0).
3 read 'a' from (1).
4 (0) writing 'b' …
5 (2) writing 'a' …
6 read 'b' from (0).
7 read 'a' from (2).
8 (0) writing 'c' …
9 (1) writing 'b' …
10 read 'c' from (0).
11 read 'b' from (1).
12 writer (0) done.
13 (1) writing 'c' …
14 (2) writing 'b' …
15 read 'c' from (1).
16 read 'b' from (2).
17 writer (1) done.
18 (2) writing 'c' …
19 read 'c' from (2).
20 writer (2) done.

Config1cfg.h代码

/* Do *not* directly modify this file. It was */
/* generated by the Configuration Tool; any */
/* changes risk being overwritten. */

/* INPUT Config1.cdb */

#define CHIP_DM642 1

/* Include Header Files */
#include <std.h>
#include <hst.h>
#include <swi.h>
#include <tsk.h>
#include <log.h>
#include <mbx.h>
#include <sts.h>

#ifdef __cplusplus
extern "C" {
#endif

extern far HST_Obj RTA_fromHost;
extern far HST_Obj RTA_toHost;
extern far SWI_Obj KNL_swi;
extern far TSK_Obj TSK_idle;
extern far TSK_Obj reader0;
extern far TSK_Obj writer0;
extern far TSK_Obj writer2;
extern far TSK_Obj writer1;
extern far LOG_Obj LOG_system;
extern far LOG_Obj trace;
extern far MBX_Obj mbx;
extern far STS_Obj IDL_busyObj;
extern far void CSL_cfgInit();

#ifdef __cplusplus
}
#endif /* extern "C" */

Config1cfg_c.c代码

/* Do *not* directly modify this file. It was */
/* generated by the Configuration Tool; any */
/* changes risk being overwritten. */

/* INPUT Config1.cdb */

/* Include Header File */
#include "Config1cfg.h"


#ifdef __cplusplus
#pragma CODE_SECTION(".text:CSL_cfgInit")
#else
#pragma CODE_SECTION(CSL_cfgInit,".text:CSL_cfgInit")
#endif


#ifdef __cplusplus
#pragma FUNC_EXT_CALLED()
#else
#pragma FUNC_EXT_CALLED(CSL_cfgInit)
#endif

/* Config Structures */
/* Handles */

/*
* ======== CSL_cfgInit() ========
*/
void CSL_cfgInit()
{
}

mbxtest.c代码

/*
* Copyright 2001 by Texas Instruments Incorporated.
* All rights reserved. Property of Texas Instruments Incorporated.
* Restricted rights to use, duplicate or disclose this code are
* granted through contract.
*
*/
/* "@(#) DSP/BIOS 4.60.22 12-07-01 (barracuda-j15)" */
/*
* ======== mbxtest.c ========
* Use a MBX mailbox to send messages from multiple writer()
* tasks to a single reader() task.
* The mailbox, reader task, and three 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 from MBX_pend() for timeout
*/

#include <std.h>

#include <log.h>
#include <mbx.h>
#include <tsk.h>

#include "Config1cfg.h"


#define NUMMSGS 3 /* number of messages */

#define TIMEOUT 10

typedef struct MsgObj {
Int id; /* writer task id */
Char val; /* message value */
} MsgObj, *Msg;


Void reader(Void);
Void writer(Arg id_arg);

/*
* ======== 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(Arg id_arg)
{
MsgObj msg;
Int I;
Int id = ArgToInt (id_arg);

for (I=0; I < NUMMSGS; I++) {
/* fill in value */
msg.id = id;
msg.val = I % NUMMSGS + (Int)('a');

/* enqueue message */
MBX_post(&mbx, &msg, TIMEOUT);

LOG_printf(&trace, "(%d) writing '%c' …", id, (Int)msg.val);

/* what happens if you call TSK_yield() here? */
TSK_yield();
}
LOG_printf(&trace, "writer (%d) done.", id);
}

               欢迎点击进入:TI德州中文网   (国内唯一针对TI应用的中文技术网站)    文章录入:admin    责任编辑:admin 
  • 上一篇文章:

  • 下一篇文章:
  • 发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
    最新热点 最新推荐 相关文章
    基于DSP的电子节气门PID控制
    基于DSP的多路音/视频采集处…
    低功耗实时可编程DSP数字助听…
    基于DSP+CPLD的断路器智能控…
    基于DSP+CPLD的交流电机调速…
    基于DSP的分布式微机保护测控…
    基于DSP的语音实时变速系统设…
    以ARM和DSP嵌入式系统为核心…
    基于双DSP的运动目标智能跟踪…
    高性能定点DSP位处理单元(BM…
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)
    站长:61IC 湘ICP备05002478号