Android系统的bootloader就像他的名字,little kernel,很多东西都做得很简略,比如thread_schedule. 在lk\kernel\thread.c里面,thread在做reschedule的时候,会去检查一个32位的一个flag,因为lk有32个thread priority,也就有32个thread的队列,当某个队列中有active的thread的时候,就会在那个flag中相应的位置一,当进行reschedule的时候,从flag的高位向低位搜索,找到下一个应该激活的thread,然后把它从队列中取出来,激活。所以,这些thread队列中至少有一个thread处于激活状态(当前thread本身)。
而我遇到一个case,当前所有的thread都处在sleep当中,active queue为空,而在一个timer的irq handler里面,调用了thread_sleep(),会导致thread_reschedule,结果从active queue里面取不到需要激活的thread,返回一个错误的指针,导致系统data crash。
另外,对于qualcomm的msm系列芯片,mdelay()和udelay()是用了PGT,一个硬件timer,当在一个线程中使用了mdelay()以后,如果在另外一个线程去使用这个函数,新调用的mdelay函数会clear掉之前的PGT的寄存器,导致之前调用的mdelay永远回不来了。。。。。。所以,在lk里面,尽量不要用mdelay/udelay函数!for或者while就差不多了!
阅读(2411) | 评论(0) | 转发(0) |