|
这是一个利用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); }
|