OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3717|回复: 3

关于驱动中使用死循环的讨论

[复制链接]

2

主题

11

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2023-2-27
在线时间
3 小时
发表于 2023-2-28 14:07:03 | 显示全部楼层 |阅读模式
如题,突发奇想不在用户程序中使用循环,而是在驱动中使用,引发了一些思考和问题:
现象:在驱动中使用xxx_read()函数里面执行如下

while(1){led_on();msleep(500);led_off();msleep();}

能看到灯不停闪,但是控制台死掉,无响应,应该是CPU完全卡在这个循环上了。

思考:
linux内核启动后也会有一个idl(也是死循环)进程(对用户不可见)。各个模块执行的时候应该靠内核调度,虽然使用了死循环,应该是占用CPU使用率
而不是直接卡死这样才合理。(何况内核还有自己的中断,更不应该卡死呀)。网上找了很久,msleep()应该不占用资源,就更不应该卡死了。完全不能理解这个现象
看起来就像CPU运行驱动模块是独占的方式,这样很不合理呀,如果是这样,岂不是驱动就像中断一样,不能执行很多耗时的动作了?
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

821

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3329
金钱
3329
注册时间
2011-11-10
在线时间
207 小时
发表于 2023-3-2 08:36:56 | 显示全部楼层
系统依靠任务优先级进行调度。你写了个while(1),意思是这个程序永远执行不完,即使系统调度了,由于优先级的存在,你看到的现象依然是好像一直在运行这段代码一样。
回复 支持 反对

使用道具 举报

2

主题

11

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2023-2-27
在线时间
3 小时
 楼主| 发表于 2023-3-2 20:15:01 | 显示全部楼层
c2007s 发表于 2023-3-2 08:36
系统依靠任务优先级进行调度。你写了个while(1),意思是这个程序永远执行不完,即使系统调度了,由于优先 ...

其实是应该弄成后台运行的,前台运行就表现“卡死”误以为没有发生调度
回复 支持 反对

使用道具 举报

3

主题

821

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3329
金钱
3329
注册时间
2011-11-10
在线时间
207 小时
发表于 2023-3-5 14:59:16 | 显示全部楼层
iniyashame 发表于 2023-3-2 20:15
其实是应该弄成后台运行的,前台运行就表现“卡死”误以为没有发生调度

对,是这样理解。
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-25 03:25

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表