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 0 //消息邮箱
#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;
}