Chinaunix首页 | 论坛 | 博客
  • 博客访问: 78349
  • 博文数量: 18
  • 博客积分: 1530
  • 博客等级: 上尉
  • 技术积分: 196
  • 用 户 组: 普通用户
  • 注册时间: 2010-10-18 17:51
文章分类

全部博文(18)

文章存档

2011年(4)

2010年(14)

我的朋友

分类: LINUX

2010-11-09 16:23:43

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就差不多了!
阅读(2414) | 评论(0) | 转发(0) |
0

上一篇:Android Sensor Structure

下一篇:data card usb model

给主人留下些什么吧!~~