作者howard6066 (秘密)
看板C_and_CPP
标题[问题] polling function timer问题
时间Sun Jun 14 15:42:28 2020
各位版友好
不知道能不能在这问linux kernel的问题
描述一下我的问题
我在driver实作一个function 我想定时约1~2sec polling它
每次都要根据侦测speed 自动做点灯的行为
架构如下, 我想把这function放在probe, init时自动polling
static int mv88e6xxx_get_speed(struct mv88e6xxx_chip *chip)
{
/** Get_speed_status **/
mv88e6xxx_port_read(chip, port, MV88E6XXX_PORT_STS_CTL, ®);
/** 根据对应speed, 用mmio access做对应的gpio点灯行为 **/
switch (reg & MV88E6XXX_PORT_STS_SPEED_MASK) {
case 10:
ioread();
iowrite();
break;
case 100:
ioread();
iowrite();
break;
case 1000:
ioread();
iowrite();
break;
.
.
.
}
我想用timer 来做这件事 如下
/**************** Kernel_Timer *************/
struct timer_list danny_timer;
static int danny_do(void)
{
struct mv88e6xxx_chip *chip;
mv88e6xxx_get_speed(chip);
danny_timer.expires = jiffies + HZ;
add_timer(&danny_timer);
}
static void danny_timer_init(void)
{
/* Timer 初始化 */
init_timer(&danny_timer);
/* define timer 要执行之函式 */
danny_timer.function = danny_do;
/* define timer 传入函式之 Data */
danny_timer.data = ((unsigned long) 0);
/* define timer Delay 1秒的时间 */
danny_timer.expires = jiffies + HZ;
/* 启动 Timer*/
add_timer(&danny_timer);
}
/*********************************************/
开机时会kernel panic, 不知道是跟mmio有关吗?
如果单纯printk(); 倒是很正常
kernel timer能做到call function吗?
如果不行, 是要使用timer + wait_queue 机制这样做吗??
有更简单的作法吗?
谢谢
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 114.198.167.208 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1592120550.A.C47.html
1F:→ withoutshine: chip 变数的使用有点怪 06/14 17:01
2F:推 yamakazi: 你确定io速度来得及做完? 06/14 17:53
3F:→ howard6066: 这样秒数可能得拉长看看 看做io会挂掉吗 06/14 18:05
4F:→ howard6066: 想在driver 搞个类似while(1)的方式 06/14 18:09