ucos:ucos 应用编程大全

0:ucos for linux port 代码
   
 ucos for linux port代码可以在: 我的资源中下载。

1:说明

主要对ucos中的task创建,消息队列,消息邮箱,信号量,互斥量的使用进行了举例说明。
对不同的模块的测试:可以通过不同的宏定义来实现。
#define UCOS_BASIC_TASK_TEST   0  //基本任务的创建
#define UCOS_MSG_QUEUE_TASK_TEST 0  //消息队列
#define UCOS_MAIL_B0X_TASK_TEST //消息邮箱
#define UCOS_MEM_TASK_TEST          0 //内存管理
#define UCOS_SEM_TASK_TEST          0 //信号量
#define UCOS_MUTEX_TASK_TEST        1 //互斥量

对不同的模块的测试:可以通过不同的宏定义来实现。
#define UCOS_BASIC_TASK_TEST  0//基本任务的创建
#define UCOS_MSG_QUEUE_TASK_TEST0//消息队列
#define UCOS_MAIL_B0X_TASK_TEST0//消息邮箱
#define UCOS_MEM_TASK_TEST         0//内存管理
#define UCOS_SEM_TASK_TEST         0//信号量
#define UCOS_MUTEX_TASK_TEST       1//互斥量

2:示例代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "ucos_ii.h"

typedef unsigned char uint8 ;
typedef unsigned short uint16;
struct msgbuf {
    uint8  option;                 /* Message type */
    uint8  msgID;
    uint16 msgData;
};
struct msgType {
	long mtype;
	struct msgbuf mdata;
};
#define  TASK_STK_SIZE    128
#define  BUFFER_SIZE  	  3


struct storage_data
{
	INT16U input;
	INT16U output;
	INT16U buffer[BUFFER_SIZE];
};
OS_STK        AppStk_send_one[TASK_STK_SIZE];
OS_STK        AppStk_send_two[TASK_STK_SIZE];
OS_STK        AppStk_recv[TASK_STK_SIZE];
OS_STK        qsmBox_AppStk_send[TASK_STK_SIZE];
OS_STK        qsmBox_AppStk_recv[TASK_STK_SIZE];
OS_STK        mem_AppStk_one[TASK_STK_SIZE];
OS_STK        mem_AppStk_two[TASK_STK_SIZE];
OS_STK        sem_AppStk_producer[TASK_STK_SIZE];
OS_STK        sem_AppStk_customer[TASK_STK_SIZE];
OS_STK        mutex_Stack1[TASK_STK_SIZE];
OS_STK        mutex_Stack2[TASK_STK_SIZE];
OS_MEM *mem_p;
OS_EVENT  *pmsgqueue;
OS_EVENT  *pmailbox;
OS_EVENT  *sem_custom;
OS_EVENT  *sem_produce;
OS_EVENT  *ResourceMutex;
void *ptr;
void *msgqueue[10];
struct storage_data *storage;
static int g_counter=0;

unsigned long long monotonic_us(void)
{
	struct timeval tv;
	gettimeofday(&tv, NULL);
	return tv.tv_sec * 1000000ULL + tv.tv_usec;
}
void printf_task_info(uint8 i)
{
	if(OSTCBPrioTbl[i]==NULL)
	{
		printf("the prio=%u task is no exit\n",i);
		return ;
	}
	else

	{
		OS_Printf("the prio=%u task information as follow\n",i);
		OS_Printf("the prio=%u task delay time is %u\n",i,OSTCBPrioTbl[i]->OSTCBDly);
		OS_Printf("the prio=%u task status is 0x%x\n",i,OSTCBPrioTbl[i]->OSTCBStat);
		OS_Printf("the prio=%u task name is %s\n",i,OSTCBPrioTbl[i]->OSTCBTaskName);
		OS_Printf("OSTCBCur->OSTCBStkPtr=%p\n",OSTCBCur->OSTCBStkPtr);
		OS_Printf("current task prio=%u\n",OSPrioCur);
		return ;
	}
}
void MyTask( void *p_arg )
{
	char* sTaskName = (char*)p_arg;
	while(1)
	{
		/* printf uses mutex to get terminal access, therefore must enter critical section */
		OS_Printf("%s\t%s: line: %d Name: %s\n", __FILE__,__func__, __LINE__, sTaskName );
		/* Delay so other tasks may execute. */
		OSTimeDlyHMSM(0, 0,0 , 50);

	}/* while */

}

