|
楼主 |
发表于 2006-5-21 16:57:00
|
显示全部楼层
<P>写得太过简单了!</P><P>第四条自问自答好了,不对地地方大家指正:</P><P 0cm 0cm 0pt; LINE-HEIGHT: 12pt">服务的思想是与事件相关联的。服务其实是某一个<FONT face="Times New Roman">task</FONT>将对部分消息的处理抽象成一个接口,客户端可以通过<FONT face="Times New Roman">SCI_RegisterMsg()</FONT>函数可以对自己感兴趣的消息注册处理回调函数。</P><P 0cm 0cm 0pt; LINE-HEIGHT: 12pt">用户自己创建<FONT face="Times New Roman">Service</FONT>的步骤:(以<FONT face="Times New Roman">USB task</FONT>为例)</P><P 0cm 0cm 0pt; LINE-HEIGHT: 12pt"><FONT face="Times New Roman">1</FONT>.创建<FONT face="Times New Roman">task</FONT>之前创建<FONT face="Times New Roman">usb service</FONT>:创建时需指定一个默认的消息处理回调函数,当客户端在注册消息处理,而未指定处理函数,系统会调用该默认的回调函数来处理该事件消息。</P><P 0cm 0cm 0pt; LINE-HEIGHT: 12pt"><FONT face="Times New Roman"> status = SCI_CreateClientList(USB_DISK_SERVICE, (UDISK_MSG_MAX_NUM & 0x0ff), <p></p></FONT></P><P 0cm 0cm 0pt; LINE-HEIGHT: 12pt"><FONT face="Times New Roman"> (REG_CALLBACK) UDISKSVR_SendSignal);<p></p></FONT></P><P 0cm 0cm 0pt; LINE-HEIGHT: 12pt"><FONT face="Times New Roman"> //</FONT>如果是用户自定义的服务,服务<FONT face="Times New Roman">id</FONT>要求在<FONT face="Times New Roman">USER_SERVICE</FONT>之后。<p></p></P><P 0cm 0cm 0pt; LINE-HEIGHT: 12pt"><FONT face="Times New Roman"> status = SCI_CreateStaticThread(USB_TASK_ID, "T_UDISK", U_DiskTask, 0, 0, <p></p></FONT></P><P 0cm 0cm 0pt; LINE-HEIGHT: 12pt"><FONT face="Times New Roman"> u_disk_stack_addr, U_DISK_STACK_SIZE, <p></p></FONT></P><P 0cm 0cm 0pt; LINE-HEIGHT: 12pt"><FONT face="Times New Roman"> (SCI_PRIORITY_IDLE ), SCI_PREEMPT,<p></p></FONT></P><P 0cm 0cm 0pt; LINE-HEIGHT: 12pt"><FONT face="Times New Roman"> "Q_UDISK", u_disk_queue_addr, U_DISK_QUEUE_NUM, <p></p></FONT></P><P 0cm 0cm 0pt; LINE-HEIGHT: 12pt"><FONT face="Times New Roman"> SCI_AUTO_START);<p></p></FONT></P><P 0cm 0cm 0pt; LINE-HEIGHT: 12pt"><p><FONT face="Times New Roman"> </FONT></p></P><P 0cm 0cm 0pt; LINE-HEIGHT: 12pt"><FONT face="Times New Roman">2</FONT>.<FONT face="Times New Roman"> </FONT>在客户端通过<FONT face="Times New Roman">SCI_RegisterMsg()</FONT>注册消息处理<FONT face="Times New Roman"> </FONT></P><P 0cm 0cm 0pt; LINE-HEIGHT: 12pt"><FONT face="Times New Roman"> </FONT></P><P 0cm 0cm 0pt; LINE-HEIGHT: 12pt"><FONT face="Times New Roman"> MMI task</FONT>:<FONT face="Times New Roman">APP_RegisterRefService</FONT>()<FONT face="Times New Roman">in mmimain.c </FONT></P><P 0cm 0cm 0pt; LINE-HEIGHT: 12pt"><FONT face="Times New Roman"> //Register UDISK event<p></p></FONT></P><P 0cm 0cm 0pt; LINE-HEIGHT: 12pt"><FONT face="Times New Roman"> #ifndef WIN32 <p></p></FONT></P><P 0cm 0cm 0pt; LINE-HEIGHT: 12pt"><FONT face="Times New Roman"> SCI_RegisterMsg( UDISK_SERVICE, <p></p></FONT></P><P 0cm 0cm 0pt; LINE-HEIGHT: 12pt"><FONT face="Times New Roman"> UDISK_PLUGIN, <p></p></FONT></P><P 0cm 0cm 0pt; LINE-HEIGHT: 12pt"><FONT face="Times New Roman"> UDISK_MSG_MAX - 1, <p></p></FONT></P><P 0cm 0cm 0pt; LINE-HEIGHT: 12pt"><FONT face="Times New Roman"> UdiskCallBackFunc);<p></p></FONT></P><P 0cm 0cm 0pt; LINE-HEIGHT: 12pt"><p><FONT face="Times New Roman"> </FONT></p></P><P 0cm 0cm 0pt; LINE-HEIGHT: 12pt"><FONT face="Times New Roman">3</FONT>.在<FONT face="Times New Roman">usb task</FONT>的主函数中,获得某一个<FONT face="Times New Roman">singnal</FONT>后,若需要<FONT face="Times New Roman">signal</FONT>应交由客户端来处理,则既可调用<FONT face="Times New Roman">SCI_SendEventToClient</FONT>()调用客户端提供的消息处理回调函数(注意:该函数仍然是在服务端的<FONT face="Times New Roman">task</FONT>内运行的)。回调函数中不能做太耗时的工作,一般来说,只是给客户的<FONT face="Times New Roman">task</FONT>转发一个消息。<p></p></P><P 0cm 0cm 0pt; LINE-HEIGHT: 12pt"><FONT face="Times New Roman"> if( (SIM_SET_ARM_CLK_CNF == cmd) && bStartFlag)<p></p></FONT></P><P 0cm 0cm 0pt; LINE-HEIGHT: 12pt"><FONT face="Times New Roman"> {<p></p></FONT></P><P 0cm 0cm 0pt; LINE-HEIGHT: 12pt"><FONT face="Times New Roman"> // Send con <p></p></FONT></P><P 0cm 0cm 0pt; LINE-HEIGHT: 12pt"><FONT face="Times New Roman"> SCI_SendEventToClient(USB_DISK_SERVICE, UDISK_START_CNF, NULL); <p></p></FONT></P><P 0cm 0cm 0pt; LINE-HEIGHT: 12pt"><FONT face="Times New Roman"> do_udisk_start(); <p></p></FONT></P><P 0cm 0cm 0pt; LINE-HEIGHT: 12pt"><FONT face="Times New Roman"> SCI_SendEventToClient(USB_DISK_SERVICE, UDISK_STOP_CNF, NULL); <p></p></FONT></P><P 0cm 0cm 0pt; LINE-HEIGHT: 12pt"><FONT face="Times New Roman"> // restore the freq<p></p></FONT></P><P 0cm 0cm 0pt; LINE-HEIGHT: 12pt"><FONT face="Times New Roman"> bStartFlag = 0;<p></p></FONT></P><P 0cm 0cm 0pt; LINE-HEIGHT: 12pt"><FONT face="Times New Roman"> // Send a request to change ARM clock<p></p></FONT></P><P 0cm 0cm 0pt; LINE-HEIGHT: 12pt"><FONT face="Times New Roman"> REF_SendSetArmClkReq(old_clk);<p></p></FONT></P><P 0cm 0cm 0pt; LINE-HEIGHT: 12pt"><FONT face="Times New Roman"> }<p></p></FONT></P>[br]<p align=right><font color=red>+3 RD币</font></p> |
|