一、基础知识
使用消息循环机制之前,我们先来认识几个数据结构
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的消息处理过程跟上面的原理是一样的。