我是靠谱客的博主 长情宝贝,最近开发中收集的这篇文章主要介绍unsigned long 的用法,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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

一,内核定时器的使用。

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

#include <linux/timer.h>

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 数据,如果我们要传递多个数据,就可以讲几个数据捆绑成一个结构,然后传递结构的指针就可以了。

2 Eg:在我的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);

二.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 强制转换成原来的数或者结构体的指针。


最后

以上就是长情宝贝为你收集整理的unsigned long 的用法的全部内容,希望文章能够帮你解决unsigned long 的用法所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(76)

评论列表共有 0 条评论

立即
投稿
返回
顶部