MAILBOX_LOCAL long mailbox_ipc_process( struct mb_local_work *local_work, struct mb_local_proc *local_proc, unsigned long channel_id, unsigned long proc_id) { unsigned long is_find = MAILBOX_TRUE; while (local_work) { /*从邮箱工作队列中找到对应的邮箱,设置标志位并释放信号量通知处理任务*/ if (channel_id == local_work->channel_id) { /*设置任务邮箱工作队列链表中此邮箱的数据标志位*/ local_work->data_flag = MAILBOX_TRUE; #ifdef MAILBOX_OPEN_MNTN mailbox_record_sche_send(local_work->mb_priv); #endif wake_lock(&mb_lpwr_lock); if ((proc_id > MAILBOX_RECV_TASK_START) && (proc_id < MAILBOX_RECV_TASK_END)) { /*释放信号量,通知任务*/ local_proc->incoming = MAILBOX_TRUE; wake_up(&local_proc->wait); } else if(MAILBOX_RECV_TASKLET_HI == proc_id) { /*tasklet处理方式,在tasklet中处理邮箱数据*/ tasklet_hi_schedule(&local_proc->tasklet); } else if(MAILBOX_RECV_TASKLET == proc_id) { /*tasklet处理方式,在tasklet中处理邮箱数据*/ tasklet_schedule(&local_proc->tasklet); } else if(MAILBOX_RECV_INT_IRQ == proc_id) { /*中断处理方式,在中断中直接处理邮箱数据*/ mailbox_receive_process((unsigned long)local_proc); } else { is_find = MAILBOX_FALSE; } } local_work = local_work->next; } return is_find; }
MAILBOX_LOCAL int mailbox_ipc_process( struct mb_vx_work *work, struct mb_vx_proc *proc, unsigned int channel_id, unsigned int proc_id) { unsigned int is_find = MAILBOX_FALSE; while (work) { /*从邮箱工作队列中找到对应的邮箱,设置标志位并释放信号量通知处理任务*/ if (channel_id == work->channel_id) { if ((proc_id > MAILBOX_VXWORKS_PROC_STYLE_TASK_RESERVED) && (proc_id < MAILBOX_VXWORKS_PROC_STYLE_TASK_BUTT)) { is_find = MAILBOX_TRUE; /*设置任务邮箱工作队列链表中此邮箱的数据标志位*/ work->data_flag = MAILBOX_TRUE; #ifdef MAILBOX_OPEN_MNTN mailbox_record_sche_send(work->mb_priv); #endif /*释放信号量,通知任务*/ osl_sem_up(&proc->sema); } else if (MAILBOX_VXWORKS_PROC_STYLE_INT_NORMAL == proc_id) { /*中断处理方式,在中断中直接处理邮箱数据*/ if (work->cb) { is_find = MAILBOX_TRUE; if (MAILBOX_OK != work->cb(work->channel_id)) { (void)mailbox_logerro_p1(MAILBOX_ERR_VXWORKS_CALLBACK_ERRO, work->channel_id); } } else { (void)mailbox_logerro_p1(MAILBOX_ERR_VXWORKS_CALLBACK_NOT_FIND, work->channel_id); } } else { is_find = MAILBOX_FALSE; } } work = work->next; } return (int)is_find; }