linux中内核延时编程
内核函数 ndelay, udelay, 以及 mdelay 对于短延时好用, 分别延后执行指定的纳秒数, 微秒数或者毫秒数. 它们的原型是:
#include <linux/delay.h>
void ndelay(unsigned long nsecs);
void udelay(unsigned long usecs);
void mdelay(unsigned long msecs);
有另一个方法获得毫秒(和更长)延时而不用涉及到忙等待. 文件 <linux/delay.h> 声明这些函数:
void msleep(unsigned int millisecs);
unsigned long msleep_interruptible(unsigned int millisecs);
void ssleep(unsigned int seconds)
前 2 个函数使调用进程进入睡眠给定的毫秒数.
#include <linux/delay.h>
void ndelay(unsigned long nsecs);
void udelay(unsigned long usecs);
void mdelay(unsigned long msecs);
有另一个方法获得毫秒(和更长)延时而不用涉及到忙等待. 文件 <linux/delay.h> 声明这些函数:
void msleep(unsigned int millisecs);
unsigned long msleep_interruptible(unsigned int millisecs);
void ssleep(unsigned int seconds)
前 2 个函数使调用进程进入睡眠给定的毫秒数.
一个对 msleep 的调用是不可中断的; 你能确保进程睡眠至少给定的毫秒数.
如果你的驱动位于一个等待队列并且你想唤醒来打断睡眠, 使用 msleep_interruptible. 从 msleep_interruptible 的返回值正常地是 0; 如果, 这个进程被提早唤醒, 返回值是在初始请求睡眠周期中剩余的毫秒数. 对 ssleep 的调用使进程进入一个不可中断的睡眠给定的秒数.
===========================================================================
#include <linux/kthread.h>
#include <linux/module.h>
#include <linux/delay.h>
//定义使用定时来计时的宏
#ifndef SLEEP_MILLI_SEC
#define SLEEP_MILLI_SEC(nMilliSec)\
do { \
long timeout = (nMilliSec) * HZ / 1000; \
while(timeout > 0) \
如果你的驱动位于一个等待队列并且你想唤醒来打断睡眠, 使用 msleep_interruptible. 从 msleep_interruptible 的返回值正常地是 0; 如果, 这个进程被提早唤醒, 返回值是在初始请求睡眠周期中剩余的毫秒数. 对 ssleep 的调用使进程进入一个不可中断的睡眠给定的秒数.
===========================================================================
#include <linux/kthread.h>
#include <linux/module.h>
#include <linux/delay.h>
//定义使用定时来计时的宏
#ifndef SLEEP_MILLI_SEC
#define SLEEP_MILLI_SEC(nMilliSec)\
do { \
long timeout = (nMilliSec) * HZ / 1000; \
while(timeout > 0) \
{ \
timeout = schedule_timeout(timeout); \
} \
}while(0);
#endif
#define error(...) do {\
printk("********************************************************\n");\
printk("error located %s : %d :%s\n",__FILE__,__LINE__,__FUNCTION__);\
printk(__VA_ARGS__);\
printk("********************************************************\n");\
}while(0)
timeout = schedule_timeout(timeout); \
} \
}while(0);
#endif
#define error(...) do {\
printk("********************************************************\n");\
printk("error located %s : %d :%s\n",__FILE__,__LINE__,__FUNCTION__);\
printk(__VA_ARGS__);\
printk("********************************************************\n");\
}while(0)
static struct task_struct * MyThread = NULL;
static int MyPrintk(void *data)
{
int i = 0;
while (i>-1 ) {
if (kthread_should_stop()) {
break;
}
error(" i = %d\n",i);
//延时1000毫秒,在延时中一直占用CPU,不适合做长时间的延时,否则会导致内核或者系统出问题
//udelay(),ndelay()同理
//mdelay(1000);
//用定时来延时1000毫秒
static int MyPrintk(void *data)
{
int i = 0;
while (i>-1 ) {
if (kthread_should_stop()) {
break;
}
error(" i = %d\n",i);
//延时1000毫秒,在延时中一直占用CPU,不适合做长时间的延时,否则会导致内核或者系统出问题
//udelay(),ndelay()同理
//mdelay(1000);
//用定时来延时1000毫秒
//SLEEP_MILLI_SEC(1000);
msleep(1000);
i++;
}
return 0;
}
static int __init init_kthread(void)
{
MyThread = kthread_run(MyPrintk,"hello world","mythread");
return 0;
}
static void __exit exit_kthread(void)
{
if(MyThread)
{
msleep(1000);
i++;
}
return 0;
}
static int __init init_kthread(void)
{
MyThread = kthread_run(MyPrintk,"hello world","mythread");
return 0;
}
static void __exit exit_kthread(void)
{
if(MyThread)
{
printk("stop MyThread\n");
kthread_stop(MyThread);
MyThread = NULL;
}
return;
}
module_init(init_kthread);
module_exit(exit_kthread);
MODULE_AUTHOR("hyy");
MODULE_LICENSE("GPL");
kthread_stop(MyThread);
MyThread = NULL;
}
return;
}
module_init(init_kthread);
module_exit(exit_kthread);
MODULE_AUTHOR("hyy");
MODULE_LICENSE("GPL");
linux下的sleep函数
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论