void App_send_one(void *p_arg)
{
	INT8U  err;
	struct msgType sendMsg;
  struct msgType *recvdMsg;
	memset(&sendMsg,0,sizeof(sendMsg));
	p_arg = p_arg;
	OSTaskNameSet(OSPrioCur,"App_send_one",&err);
   while(1)                            
	{ 
		srand(monotonic_us());
		sendMsg.mtype=0x01;
		sendMsg.mdata.option=0x01;
		sendMsg.mdata.msgID=0x01;
		sendMsg.mdata.msgData=rand();
		recvdMsg =&sendMsg;
		if((err=OSQPost(pmsgqueue,(void *)&sendMsg))==OS_NO_ERR)
		{
			OS_Printf("App_send_one: mtype:%d option:%d msgID:%d msgData:%d\n",recvdMsg->mtype,recvdMsg->mdata.option ,recvdMsg->mdata.msgID, recvdMsg->mdata.msgData);
		}
		else if(err==OS_Q_FULL)
		{
			OS_Printf("this is senderone the msg_q is full\n");
		}
		else
		{
			OS_Printf("other err\n");
		}

        OSTimeDlyHMSM(0, 0, 0, 20);
	//	printf_task_info(OSPrioCur);
    }
}


void App_send_two(void *p_arg)
{
	INT8U err;
	p_arg = p_arg;
	struct msgType sendMsg;
  struct msgType *recvdMsg;
	memset(&sendMsg,0,sizeof(sendMsg));
	OSTaskNameSet(OSPrioCur,"App_send_two",&err);
    while(1)                           
	{ 
		srand(monotonic_us());
		sendMsg.mtype=0x02;
		sendMsg.mdata.option=0x02;
		sendMsg.mdata.msgID=0x02;
		sendMsg.mdata.msgData=rand();
		recvdMsg =&sendMsg;

		if((err=OSQPost(pmsgqueue,&sendMsg))==OS_NO_ERR)
		{
			OS_Printf("App_send_two: mtype:%d option:%d msgID:%d msgData:%d\n",recvdMsg->mtype,recvdMsg->mdata.option ,recvdMsg->mdata.msgID, recvdMsg->mdata.msgData);
		}
		else if(err==OS_Q_FULL)
		{
			OS_Printf("this is sendertwo\nthe msg_q is full\n");
		}
		else
		{
			OS_Printf("other err\n");
		}
    OSTimeDlyHMSM(0, 0, 2, 0);
		sendMsg.mtype=0x03;
		sendMsg.mdata.option=0x03;
		sendMsg.mdata.msgID=0x03;
		sendMsg.mdata.msgData=rand();
		recvdMsg =&sendMsg;
		if((err=OSQPostFront(pmsgqueue,&sendMsg))==OS_NO_ERR)
		{
			OS_Printf("App_send_two: mtype:%d option:%d msgID:%d msgData:%d\n",recvdMsg->mtype,recvdMsg->mdata.option ,recvdMsg->mdata.msgID, recvdMsg->mdata.msgData);
		}
		else if(err==OS_Q_FULL)
		{
			OS_Printf("this is sendertwo the msg_q is full\n");
		}
		else
		{
			OS_Printf("other err\n");
		}
        OSTimeDlyHMSM(0, 0, 0, 10);
		//printf_task_info(OSPrioCur);
    }
}

void App_recv(void *p_arg)
{
	INT8U err;
	INT16U timeout=100;
	struct msgType *recvdMsg;
	p_arg = p_arg;
	OS_Printf("when create:\n");
	pmsgqueue=OSQCreate(msgqueue,10);
	for (;;)
	{
		recvdMsg=OSQPend(pmsgqueue,timeout,&err);
		if(err==OS_NO_ERR)
		{
			OS_Printf("recver data is: mtype:%d option:%d msgID:%d msgData:%d\n",recvdMsg->mtype,recvdMsg->mdata.option ,recvdMsg->mdata.msgID, recvdMsg->mdata.msgData);
		}
		else if(err==OS_TIMEOUT)
		{
			OS_Printf("timeout\n");
			break;
		}
		else if(err==OS_ERR_EVENT_TYPE)
		{	
			OS_Printf("this is recver err is OS_ERR_EVENT_TYP\n");
			break;
		}
		else
		{
			break;
		}
        OSTimeDlyHMSM(0, 0, 0, 1);
	}
	OSQDel(pmsgqueue,OS_DEL_NO_PEND, &err);
	if(err==OS_ERR_TASK_WAITING)
	{
		OS_Printf("some task wait for this Mailbox\n");
	}
}
void qsmBox_App_send(void *p_arg)
{
	INT8U i;
	INT8U err;
	INT8U *buffer[3];
	buffer[0]="test01\n";
	buffer[1]="test02\n";
	buffer[2]="test03\n";
	p_arg = p_arg;
	pmailbox=OSMboxCreate(NULL);
	while(1)
	{
	    for (i=0;i<=2;)
		{
			if((err=OSMboxPost(pmailbox,buffer[i]))==OS_NO_ERR)
			{
				OS_Printf("qsmBox_App_send,data is: %s\n",buffer[i]);
				i++;
			}
			else if(err==OS_MBOX_FULL)
			{
				OS_Printf("this is sender\nthe Mailbox has data,data is: %s\n",pmailbox->OSEventPtr);
			}
			else
			{
				OS_Printf("other err\n");
			}
	       OSTimeDlyHMSM(0, 0, 0, 25);
	    }
	}

	OSTimeDlyHMSM(0, 0, 5, 0);
	OSMboxDel (pmailbox,OS_DEL_NO_PEND, &err);
	if(err==OS_ERR_TASK_WAITING)
	{
		OS_Printf("some task wait for this Mailbox\n");
	}
}



