c语言中unsigned long,unsigned long 的用法

本文介绍了在内核定时器及ioctl函数中如何巧妙利用unsigned long参数来传递数据或指针,实现灵活的数据传递。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在很多函数调用里面都有 unsigned long 参数,事实上他不只是传递一个数(当然大多数情况下就传递一个数),更重要的是通过强转他还能代表一个地址,即当一个指针使用,下面就举例说明。

(指针与unsigned long什么关系?没有关系,C中值的类型并非值本身的属性,而是取决于它的使用方式。)

一,内核定时器的使用。

内核定时器一般分为声明、注册、删除等操作。

#include

Struct timer_list

{

Unsigned long expires;

Void (*function)(unsigned long)

Unsigned long data;

}

Void init_timer(struct timer_list *timer);

Void add_timer(struct timer_list *timer);

Void del_timer(struct timer_list *timer);

expire 表示期望达到的值,到达这个值后就调用function 函数,并传递data作为参数,这里的data 是一个unsigned long 数据,如果我们要传递多个数据,就可以把几个数据捆绑成一个结构,然后传递结构的指针就可以了。

1)在我的pwm 驱动里面就用了内核定时器,其使用过程为:

struct pwm_dev *my_pwm_dev;

init_timer(&my_pwm_dev->my_timer);

my_pwm_dev->my_timer.expires = jiffies + HZ/5; // 定时器超时时的节拍数

my_pwm_dev->my_timer.data     = (unsigned long)my_pwm_dev;

my_pwm_dev->my_timer.function = my_function; // 定时器超时时调用的函数

add_timer(&my_pwm_dev->my_timer);// 这里开始计时了

在这里 timet_list 的成员data 本来是一个unsigned long的数,这个是传递的一个指针,即设备的指针。

int my_function( unsigned long arg )// 这里的unsigned long arg即为 data。

{

struct pwm_dev *my_pwm_dev = (struct pwm_dev *)arg;

…..

}

在这个函数里面我们可以看到,在my_function函数里面,我们又把一个长整型的数强制转换成一个设备指针,这样就实现了利用unsigned long 作指针传递数据的过程。

3使用过后还得删除定时器

del_timer(&my_pwm_dev->my_timer);

2) "./kernel/kernel/workqueue.c"

static int __init init_workqueues(void)

{

structglobal_cwq*gcwq = get_gcwq(cpu);

spin_lock_init(&gcwq->lock);

INIT_LIST_HEAD(&gcwq->worklist);

gcwq->cpu = cpu;

gcwq->flags |= GCWQ_DISASSOCIATED;

INIT_LIST_HEAD(&gcwq->idle_list);

for (i = 0; i < BUSY_WORKER_HASH_SIZE; i++)

INIT_HLIST_HEAD(&gcwq->busy_hash[i]);

init_timer_deferrable(&gcwq->idle_timer);

gcwq->idle_timer.function = idle_worker_timeout;

gcwq->idle_timer.data =(unsigned long)gcwq;

setup_timer(&gcwq->mayday_timer, gcwq_mayday_timeout,(unsigned long)gcwq);

.....

}

二.Ioctl()函数中 unsigned long 的使用。

Ioctl函数原型为:

int (*ioctl) (struct inode *, struct file *, unsigned int, unsigned long);

在驱动函数中表现为:

ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)

这里也有一个unsigned long arg;同样,我们也可以用这个参数传递一个数或者结构体的指针,只用方法和上面的 timer_list 一样,传递时,使用地址,在ioctl 函数里,将arg 强制转换成原来的数或者结构体的指针。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值