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

📄 testmbox.c

📁 瑞泰创新的GX-ARM9-2410EP教学实验系统的所有基础实验源代码,内容齐全,解析清楚,基本上每个实验结果都有图片显示
💻 C
字号:
#include <string.h>
#include "includes.h"
#include "consol.h"

#define  TASK_STK_SIZE 256                      /* Size of each task's stacks (# of WORDs) */
#define  NO_TASKS 2                   /* Number of identical tasks */


static OS_STK   TaskStk[NO_TASKS][TASK_STK_SIZE];      /* Tasks stacks */
static OS_EVENT *StrMbox; /*用于传送字符串的邮箱的指针*/
static OS_EVENT *LockMbox; /*锁定字符串缓冲区的邮箱的指针(作为二值信号量使用,有消息时未锁定,无消息时锁定)*/

//-----------------------------------------------
//

static char * ReadString(char *str, size_t size)
{//读取一行字符串,不包含末尾的回车符
	char c;
	int i;
	for(i=0; i<size-1; i++, str++)
	{
		c = CONSOL_GetCh();
		if(c == '\r')
			break;
		else
			*str = c;
	}
	*str = '\0';
	return str;
}

static void WriteString(char *str)
{//写字符串
	CONSOL_Printf(str);
}
//-----------------------------------------------

static void Task1 (void *TaskRun)
{
    UBYTE err;
    char str[128];

    for (;*(int*)TaskRun;)
    {
    	OSMboxPend(LockMbox, 0, &err);//等待字符串缓冲区解除锁定
    	WriteString("\n\n[Task1]请输入字符串(以回车结束):");
    	ReadString(str, sizeof(str));
    	if(!strcmp(str, "exit"))
    		*(int*)TaskRun = 0;
    	OSMboxPost(StrMbox, str);
    }
    WriteString("\n[Task1]Exit");
    OSTaskDel(OS_PRIO_SELF);//删除自己
}

static void Task2(void *TaskRun)
{
    UBYTE err;
    char *str;
    for(;*(int*)TaskRun;)
    {
    	str = (char*)OSMboxPend(StrMbox, 0, &err);
    	WriteString("\n[Task2]收到字符串:\"");
    	WriteString(str);
    	WriteString("\"");
    	if(!strcmp(str, "exit"))
    		*(int*)TaskRun = 0;
    	OSMboxPost(LockMbox, (void*)-1);//解除锁定
    }
    WriteString("\n[Task2]Exit");
    OSTaskDel(OS_PRIO_SELF);//删除自己
}

void RunTestMbox()
{
    int Task1Run, Task2Run;
    INT8U err;
    Task1Run = Task2Run = 1;
    WriteString("邮箱的使用  <输入exit结束测试>\n");
    StrMbox = (OS_EVENT*)OSMboxCreate((void *)0);//创建邮箱
    LockMbox = (OS_EVENT*)OSMboxCreate((void *)-1);//创建邮箱(作为二值信号量)
    OSTaskCreate(Task1, (void *)&Task1Run, (void *)&TaskStk[0][TASK_STK_SIZE - 1], 5);
    OSTaskCreate(Task2, (void *)&Task2Run, (void *)&TaskStk[1][TASK_STK_SIZE - 1], 6);
    while(Task1Run || Task2Run)
    {
    	OSTimeDly(500);
    }
    OSTimeDly(500);
    OSMboxDel(LockMbox, OS_DEL_NO_PEND, &err);
    OSMboxDel(StrMbox, OS_DEL_NO_PEND, &err);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -