8308|21

85

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

关于驱动的xxx_Init()创建线程中调用Sleep()导致不能正常启动的问题 [复制链接]

我的OS(CE5.0)中有多个驱动,部分驱动的xxx_Init()函数需要创建线程,进入线程后先Sleep()一定时间(比如先等外部器件上电稳定再去访问它)。
现在的问题是当设置Sleep(2000)等较大的数字时系统能正常启动,而当调用Sleep(100)等较短的时间系统就会卡住。
分析应该是系统在启动中加载各驱动,如果此时线程调用Sleep(100),当Sleep时间到切换回这个线程执行时可能打乱了系统的加载,导致系统无法继续启动;而Sleep(2000)是在各驱动已经加载完成的时候才切换回这个线程执行,所以不影响启动。

但是我的GPS驱动中也有线程,是等待的UART接收中断,用的WaitForSingleObject(),可以确定的是在系统启动加载各驱动的过程中这个线程处于等待和执行之间切换好几次了,根本不影响系统的启动。
所以,Sleep()和WaitForSingleObject()产生的线程切换对系统的影响有不同吗?
为什么Sleep()较短时间会导致系统无法继续启动,但是WaitForSingleObject()却不影响?
请高手指点一下,谢谢!

最新回复

谢谢大家,问题出现在ADC的参考电压上,由于某个驱动的误操作导致在特定环境下ADC的参考电压过低,使ADC转换无法完成,卡住了。 Sleep的时间长短只是导致问题表现出来了。  详情 回复 发表于 2010-1-8 10:12
点赞 关注

回复
举报

66

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
sleep 是休眠 挂起 释放cpu 等时间一到就自动返回到sleep所在的位置执行
WaitForSingleObject 是一种进程间 同步的机制  线程的 同步 肯定不会影响系统的驱动
  建议LZ 看看 线程间的同步和异步
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
引用 1 楼 nx427 的回复:
sleep 是休眠 挂起 释放cpu 等时间一到就自动返回到sleep所在的位置执行
WaitForSingleObject 是一种进程间 同步的机制? 线程的 同步 肯定不会影响系统的驱动
? 建议LZ 看看 线程间的同步和异步

线程调用Sleep只是这个线程停止,其它准备好的线程会获取执行的。
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

4
 
我不懂什么原因,我觉得楼主为什么要在xxx_Init去访问硬件呢?这时候去开电源,不省电啊。工作打开的时候再打开电源不好吗?在xxx_Init加入sleep 会导致系统启动慢,不符合设计原则啊。
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

5
 
引用 3 楼 gooogleman 的回复:
我不懂什么原因,我觉得楼主为什么要在xxx_Init去访问硬件呢?这时候去开电源,不省电啊。工作打开的时候再打开电源不好吗?在xxx_Init加入sleep 会导致系统启动慢,不符合设计原则啊。

有些硬件是在使用的时候才上电的,但是这个是设置自动背光,要系统启动的时候就根据外界光线来调节背光,所以要早点开启。
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

6
 
lz确认是由于线程切换打乱了系统加载导致无法启动?
线程中是否有临界区资源和别的线程竞争导致死锁?
线程中是否有死循环访问硬件寄存器的代码?
Sleep(100);后紧接加调试打印语句是否能够打印出来?
无法启动的现象是 发生异常(data abort or prefetch abort...) 还是无反应?
可以在OEMHandlerISR中增加打印语句,判断cpu是在运行状态还是完全跑飞了.
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

7
 
lz的问题是因为sleep时间短,访问硬件的时候硬件没有准备好导致的吧,不应该是系统时间片切换导致的系统紊乱吧。你可以多打印一些消息看系统到底是挂在哪里了。
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

8
 
lz确认是由于线程切换打乱了系统加载导致无法启动?
是在作此怀疑。

线程中是否有临界区资源和别的线程竞争导致死锁?

通过不同的情况下进行测试应该不是这个原因。
线程中是否有死循环访问硬件寄存器的代码?
这个没有。

Sleep(100);后紧接加调试打印语句是否能够打印出来?
这个正准备试呢,之前把全部的打印信息都去掉了。

无法启动的现象是 发生异常(data abort or prefetch abort...) 还是无反应?

无反应

 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

9
 
引用 6 楼 ricky_hu 的回复:
lz的问题是因为sleep时间短,访问硬件的时候硬件没有准备好导致的吧,不应该是系统时间片切换导致的系统紊乱吧。你可以多打印一些消息看系统到底是挂在哪里了。

这个可以确定不是此原因,由于是ADC采样此器件,所以最多只是数据不准。
 
 
 

回复

87

帖子

0

TA的资源

一粒金砂(初级)

10
 
搞不好是背光驱动的问题,因为它还要和背光驱动交互信息,要考虑一下从背光那边查找一下了
 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

11
 
ADC 有没有被其他驱动使用呀? 比如touch?
也许是sleep切换回来,其他驱动正好在初始化adc,但是又没有完全初始化好,你的线程又对adc寄存器进行一些操作,造成硬件死锁,就启动不了啦.
 
 
 

回复

61

帖子

0

TA的资源

一粒金砂(中级)

12
 
谢谢各位!

目前怀疑是这个时候去Setevent造成的。再查下
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

13
 
waitforsigleobject比sleep好,可在其他线程处理完毕以后直接唤醒waitforsingleObject的线程
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

14
 
应该不是时间短时,才会出现这个问题,只是时间短出现问题的概率更大些。。。

其实这是Sleep()与WaitForSingleObject()的区别而已。。。
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

15
 
sleep的休眠时间不合适时,经常会死机的,所以,用sleep时具体时间长短,心里得有数,就像SD主控驱动加载时,得有76个时钟的sleep,留给系统做为初始化SD的其它部件来用。。。

WaitForSingleObject就不会存在这个问题,等到了就处理,处理完了,就退出
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

16
 
学习学习
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

17
 
MARK,xuexi 学习~
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

18
 
Mark 明天来看。。
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

19
 
还有这事,学习了。
 
 
 

回复

83

帖子

0

TA的资源

一粒金砂(初级)

20
 
Sleep()和WaitForSingleObject()产生的线程切换对系统的影响有不同吗?
是完全一样的.
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表