void qsmBox_App_recv(void *p_arg)
{
	INT8U err;
	INT16U timeout=100;
	INT8U *buffer;
	p_arg = p_arg;

    for (;;)
		{
				buffer=OSMboxPend(pmailbox,timeout,&err);
				if(err==OS_NO_ERR)
				{
					OS_Printf("qsmBox_App_recv data is: %s\n",buffer);
				}
				else if(err==OS_TIMEOUT)
				{
					OS_Printf("timeout\n");
				}
				else if(err==OS_ERR_EVENT_TYPE)
				{
					OS_Printf("this is recver\nerr is OS_ERR_EVENT_TYP\n");
					break;
				}
				else
				{
					break;
				}
		        OSTimeDlyHMSM(0, 0, 0, 10);
    }
}
void mem_App_one(void *p_arg)
{
	INT8U err;
	INT8U *string="test memory";
	p_arg = p_arg;
	ptr=malloc(10*1024);
	mem_p=OSMemCreate (ptr, 10, 1024, &err);
	OSMemNameSet (mem_p, string, &err);
	output("after create:",mem_p);

	OSTimeDlyHMSM(0, 0, 2, 0);
	output("\nafter get twice:",mem_p);

	OSTimeDlyHMSM(0, 0, 2, 0);
	output("\nafter release one:",mem_p);
}

void mem_App_two(void *p_arg)
{

	INT8U err;
	void *ptr[10];
	p_arg = p_arg;

	printf("\nfirst get:\n");
	ptr[0]=OSMemGet (mem_p, &err);
	printf("ptr[0]=%p\n",ptr[0]);

	printf("second get:\n");
	ptr[1]=OSMemGet (mem_p, &err);
	printf("ptr[1]=%p\n",ptr[1]);

	OSTimeDlyHMSM(0, 0, 3, 0);
	OSMemPut (mem_p, ptr[1]);
}

void output(char *info,OS_MEM *p)
{
	printf("%s\n",info);
	printf("OSMemAddr=%p\n",p->OSMemAddr);
	printf("OSMemFreeList=%p\n",p->OSMemFreeList);
	printf("OSMemBlkSize=%d\n",p->OSMemBlkSize);
	printf("OSMemName=%s\n",p->OSMemName);
	printf("OSMemNFree=%d\n",p->OSMemNFree);
	printf("OSMemNBlks=%d\n",p->OSMemNBlks);
}
void sem_App_producer(void *p_arg)
{
	INT16U i;
	INT16U timeout;
	INT8U err;
	timeout=30000;
	storage=malloc(sizeof(struct storage_data));
	sem_produce=OSSemCreate(BUFFER_SIZE);
	sem_custom=OSSemCreate(0);
	sem_init();
	for(i=1;;)
	{
		OSSemPend (sem_produce, timeout, &err);
		if(err==OS_NO_ERR)
		{
			storage->buffer[storage->input]=i;
			storage->input++;
			i++;
		    if (storage->input >= BUFFER_SIZE)
		    {
				storage->input = 0;
		    }
		  sem_info();
			OSSemPost(sem_custom);
		}
		else if(err==OS_TIMEOUT)
		{
			continue;
		}
		else
		{
			printf("other error %d\n",err);
			break;
		}
		OSTimeDlyHMSM(0, 0, 0, 10);
	}
}




void sem_App_customer(void *p_arg)
{

	INT16U i;
	INT16U data;
	INT16U timeout;
	INT8U err;
	timeout=30000;
	for(i=1;;)
	{
		OSSemPend (sem_custom, timeout, &err);
		if(err==OS_NO_ERR)
		{
			data=storage->buffer[storage->output];
			storage->buffer[storage->output]=0;
			printf("consume data %d\n",data);
			storage->output++;
			i++;
			  if(storage->output >= BUFFER_SIZE)
			  {
					storage->output = 0;
			  }
		   sem_info();
		  OSSemPost(sem_produce);

		}
		else if(err==OS_TIMEOUT)
		{
				continue;	
		}
		else
		{
			printf("other error abc\n");
			break;
		}
		OSTimeDlyHMSM(0, 0, 3, 10);
	}
}

