OpenEdv-开源电子网

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

linux定时内核实践的问题--自旋锁

[复制链接]

21

主题

42

帖子

0

精华

初级会员

Rank: 2

积分
185
金钱
185
注册时间
2019-5-24
在线时间
39 小时
发表于 2020-3-28 20:15:59 | 显示全部楼层 |阅读模式
1金钱
请问:
linux定时内核实践--这个实践中
timer_unlocked_ioctl ()

case OPEN_CMD: /* 打开定时器 */
122 spin_lock_irqsave(&dev->lock, flags);
123 timerperiod = dev->timeperiod;
124 spin_unlock_irqrestore(&dev->lock, flags);
125 mod_timer(&dev->timer, jiffies +
msecs_to_jiffies(timerperiod));
126 break;
127 case SETPERIOD_CMD: /* 设置定时器周期 */
128 spin_lock_irqsave(&dev->lock, flags);
129 dev->timeperiod = arg;
130 spin_unlock_irqrestore(&dev->lock, flags);
131 mod_timer(&dev->timer, jiffies + msecs_to_jiffies(arg));
132 break;
   为何要加自旋锁?在open中使用不就行了,就不会产生竞争了。在该函数中使用自旋锁不明白什么道理?应用层怎么操作才会引起竞争/

最佳答案

查看完整内容[请看2#楼]

这么给你举个栗子吧:一般一个设备是可以被多个应用程序打开的,如果你直接在open函数中加了互斥措施,这样子肯定是不行的,因为你这样做的话意味着这个设备只能同时被一个应用操作;既然这样做是不行的,那么当有多个应用程序打开这个设备,然后通过ioctl函数去控制硬件设备,这样就出现竞争了,而在本驱动例程中,多个应用程序通过ioctl函数都会使得驱动中的timeperiod和timer的变量发生改变,所以从安全角度考虑是需要加上保 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

712

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2178
金钱
2178
注册时间
2018-8-27
在线时间
258 小时
发表于 2020-3-28 20:16:00 | 显示全部楼层
sg_fly 发表于 2020-3-29 09:57
查了资料:定时器函数存取的数据结构应当保护避免并发存取。也就是定时器函数中涉及到临界区需要保护
教程 ...

这么给你举个栗子吧:一般一个设备是可以被多个应用程序打开的,如果你直接在open函数中加了互斥措施,这样子肯定是不行的,因为你这样做的话意味着这个设备只能同时被一个应用操作;既然这样做是不行的,那么当有多个应用程序打开这个设备,然后通过ioctl函数去控制硬件设备,这样就出现竞争了,而在本驱动例程中,多个应用程序通过ioctl函数都会使得驱动中的timeperiod和timer的变量发生改变,所以从安全角度考虑是需要加上保护措施的,当然不一定是自旋锁,你明白吗?
森罗万象
回复

使用道具 举报

21

主题

42

帖子

0

精华

初级会员

Rank: 2

积分
185
金钱
185
注册时间
2019-5-24
在线时间
39 小时
 楼主| 发表于 2020-3-29 09:57:14 | 显示全部楼层
查了资料:定时器函数存取的数据结构应当保护避免并发存取。也就是定时器函数中涉及到临界区需要保护
教程中:
void timer_function(unsigned long arg)
{
        struct timer_dev *dev = (struct timer_dev *)arg;
        static int sta = 1;
        int timerperiod;
        unsigned long flags;

        sta = !sta;                /* 每次都取反,实现LED灯反转 */
        gpio_set_value(dev->led_gpio, sta);
       
        /* 重启定时器 */
        spin_lock_irqsave(&dev->lock, flags);
        timerperiod = dev->timeperiod;
        spin_unlock_irqrestore(&dev->lock, flags);
        mod_timer(&dev->timer, jiffies + msecs_to_jiffies(dev->timeperiod));
}timerperiod 实际没有使用,我觉得可以不用自旋锁。
不理解timer_unlocked_ioctl为何要用自旋锁?
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-25 09:28

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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