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

📄 sys_que.c

📁 abstract rtos
💻 C
字号:
#include "syscfg.h"#ifdef __cplusplus#if __cplusplusextern "C"{#endif #endif #include "sys/sys_pub.h"#include "aos.h"U32 sys_mq_create( S8 name[AOS_NAME_LEN+1], U32 flags, U32 maxmsg, U32 msgsize, SYS_MQD_T*mqp ){    SYS_MQD_T mqdes;        if( (flags != AOS_FIFO) && (flags != AOS_PRIORITY) )    {        return SYS_CALL_FAIL;    }    if( NULL == mqp )    {        return SYS_CALL_FAIL;    }    if( msgsize & 3 )    {        msgsize = 4-msgsize;    }        mqdes = aos_dmem_alloc( MPE_SYS, SID_SMQ, sizeof(struct mq_des)-4+maxmsg*(msgsize+sizeof(U32)) );    if( (SYS_MQD_T)NULL == mqdes )    {        *mqp = (SYS_MQD_T)-1;        return SYS_OBJ_CREATE_FAIL;    }    if( AOS_SUCC != sys_sem_create( name, flags, 0, &mqdes->sm_read ) )    {        aos_dmem_free( mqdes );        *mqp = (SYS_MQD_T)-1;                return SYS_OBJ_CREATE_FAIL;    }    if( AOS_SUCC != sys_sem_create( name, flags, maxmsg, &mqdes->sm_write ) )    {        aos_dmem_free( mqdes );        sys_sem_cancel( &mqdes->sm_read );        *mqp = (SYS_MQD_T)-1;                return SYS_OBJ_CREATE_FAIL;    }    	    mqdes->magic_num = RED_MAGIC1;    mqdes->mq_flags = flags;    mqdes->mq_maxmsg = maxmsg;    mqdes->mq_msgsize = msgsize;    mqdes->mq_curmsgs = 0;        mqdes->read_idx = 0;    mqdes->write_idx = 0;        aos_strncpy( mqdes->name, name, AOS_NAME_LEN );        *mqp = mqdes;        return AOS_SUCC;}U32 sys_mq_cancel( SYS_MQD_T mqdes ){        if( (NULL == mqdes) ||    	(RED_MAGIC1 != mqdes->magic_num) )    {        return SYS_OBJ_INVALID;    }    mqdes->magic_num = RED_MAGIC2;    if( AOS_SUCC != sys_sem_cancel(&mqdes->sm_write) )    {        return SYS_CALL_FAIL;    }	    if( AOS_SUCC != sys_sem_cancel(&mqdes->sm_read) )    {        return SYS_CALL_FAIL;    }    if( AOS_SUCC != aos_dmem_free((VOID *)mqdes) )    {        return SYS_CALL_FAIL;    }    return AOS_SUCC;}U32 sys_mq_send( SYS_MQD_T mqdes, U8 *ptr, U32 length, U32 timeout ){    U32 result, lockKey, offset;        if( (NULL == mqdes) ||    	(RED_MAGIC1 != mqdes->magic_num) )    {        return SYS_OBJ_INVALID;    }    if( mqdes->mq_msgsize <length )    {        return SYS_CALL_FAIL;    }    result = sys_sem_wait( &mqdes->sm_write, timeout );    if( AOS_SUCC != result )    {        return result;    }    lockKey = aos_int_lock();    offset = (mqdes->mq_msgsize+4)*mqdes->write_idx;    *(U32*)&mqdes->msg[offset] = length;    offset+=4;    aos_memcpy( &mqdes->msg[offset], ptr, length );    mqdes->write_idx++;    mqdes->write_idx %= mqdes->mq_maxmsg;    mqdes->mq_curmsgs++;    aos_int_unlock(lockKey);    result = sys_sem_post( &mqdes->sm_read );        return result;}U32 sys_mq_receive( SYS_MQD_T mqdes , U8 *ptr, U32 length, U32 timeout ){    U32 result, lockKey, offset, msg_len;        if( (NULL == mqdes) ||    	(RED_MAGIC1 != mqdes->magic_num) )    {        return U32_BUTT;    }    if( mqdes->mq_msgsize > length  )    {        return U32_BUTT;    }    result = sys_sem_wait( &mqdes->sm_read, timeout );    if( AOS_SUCC != result )    {        return U32_BUTT;    }    lockKey = aos_int_lock();    offset = (mqdes->mq_msgsize+4)*mqdes->read_idx;    msg_len = *(U32*)&mqdes->msg[offset];    offset+=4;    aos_memcpy( ptr, &mqdes->msg[offset], msg_len );    mqdes->read_idx++;    mqdes->read_idx %= mqdes->mq_maxmsg;    mqdes->mq_curmsgs--;    aos_int_unlock(lockKey);    result = sys_sem_post( &mqdes->sm_write );     if( AOS_SUCC != result )    {        return U32_BUTT;    }        return msg_len;    }U32 sys_mq_trysend( SYS_MQD_T mqdes, U8 *ptr, U32 length ){    U32 result, lockKey, offset;        if( (NULL == mqdes) ||    	(RED_MAGIC1 != mqdes->magic_num) )    {        return SYS_OBJ_INVALID;    }    if( mqdes->mq_msgsize <length )    {        return SYS_CALL_FAIL;    }    result = sys_sem_trywait( &mqdes->sm_write );    if( AOS_SUCC != result )    {        return result;    }    lockKey = aos_int_lock();    offset = (mqdes->mq_msgsize+4)*mqdes->write_idx;    *(U32*)&mqdes->msg[offset] = length;    offset+=4;    aos_memcpy( &mqdes->msg[offset], ptr, length );    mqdes->write_idx++;    mqdes->write_idx %= mqdes->mq_maxmsg;    mqdes->mq_curmsgs++;    aos_int_unlock(lockKey);    result = sys_sem_post( &mqdes->sm_read );        return result;}U32 sys_mq_tryreceive( SYS_MQD_T mqdes , U8 *ptr, U32 length ){    U32 result, lockKey, offset, msg_len;        if( (NULL == mqdes) ||    	(RED_MAGIC1 != mqdes->magic_num) )    {        return U32_BUTT;    }    if( mqdes->mq_msgsize > length  )    {        return U32_BUTT;    }    result = sys_sem_trywait( &mqdes->sm_read );    if( AOS_SUCC != result )    {        return U32_BUTT;    }    lockKey = aos_int_lock();    offset = (mqdes->mq_msgsize+4)*mqdes->read_idx;    msg_len = *(U32*)&mqdes->msg[offset];    offset+=4;    aos_memcpy( ptr, &mqdes->msg[offset], msg_len );    mqdes->read_idx++;    mqdes->read_idx %= mqdes->mq_maxmsg;    mqdes->mq_curmsgs--;    aos_int_unlock(lockKey);    result = sys_sem_post( &mqdes->sm_write );     if( AOS_SUCC != result )    {        return U32_BUTT;    }        return msg_len;    }U32 sys_mq_curmsgs( SYS_MQD_T mqdes ){	    if( (NULL == mqdes) ||    	(RED_MAGIC1 != mqdes->magic_num) )    {        return U32_BUTT;    }    return (U32)(mqdes->mq_curmsgs);}U32 sys_mq_info( SYS_MQD_T mqdes, U32 *pFlags, U32 *pulMaxMsg, U32 *pulMsgSize){	U32 lockKey;    lockKey = aos_int_lock();        if( (NULL == mqdes) ||    	(RED_MAGIC1 != mqdes->magic_num) )    {        aos_int_unlock(lockKey);        return AOS_FAIL;    }    if((pFlags == (U32 *)NULL) ||       (pulMaxMsg == (U32 *)NULL) ||       (pulMsgSize == (U32 *)NULL))    {        aos_int_unlock(lockKey);        return AOS_FAIL;    }    *pFlags     = mqdes->mq_flags;    *pulMaxMsg  = mqdes->mq_maxmsg;    *pulMsgSize = mqdes->mq_msgsize;        aos_int_unlock(lockKey);        return AOS_SUCC;}#ifdef __cplusplus#if __cplusplus}#endif #endif 

⌨️ 快捷键说明

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