ucos:ucos 应用编程大全

2024-02-12 04:18
文章标签 应用 编程 大全 ucos

本文主要是介绍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  	  3struct 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 == 3OS_CPU_SR  cpu_sr;
#endifResourceMutex= 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 == 3OS_CPU_SR  cpu_sr;
#endifwhile(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_TESTOSTaskCreate(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_TESTOSTaskCreate(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_TESTOSTaskCreate(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_TESTOSTaskCreate(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);
#endifOSStart();return 0;
}


这篇关于ucos:ucos 应用编程大全的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/701653

相关文章

PostgreSQL的扩展dict_int应用案例解析

《PostgreSQL的扩展dict_int应用案例解析》dict_int扩展为PostgreSQL提供了专业的整数文本处理能力,特别适合需要精确处理数字内容的搜索场景,本文给大家介绍PostgreS... 目录PostgreSQL的扩展dict_int一、扩展概述二、核心功能三、安装与启用四、字典配置方法

JavaSE正则表达式用法总结大全

《JavaSE正则表达式用法总结大全》正则表达式就是由一些特定的字符组成,代表的是一个规则,:本文主要介绍JavaSE正则表达式用法的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录常用的正则表达式匹配符正则表China编程达式常用的类Pattern类Matcher类PatternSynta

Python中re模块结合正则表达式的实际应用案例

《Python中re模块结合正则表达式的实际应用案例》Python中的re模块是用于处理正则表达式的强大工具,正则表达式是一种用来匹配字符串的模式,它可以在文本中搜索和匹配特定的字符串模式,这篇文章主... 目录前言re模块常用函数一、查看文本中是否包含 A 或 B 字符串二、替换多个关键词为统一格式三、提

Java MQTT实战应用

《JavaMQTT实战应用》本文详解MQTT协议,涵盖其发布/订阅机制、低功耗高效特性、三种服务质量等级(QoS0/1/2),以及客户端、代理、主题的核心概念,最后提供Linux部署教程、Sprin... 目录一、MQTT协议二、MQTT优点三、三种服务质量等级四、客户端、代理、主题1. 客户端(Clien

Go语言数据库编程GORM 的基本使用详解

《Go语言数据库编程GORM的基本使用详解》GORM是Go语言流行的ORM框架,封装database/sql,支持自动迁移、关联、事务等,提供CRUD、条件查询、钩子函数、日志等功能,简化数据库操作... 目录一、安装与初始化1. 安装 GORM 及数据库驱动2. 建立数据库连接二、定义模型结构体三、自动迁

c++中的set容器介绍及操作大全

《c++中的set容器介绍及操作大全》:本文主要介绍c++中的set容器介绍及操作大全,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录​​一、核心特性​​️ ​​二、基本操作​​​​1. 初始化与赋值​​​​2. 增删查操作​​​​3. 遍历方

CSS中的Static、Relative、Absolute、Fixed、Sticky的应用与详细对比

《CSS中的Static、Relative、Absolute、Fixed、Sticky的应用与详细对比》CSS中的position属性用于控制元素的定位方式,不同的定位方式会影响元素在页面中的布... css 中的 position 属性用于控制元素的定位方式,不同的定位方式会影响元素在页面中的布局和层叠关

SpringBoot3应用中集成和使用Spring Retry的实践记录

《SpringBoot3应用中集成和使用SpringRetry的实践记录》SpringRetry为SpringBoot3提供重试机制,支持注解和编程式两种方式,可配置重试策略与监听器,适用于临时性故... 目录1. 简介2. 环境准备3. 使用方式3.1 注解方式 基础使用自定义重试策略失败恢复机制注意事项

Python使用Tkinter打造一个完整的桌面应用

《Python使用Tkinter打造一个完整的桌面应用》在Python生态中,Tkinter就像一把瑞士军刀,它没有花哨的特效,却能快速搭建出实用的图形界面,作为Python自带的标准库,无需安装即可... 目录一、界面搭建:像搭积木一样组合控件二、菜单系统:给应用装上“控制中枢”三、事件驱动:让界面“活”

如何确定哪些软件是Mac系统自带的? Mac系统内置应用查看技巧

《如何确定哪些软件是Mac系统自带的?Mac系统内置应用查看技巧》如何确定哪些软件是Mac系统自带的?mac系统中有很多自带的应用,想要看看哪些是系统自带,该怎么查看呢?下面我们就来看看Mac系统内... 在MAC电脑上,可以使用以下方法来确定哪些软件是系统自带的:1.应用程序文件夹打开应用程序文件夹