void sem_init()
{
	int j;
	storage->input=0;
	storage->output=0;

	for(j=0;j<BUFFER_SIZE;j++)
	{
		storage->buffer[j]=0;
	}
}


void sem_info()
{
	int j;
	for(j=0;j<BUFFER_SIZE;j++)
	{
		printf("buffer[%d]=%u\t",j,storage->buffer[j]);

	}
	printf("storage->input=%u\t",storage->input);
	printf("storage->output=%u\n",storage->output);
}

static void mutex_Task1(void *p_arg)
{
 
 	uint8  err;
  p_arg=p_arg;
#if OS_CRITICAL_METHOD == 3
		OS_CPU_SR  cpu_sr;
#endif
  ResourceMutex= OSMutexCreate(9,&err);  
	while(1)
	{
		OSMutexPend(ResourceMutex,0,&err);
    OS_ENTER_CRITICAL();

		g_counter++;

		OS_EXIT_CRITICAL();  
	  OSMutexPost(ResourceMutex);

		OSTimeDly(OS_TICKS_PER_SEC*2);
		OS_Printf("g_counter:%ld\n",g_counter);
	}
}

static void mutex_Task2(void *p_arg)
{   
	uint8  err;
	p_arg=p_arg;
#if OS_CRITICAL_METHOD == 3
		OS_CPU_SR  cpu_sr;
#endif
	while(1)
	{

		OSMutexPend(ResourceMutex,0,&err);
		OS_ENTER_CRITICAL();
		g_counter++;
		OS_EXIT_CRITICAL(); 
	  OSMutexPost(ResourceMutex);
	  
		OSTimeDly(OS_TICKS_PER_SEC);
		OS_Printf("g_counter:%ld\n",g_counter);
	}
}
#define UCOS_BASIC_TASK_TEST  			0
#define UCOS_MSG_QUEUE_TASK_TEST		0
#define UCOS_MAIL_B0X_TASK_TEST			0
#define UCOS_MEM_TASK_TEST          0
#define UCOS_SEM_TASK_TEST          0
#define UCOS_MUTEX_TASK_TEST        1
int main (void)
{
	uint8 Stk1[TASK_STK_SIZE];
	uint8 Stk2[TASK_STK_SIZE];
	char sTask1[] = "Task 1";
	char sTask2[] = "Task 2";
  OSInit();
#if UCOS_BASIC_TASK_TEST
	OSTaskCreate(App_recv,NULL,(OS_STK *)&AppStk_recv[TASK_STK_SIZE-1],(INT8U)4);
	OSTaskCreate( MyTask, sTask2, (OS_STK *)&Stk2[TASK_STK_SIZE-1], 5 );
#endif	
	
#if UCOS_MSG_QUEUE_TASK_TEST0		
	OSTaskCreate(App_send_one,NULL,(OS_STK *)&AppStk_send_one[TASK_STK_SIZE-1],(INT8U)11);
	OSTaskCreate(App_send_two,NULL,(OS_STK *)&AppStk_send_two[TASK_STK_SIZE-1],(INT8U)12);
	OSTaskCreate(MyTask, sTask1, (OS_STK *)&Stk1[TASK_STK_SIZE-1], 13);
#endif	

#if UCOS_MAIL_B0X_TASK_TEST	
	OSTaskCreate(qsmBox_App_send,NULL,(OS_STK *)&qsmBox_AppStk_send[TASK_STK_SIZE-1],(INT8U)14);
	OSTaskCreate(qsmBox_App_recv,NULL,(OS_STK *)&qsmBox_AppStk_recv[TASK_STK_SIZE-1],(INT8U)35);
#endif

#if UCOS_MEM_TASK_TEST
	OSTaskCreate(mem_App_one,NULL,(OS_STK *)&mem_AppStk_one[TASK_STK_SIZE-1],(INT8U)16);
	OSTaskCreate(mem_App_two,NULL,(OS_STK *)&mem_AppStk_two[TASK_STK_SIZE-1],(INT8U)17);
#endif

#if UCOS_SEM_TASK_TEST
	OSTaskCreate(sem_App_producer,NULL,(OS_STK *)&sem_AppStk_producer[TASK_STK_SIZE-1],(INT8U)18);
	OSTaskCreate(sem_App_customer,NULL,(OS_STK *)&sem_AppStk_customer[TASK_STK_SIZE-1],(INT8U)19);
#endif

#if UCOS_MUTEX_TASK_TEST
	OSTaskCreate(mutex_Task1,NULL,(OS_STK *)&mutex_Stack1[TASK_STK_SIZE-1],(INT8U)20);
	OSTaskCreate(mutex_Task2,NULL,(OS_STK *)&mutex_Stack2[TASK_STK_SIZE-1],(INT8U)21);
#endif

  OSStart();
  return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

家有工程师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值