工作已经马上四个月了!该动动笔祭奠祭奠这些时光了~
这两天有个新案子,在以前的手机基础上增加了三个侧键,要做成音乐手机的上一曲,下一曲,暂停键。我的工作倒是很简单,找几个意思差不多的虚拟键盘对应到相应的文件就OK了,但是上层是怎么把消息对应到正确的按键呢?
在KEYPAD.C中有一个专为键盘而建立的进程KPDSVR,并规定了THREAD_ENTRY(KPDSVR)入口,在进程的初始化中,我们马上看到了注册进程以及进程的一些初始化,在初始化函数Init()中,除去常规的那些出错处理,做的最主要的一件事就是HAL_RegCallback(TB_KPD_INT, KPDSVR_Callback);向内核注册了一个CALLBACK函数KPDSVR_Callback,这个函数其实就是我们常见的中断处理函数,通过某种机制,在有键盘按下会发生中断(注意,我们现在用的是中断而不是轮询),中断后就由这个函数只做了一件事,向上面发送一个消息,告诉KPDSVR这个进程有哪个键盘,做了什么动作(不知道这可不可以理解为中断的上半部)。
再往下看,竟然是个for(;;),情何以堪,和UC差不多?在for里面的第一句key_sig_ptr = (KPDSVR_SIG_T *)SCI_GetSignal(KPDSVR);原来中断里面的消息在这里被捕获了,在循环一遍后如果没有新的按键按下即消息队列中没有新的消息时,此进程挂起,等待中断。
然后,此进程做的事情也相当简单,在例行的排错后,判断过power键,以及普通键是down还是up,又直接向上层发送了一个消息,如SCI_SendEventToClient