361 lines
7.9 KiB
C
361 lines
7.9 KiB
C
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
|
|
#include <sys/mman.h>
|
|
|
|
#include "osp.h"
|
|
#include "ospMsg.h"
|
|
|
|
#define TIME_MSG_NUM 512 //origin: 8192
|
|
#define TIME_MSG_MSK 511 //origin: 8191
|
|
|
|
|
|
#define TIMER_MSG_SIZE sizeof(Osp_Timer_Msg_Block)
|
|
|
|
/*timer msg has msg_head only*/
|
|
Osp_Timer_Msg_Block *TimerMsg[TIME_MSG_NUM] = {0};
|
|
|
|
char *gOspMsgQue = 0;
|
|
|
|
OSP_STATUS osp_msg_que_init(void)
|
|
{
|
|
// int ret;
|
|
int32_t tasknum = osp_get_task_num();
|
|
int32_t i;
|
|
// int TaskId;
|
|
|
|
gOspTask = (OSP_TASKCB *)osp_get_init_mem(OSP_ROUND_UP(sizeof(OSP_TASKCB), 32) * tasknum);
|
|
gOspMsgQue = osp_get_init_mem((OSP_ROUND_UP(OSP_MSG_QUE_SIZE, 32)) * tasknum);
|
|
TimerMsg[0] = (Osp_Timer_Msg_Block *)osp_get_init_mem(TIME_MSG_NUM * OSP_ROUND_UP(sizeof(TIMER_MSG_SIZE), 32));
|
|
|
|
|
|
|
|
for (i = 0; i < TIME_MSG_NUM; i++)
|
|
{
|
|
TimerMsg[i] = (Osp_Timer_Msg_Block *)((uint64_t)TimerMsg[0] + i * OSP_ROUND_UP(sizeof(TIMER_MSG_SIZE), 32));
|
|
}
|
|
|
|
|
|
if (0 == g_ProcessId)
|
|
{
|
|
memset(gOspTask, 0, (OSP_ROUND_UP(sizeof(OSP_TASKCB), 32) * tasknum));
|
|
for (i = 0; i < tasknum; i++)
|
|
{
|
|
gOspTask[i].MsgQOffset = OSP_ROUND_UP(OSP_MSG_QUE_SIZE, 32) * i;
|
|
}
|
|
}
|
|
return OSP_OK;
|
|
}
|
|
|
|
int32_t osp_create_msgq(Osp_MsgQ_Tcb *que, char *name)
|
|
{
|
|
return osp_create_softque(&OSP_MSGQ_QUE(que), OSP_MEGQ_DEP, name);
|
|
}
|
|
|
|
int32_t osp_msg_enque(uint64_t value, Osp_MsgQ_Tcb *que)
|
|
{
|
|
return osp_soft_que_enque(value, &OSP_MSGQ_QUE(que), QUE_NEED_WAKE);
|
|
|
|
}
|
|
|
|
int32_t osp_msg_deque(uint64_t *pvalue, Osp_MsgQ_Tcb *que)
|
|
{
|
|
return osp_softque_deque(pvalue, &OSP_MSGQ_QUE(que), QUE_ISBLOCK);
|
|
|
|
}
|
|
|
|
int32_t osp_msg_dequetry(uint64_t *pvalue, Osp_MsgQ_Tcb *que)
|
|
{
|
|
return osp_softque_dequetry(pvalue, &OSP_MSGQ_QUE(que));
|
|
}
|
|
|
|
|
|
int32_t osp_msg_deque_timeout(uint64_t *pvalue, Osp_MsgQ_Tcb *que, uint32_t timeout)
|
|
{
|
|
return osp_softque_dequeTimeOut(pvalue, &OSP_MSGQ_QUE(que), timeout);
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
Osp_Msg_Head *osp_alloc_msg(uint32_t Len)
|
|
{
|
|
Osp_Msg_Head *pMsg;
|
|
osp_assert(Len > 0);
|
|
pMsg = osp_get_buffer(Len + MSG_HEAD_SIZE, BUF_FOR_MSG, BUFFER_NORMAL_LEVEL);
|
|
if (pMsg)
|
|
{
|
|
TASK_MSG_ALLOCCNT(CURRENT_TASKID)++;
|
|
}
|
|
return pMsg;
|
|
}
|
|
|
|
Osp_Msg_Head *osp_alloc_msgId(uint32_t Len, int32_t id)
|
|
{
|
|
Osp_Msg_Head *pMsg;
|
|
osp_assert(Len > 0);
|
|
pMsg = osp_get_buffer(Len + MSG_HEAD_SIZE, BUF_FOR_MSG, BUFFER_NORMAL_LEVEL);
|
|
if (pMsg)
|
|
{
|
|
osp_atomic_inc((int32_t *) & TASK_MSG_ALLOCCNT(id));
|
|
}
|
|
return pMsg;
|
|
}
|
|
|
|
|
|
Osp_Msg_Head *osp_alloc_msgTimer(void)
|
|
{
|
|
static int32_t cnt = 0;
|
|
Osp_Msg_Head *pMsg = (Osp_Msg_Head *)TimerMsg[(cnt++) & TIME_MSG_MSK];
|
|
return pMsg;
|
|
|
|
|
|
}
|
|
Osp_Msg_Head*osp_alloc_msg_print_log(void)
|
|
{
|
|
|
|
Osp_Msg_Head *pMsg = osp_get_buffer(0 + MSG_HEAD_SIZE, BUF_FOR_MSG, BUFFER_PRINTLOG_LEVEL);
|
|
if (pMsg)
|
|
{
|
|
osp_atomic_inc((int32_t *)&TASK_LOGMSG_ALLOCCNT(CURRENT_TASKID));
|
|
}
|
|
return pMsg;
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void osp_free_msg(Osp_Msg_Head *pHead)
|
|
{
|
|
osp_atomic_inc((int32_t *)&TASK_MSG_FREECNT(CURRENT_TASKID));
|
|
if (IS_TIMER_MSG(pHead))
|
|
return;
|
|
osp_free_buffer(pHead);
|
|
}
|
|
int32_t osp_free_msgid(Osp_Msg_Head *pHead, int32_t id)
|
|
{
|
|
osp_atomic_inc((int32_t *)&TASK_MSG_FREECNT(id));
|
|
if (IS_TIMER_MSG(pHead))
|
|
return 0;
|
|
return osp_free_buffer(pHead);
|
|
}
|
|
|
|
OSP_STATUS osp_send_msg(Osp_Msg_Head *p_MsgHead)
|
|
{
|
|
OSP_STATUS ret;
|
|
// U8 *pComm;
|
|
uint32_t TaskId;
|
|
// Osp_Msg_Head *p_NMsgHead;
|
|
OSP_FUNCPTR func_handle;
|
|
uint64_t que;
|
|
|
|
osp_assert(NULL != p_MsgHead);
|
|
|
|
TaskId = p_MsgHead->DstId;
|
|
|
|
func_handle = TASK_TXMSG_HANDLE(TaskId);
|
|
if (NULL == func_handle)
|
|
{
|
|
osp_debug_out_with_time(ERR_DEBUG_LEVEL, "task%d can not send msg to task%d\n", CURRENT_TASKID, TaskId);
|
|
osp_free_msg(p_MsgHead);
|
|
|
|
return OSP_ERROR;
|
|
}
|
|
|
|
|
|
que = TASK_MSG_QUE(TaskId);
|
|
|
|
|
|
osp_atomic_inc((int32_t *)&TASK_MSG_TXCNT(CURRENT_TASKID));
|
|
|
|
ret = func_handle(p_MsgHead, que);
|
|
// ret = osp_msg_enque(MSG_TO_OFFSET(p_MsgHead), (Osp_MsgQ_Tcb *)TASK_MSGQ(TaskId));
|
|
if (OSP_OK != ret)
|
|
{
|
|
// osp_free_msg(p_MsgHead);
|
|
osp_debug_out_with_time(ERR_DEBUG_LEVEL, "task%d send msg to task%d msgtype 0x%x failed!\n", CURRENT_TASKID, TaskId, p_MsgHead->MsgType);
|
|
osp_atomic_inc((int32_t *)&TASK_MSG_FULLCNT(TaskId));
|
|
return ret;
|
|
}
|
|
return OSP_OK;
|
|
|
|
}
|
|
OSP_STATUS osp_send_msgId(Osp_Msg_Head *p_MsgHead, int32_t id)
|
|
{
|
|
OSP_STATUS ret;
|
|
// U8 *pComm;
|
|
uint32_t TaskId;
|
|
// Osp_Msg_Head *p_NMsgHead;
|
|
// OSP_FUNCPTR func_handle;
|
|
|
|
osp_assert(NULL != p_MsgHead);
|
|
|
|
|
|
TaskId = p_MsgHead->DstId;
|
|
|
|
osp_atomic_inc((int32_t *)&TASK_MSG_TXCNT(id));
|
|
ret = osp_msg_enque(MSG_TO_OFFSET(p_MsgHead), (Osp_MsgQ_Tcb *)TASK_MSGQ(TaskId));
|
|
if (OSP_OK != ret)
|
|
{
|
|
// osp_free_msgid(p_MsgHead,id);
|
|
osp_atomic_inc((int32_t *)&TASK_MSG_FULLCNT(TaskId));
|
|
return ret;
|
|
}
|
|
return OSP_OK;
|
|
}
|
|
|
|
Osp_Msg_Head *osp_rev_msg(void)
|
|
{
|
|
uint32_t TaskId;
|
|
OSP_FUNCPTR func_handle;
|
|
uint64_t que;
|
|
|
|
TaskId = CURRENT_TASKID;
|
|
|
|
que = TASK_MSG_QUE(TaskId);
|
|
func_handle = TASK_RXMSG_HANDLE(TaskId);
|
|
|
|
return (Osp_Msg_Head *)func_handle(que);
|
|
|
|
}
|
|
|
|
Osp_Msg_Head *osp_rev_msgid(int32_t id)
|
|
{
|
|
|
|
uint64_t RcvMsg;
|
|
(void)osp_msg_deque((uint64_t *)&RcvMsg, (Osp_MsgQ_Tcb *)(TASK_MSGQ(id)));
|
|
osp_atomic_inc((int32_t*)&TASK_MSG_RXCNT(id));
|
|
|
|
return OFFSET_TO_MSG(RcvMsg);
|
|
}
|
|
|
|
|
|
Osp_Msg_Head *osp_rev_msgtry(void)
|
|
{
|
|
|
|
uint64_t RcvMsg;
|
|
int32_t ret;
|
|
ret = osp_msg_dequetry((uint64_t *)&RcvMsg, (Osp_MsgQ_Tcb *)(TASK_MSGQ(CURRENT_TASKID)));
|
|
if (0 != ret)
|
|
{
|
|
return NULL;
|
|
}
|
|
osp_atomic_inc((int32_t *)&TASK_MSG_RXCNT(CURRENT_TASKID));
|
|
return OFFSET_TO_MSG(RcvMsg);
|
|
}
|
|
|
|
Osp_Msg_Head *osp_rev_msg_timeout(uint32_t timeout)
|
|
{
|
|
|
|
uint64_t RcvMsg;
|
|
int32_t ret;
|
|
ret = osp_msg_deque_timeout((uint64_t *)&RcvMsg, (Osp_MsgQ_Tcb *)(TASK_MSGQ(CURRENT_TASKID)), timeout);
|
|
|
|
if (0 != ret)
|
|
{
|
|
return NULL;
|
|
}
|
|
osp_atomic_inc((int32_t *)&TASK_MSG_RXCNT(CURRENT_TASKID));
|
|
return OFFSET_TO_MSG(RcvMsg);
|
|
}
|
|
|
|
Osp_Msg_Head *osp_rev_idmsg(uint32_t Id)
|
|
{
|
|
|
|
uint64_t RcvMsg;
|
|
(void)osp_msg_deque((uint64_t *)&RcvMsg, (Osp_MsgQ_Tcb *)(TASK_MSGQ(Id)));
|
|
osp_atomic_inc((int32_t *)&TASK_MSG_RXCNT(Id));
|
|
|
|
return OFFSET_TO_MSG(RcvMsg);
|
|
}
|
|
|
|
Osp_Msg_Head *osp_rev_idmsgtry(uint32_t Id)
|
|
{
|
|
|
|
uint64_t RcvMsg;
|
|
int32_t ret;
|
|
ret = osp_msg_dequetry((uint64_t *)&RcvMsg, (Osp_MsgQ_Tcb *)(TASK_MSGQ(Id)));
|
|
|
|
if (0 != ret)
|
|
{
|
|
return NULL;
|
|
}
|
|
osp_atomic_inc((int32_t *)&TASK_MSG_RXCNT(Id));
|
|
return OFFSET_TO_MSG(RcvMsg);
|
|
}
|
|
|
|
Osp_Msg_Head *osp_rev_id_msg_timeout(uint32_t timeout, uint32_t Id)
|
|
{
|
|
|
|
uint64_t RcvMsg;
|
|
int32_t ret;
|
|
ret = osp_msg_deque_timeout((uint64_t *)&RcvMsg, (Osp_MsgQ_Tcb *)(TASK_MSGQ(Id)), timeout);
|
|
|
|
if (0 != ret)
|
|
{
|
|
return NULL;
|
|
}
|
|
osp_atomic_inc((int32_t *)&TASK_MSG_RXCNT(Id));
|
|
return OFFSET_TO_MSG(RcvMsg);
|
|
}
|
|
|
|
|
|
|
|
|
|
void osp_show_msg_que_info(void)
|
|
{
|
|
int32_t i;
|
|
Osp_MsgQ_Tcb *MsgQ;
|
|
char *pbuf;
|
|
int32_t len = 0;
|
|
char *p;
|
|
|
|
pbuf = malloc(10*1024);
|
|
osp_assert(pbuf != NULL);
|
|
|
|
len += osp_get_soft_que_desc(pbuf + len);
|
|
|
|
for (i = 0; i < OSP_MAX_TASK; i++)
|
|
{
|
|
if (gOspTask[i].Active)
|
|
{
|
|
|
|
MsgQ = TASK_MSGQ(i);
|
|
len += osp_get_soft_que_info(&OSP_MSGQ_QUE(MsgQ), pbuf + len);
|
|
|
|
}
|
|
}
|
|
|
|
|
|
for (p = pbuf; p < pbuf+len; p += (MAX_DBGINFO_LEN-1))
|
|
{
|
|
osp_debug_out(CMD_DEBUG_LEVEL, "%s", p);
|
|
}
|
|
free(pbuf);
|
|
}
|
|
|
|
|
|
OSP_STATUS osp_send_por_msg(Osp_Msg_Head *p_MsgHead, Osp_MsgQ_Tcb *que)
|
|
{
|
|
int32_t ret;
|
|
ret = osp_msg_enque(MSG_TO_OFFSET(p_MsgHead), que);
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
Osp_Msg_Head *osp_rev_promsg(Osp_MsgQ_Tcb *que)
|
|
{
|
|
|
|
uint64_t RcvMsg;
|
|
|
|
(void)osp_msg_deque((uint64_t *)&RcvMsg, que);
|
|
|
|
return OFFSET_TO_MSG(RcvMsg);
|
|
}
|
|
|
|
|