⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 semtest.c

📁 DSP内核代码
💻 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 + -