Other Parts Discussed in Thread: SYSBIOS
Tool/software: TI-RTOS
hello,
The codes as follows:
#include <xdc/std.h>
#include <ti/sysbios/BIOS.h>
#include <xdc/runtime/Log.h>
#include <xdc/runtime/Error.h>
#include <ti/sysbios/knl/Mailbox.h>
#include <ti/sysbios/knl/Task.h>
#include <xdc/runtime/System.h>
#include <xdc/cfg/global.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(int id_arg);
Mailbox_Handle mbox;
/*
* ======== main ========
*/
Void main()
{
Task_Params taskParams;
Task_Handle myTsk0,myTski;
Mailbox_Params mboxParams;
UInt i;
Error_Block eb;
Error_init(&eb);
/*create 1 reader_task with priority 2*/
Task_Params_init(&taskParams);
// taskParams.stackSize = 4*1024;
taskParams.priority = 2;
myTsk0=Task_create((Task_FuncPtr)reader,&taskParams,&eb);
if(myTsk0==NULL)
System_abort("reader create failed");
Mailbox_Params_init(&mboxParams);
mbox = Mailbox_create(sizeof(MsgObj),2,&mboxParams,&eb);
if(mbox==NULL)
System_abort("Mailbox create failed");
/*Creat 3 tasks with priority 2*/
/*re-uses taskParams */
taskParams.priority=2;
for(i=0;i<3;i++)
{
taskParams.arg0=i;
myTski=Task_create((Task_FuncPtr)writer,&taskParams,&eb);
if(myTski==NULL)
System_abort("writer create failed");
}
/*Start SYS/BIOS*/
System_flush();
BIOS_start();
}
/*
* ======== reader ========
*/
Void reader(Void)
{
MsgObj msg;
while(1)
{
/* wait for mailbox to be posted by writer() */
if (Mailbox_pend(mbox,&msg, BIOS_WAIT_FOREVER) == 0) //BIOS_WAIT_FOREVER
{
System_printf("timeout expired for MBX_pend()\n");
System_flush();
break;
}
/* print value */
System_printf("read '%c' from (%d).\n", msg.val, msg.id);
System_flush();
}
System_printf("reader done.\n");
System_flush();
}
/*
* ======== writer ========
*/
Void writer(int id_arg)
{
MsgObj msg;
Int i;
Int id = id_arg;// 0;//ArgToInt (id_arg);
for (i=0; i < NUMMSGS; i++)
{
/* fill in value */
msg.id = id;
msg.val = i % NUMMSGS + (Int)('a');
/* enqueue message */
Mailbox_post(mbox,&msg, BIOS_WAIT_FOREVER);
System_printf("(%d) writing '%c' ...\n", id, (Int)msg.val);
System_flush();
}
System_printf("writer (%d) done.\n", id);
System_flush();
Task_yield();
}
The debugging outcomes in the console as follows:
[C674X_0] (0) writing 'a' ...
(0) writing 'b' ...
read 'a' from (0).
read 'b' from (0).
(0) writing 'c' ...
writer (0) done.
(1) writing 'a' ...
read 'c' from (0).
read 'a' from (1).
(2) writing 'a' ...
(1) writing 'b' ...
read 'a' from (2).
read 'b' from (1).
(2) writing 'b' ...
(1) writing 'c' ...
writer (1) done.
read 'b' from (2).
read 'c' from (1).
(2) writing 'c' ...
writer (2) done.
read 'c' from (2).
But I think the outcomes should be as follows:
[C674X_0] (0) writing 'a' ...
(0) writing 'b' ...
read 'a' from (0).
read 'b' from (0).
(0) writing 'c' ...
writer (0) done.
(1) writing 'a' ...
read 'c' from (0).
read 'a' from (1).
(1) writing 'b' ...
(1) writing 'c' ...
writer (1) done.
read 'b' from (1).
read 'c' from (1).
(2) writing 'a' ...
(2) writing 'b' ...
read 'a' from (2).
read 'b' from (2).
(2) writing 'c' ...
writer (2) done.
read 'c' from (2).
Can you explain why? Thanks very much!