技术开发 频道

优化RIL驱动,巧解WinCE电话漏接难题

    三.优先级处理时需要注意的要点

    (1)什么是优先级处理问题?
    一般来说,WinCE系统上的移动电话设计并没有像Symbian一样针对电话做过优化,甚至根本没考虑到GSM通讯模块的特殊性,而仅仅是把它当作一个可以扩展的硬件模块。也就是说,GSM通讯模块和普通硬件模块的优先级是一样的。因此,连接GSM通讯模块的RIL作为一个驱动和其它驱动是平等的抢夺CPU周期,或平等的被调度,甚至在优先级上都是一样的。但是,GSM通讯模块和其它扩展硬件又有几点很大的差别:一是它需要WinCE系统对某些通讯事件进行足够及时的响应;二是某些正在进行的通讯任务必须不得被抢占,至少不得被长时间挂起,这点有些类似于实时系统的要求。

    正是这样的优先级处理方式在WinCE平台下是会导致漏接电话的。例如,在移动电话有来电时,就会发起一个高于RIL驱动优先级的线程,它会在下一个分发期间拿走CPU处理权,而在它退出之前RIL是无法及时抢回时间片的,因为WinCE对优先级的处理远不如Win NT复杂和灵活,因此可能会存在高优先级线程完全控制CPU而导致低优先级线程被饿死的情况发生的,这样就会“丢失”这一次来电消息,现象就是漏接。或在通话期间产生了一个高优先级线程,它也会从RIL驱动手里夺走CPU控制权,从而可能导致通话中途断开的情况。而且,许多实践也证实,WinCE系统的通讯稳定性问题绝大多数都出在优先级处理上,再加上WinCE系统本身在任务调度上也经常会出现BUG,结果使到高优先级的线程经常无法从低优先级手里拿到时间片,从而导致优先级系统失效。

    (2)优先级处理不当会导致RIL驱动假死
    另外,WinCE发生电话漏接现象除了是优先级问题外,还可能是RIL驱动出现“假死”。 因为很多实践证明目前大多数RIL驱动“假死”问题,都是由于软件问题而非硬件问题造成的。实际上,WinCE系统上出现这种问题也不是很奇怪的,因为出现“假死”的原因主要是因为RIL驱动程序的入口点函数、注册键和GSM模块没有进行适当的交互。因为RIL驱动程序写得是否很好是因人而异的, 毕竟RIL驱动层是用户自己定制的, 而非由微软实现的。

    (3)RIL驱动COM串口的占用问题
在进行RIL驱动端口设计时,许多开发人员常常忽视的一个问题是关于串口的占用问题。因为说到底RIL驱动的底层还是用AT来操作的,如发命令、Response解析等。这是由于GSM模块Modem的历史原因所造成的,因为AP一直是通过基于串口的AT命令与BB交互。包括目前的一些Edge、或3G模块、或像omap的AP/BP集成的芯片,它们大多数仍然是使用模拟串口机制来使用AT命令的。再加上串口是不可复用的,所以在应用RIL时一定要避免串口被占用。

    最后,还需要特别注意的是要避免串口访问的冲突问题。因为只要WinCE系统启动时RIL驱动加载后,就会一直占用着这个串口,别的应用程序是无法直接访问到这个串口的,而无论这个应用程序的优先级有多高。

 

0
相关文章