📄 semtest.c
字号:
/*
* ======== semtest.c ========
*/
#include <std.h>
#include <log.h>
#include <mem.h>
#include <que.h>
#include <sem.h>
#include <sys.h>
#include <tsk.h>
#include <trc.h>
#include "semtestcfg.h"
#define NUMMSGS 3 /* 消息的数目*/
#define NUMWRITERS 3 /* 配置工具创建的写任务的数目*/
typedef struct MsgObj {
QUE_Elem elem; /* QUE队列的第一个域 */
Int id; /* 写任务的标识*/
Char val; /*消息的内容 */
} MsgObj, *Msg;
Void reader();
Void writer(Arg id_arg);
QUE_Obj msgQueue;
QUE_Obj freeQueue;
/*
* ======== main ========
*/
Void main()
{
LOG_printf(&trace, "semtest example started.\n");
}
/*
* ======== initTask ========
*/
Void initTask()
{
Int i;
MsgObj *msg; /*定义了一个MsgObj结构体类型的指针*/
Uns mask;
QUE_new(&msgQueue); /*创建一个队列msgQueue*/
QUE_new(&freeQueue); /*创建一个队列freeQueue*/
mask = TRC_LOGTSK | TRC_LOGSWI | TRC_STSSWI | TRC_LOGCLK;
TRC_enable(TRC_GBLHOST | TRC_GBLTARG | mask);
/*
*动态分配内存,如果分配失败,返回MEM_ILLEGAL给msg,并输出相应得出错信息
*/
msg = (MsgObj *)MEM_alloc(0, NUMMSGS * sizeof(MsgObj), 0);
if (msg == MEM_ILLEGAL) {
SYS_abort("Memory allocation failed!\n");
}
/* 将所有的消息加入到队列freequeue中 */
for (i = 0; i < NUMMSGS; msg++, i++) {
QUE_put(&freeQueue, msg);
}
}
/*
* ======== reader ========
*/
Void reader()
{
Msg msg;
Int i;
for (i = 0; i < NUMMSGS * NUMWRITERS; i++) {
/*
*等待写任务writer().返回的旗语信息 .
*/
SEM_pend(&sem, SYS_FOREVER);
/* 从队列msgQueue 中取出一条消息放入msg 中*/
msg = QUE_get(&msgQueue);
/* 输出消息的内容*/
LOG_printf(&trace, "read '%c' from (%d).", msg->val, msg->id);
/* 将 msg 中的消息放入队列freeQueue 中*/
QUE_put(&freeQueue, msg);
}
LOG_printf(&trace, "reader done.");
}
/*
* ======== writer ========
*/
Void writer(Arg id_arg)
{
Msg msg;
Int i;
Int id = ArgToInt (id_arg);
for (i = 0; i < NUMMSGS; i++) {
/*
* 因为是从队列freequeue中取出消息的,所以它不能为空。
*/
if (QUE_empty(&freeQueue)) {
SYS_abort("Empty free queue!\n");
}
msg = QUE_get(&freeQueue);
/* 为消息中的变量赋值*/
msg->id = id; /*用于标记写任务*/
msg->val = (i & 0xf) + 'a'; /*消息的内容*/
LOG_printf(&trace, "(%d) writing '%c' ...", id, msg->val);
/* 将消息加入到队列msgQueue 中*/
QUE_put(&msgQueue, msg);
/*发送旗语,前面有一个等待旗语的函数SEM_pend() ,收到这个旗语时SEM_pend () 函数后面的语句就会相应得到执行*/
SEM_post(&sem);
/*
*下面是一个任务切换的函数,它会将任务切换到具有相同优先级的任务,后面的运行结果中:图8.11给出了不执行任务切换(即该句注释掉)时的情况,图8.12给出了执行任务切换(即将该句注释去掉)时的情况。
*/
/* TSK_yield(); */
}
LOG_printf(&trace, "writer (%d) done.", id);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -