📄 sys_que.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 + -