MTK平台学习----消息通讯机制

 

一、基础知识

        使用消息循环机制之前,我们先来认识几个数据结构

         typedef struct ilm_struct

           {
                    module_type                 src_mod_id;
                    module_type                 dest_mod_id;
                    sap_type                        sap_id;
                    msg_type                       msg_id;
                    local_para_struct *       local_para_ptr;
                    peer_buff_struct  *        peer_buff_ptr;
           } ilm_struct;

         其中各参数的含义如下:

          src_mod_id          ----         请求服务的MOD_ID

          dest_mod_id        ----         接收服务的MOD_ID

          sap_id                    ----         服务请求标示,没有可以填0

          msg_id                   ----         消息的ID号

          local_para_struct  ----        请求需要提供的附加信息,如果有参数需要随MSG一起传入,

                                                         则让这个指针指向相应的数据结构即可

          peer_buff_struct    ----        请求需要提供的附加信息,如果有参数需要随MSG一起传入,

                                                         则让这个指针指向相应的数据结构即可

         系统运行中,会首先调用recive_msg_exq_q从外部消息队列中获取消息,如果消息队列中

         有消息,则立即返回待处理的消息,否则recive_msg_ext_q函数将阻塞Task,直到有消息

          进入消息队列。所以其消息循环机制也就是任务获取其外部队列的消息,然后根据不同的消

          息ID调用不同的处理函数。

二、消息通讯的实例

        任务1接收从键盘输入的字符,然后将输入的字符通过消息队列的形式传送到另外一个任务中。

        函数1:传递消息的函数,此函数对消息结构体进行装填

void SendNoticeMessage( module_type SRCMOD, module_type DESTMOD, kal_uint16 MSGID )
{
	ilm_struct *send_ilm;
	send_ilm = allocate_ilm(SRCMOD);
	ASSERT(send_ilm);
	memset( send_ilm, 0, sizeof( ilm_struct ) );
	send_ilm->src_mod_id = SRCMOD;
	send_ilm->dest_mod_id = DESTMOD;
	send_ilm->msg_id = MSGID;
	msg_send_ext_queue(send_ilm);
}

        函数2:消息发送方所属的进程为FD_SHELL,接收方所处的进程为FD_TEST1

      

int sh_input(int argc, char *argv[])
{
	char szstr[10];
	char dat = 0;
	dat = *argv[1] - '0';
	sprintf(szstr,"input %c",*argv[1]);
	SendNoticeMessage(MOD_FD_SHELL,MOD_FD_TEST1,dat);	//
}

          函数3:消息接收方的处理

 static void fd_test1_fun(task_entry_struct * task_entry_ptr)
 {
	ilm_struct current_ilm;
	Uart_printf("test1 task is run\r\n");
	Uart_printf("Hello world\r\n");
	
	while(1)
    {
	       receive_msg_ext_q(task_info_g[task_entry_ptr->task_indx].task_ext_qid, ¤t_ilm);
	       switch (current_ilm.msg_id)
		{
			case 1:
			       Uart_printf("Test1 task recive msg 1\r\n");
			       break;
			case 2:
				Uart_printf("Test1 task recive msg 2\r\n");
				break;
			case 3:
				Uart_printf("Test1 task recive msg 3\r\n");
				break;
			case 4:
				Uart_printf("Test1 task recive msg 4\r\n");
				break;
			default:
				Uart_printf("The argument can not distingishi\r\n");
				break;
					
		}
		free_ilm(¤t_ilm); //释放存储消息的结构体变量
     }
  }
以上就是MTK消息通讯以及消息的处理过程,上面的例程虽然简单,但是包含了消息的处理思想,其他的复杂的模块如MMI的消息处理过程跟上面的原理是一样的。

你可能感兴趣的:(专业技术文章)