iTOP-4412全能版采用四核Cortex-A9,主频为1.4GHz-1.6GHz,配备S5M8767 电源管理,集成USB HUB,选用高品质板对板连接器稳定可靠,大厂生产,做工精良。接口一应俱全,开发更简单,搭载全网通4G、支持WIFI、蓝牙、陀螺仪、CAN总线、RS485总线、500万摄像头等模块,稳定运行Android 4.0.3/Android 4.4操作,系统通用Linux-3.0.15+Qt操作系统(QT支持5.7版本),Ubuntu版本:12.04,接口智能分配 方便好用。
第二十一章 延时函数专题
本章介绍的延时函数,使用起来非常简单,但是却会经常用到的,所以单独作为一个专题来介绍。
除了介绍系统编程中的延时函数,还会介绍到内核中的延时函数,它们的使用方法多是类似的,在驱动专题中大家可以使用,本章就不提供具体的例子了,只介绍函数调用。
本章配套视频为
“视频 12_01 延时之基本知识介绍”
“视频 12_02 延时之延时实验
21.1 Linux 中的延时函数介绍
这里要注意的是,不同的操作系统下,延时函数是不一样的,由具体系统决定的。Linux 中常用的函数有以下函数 sleep、usleep、ndelay、udelay、mdelay 等。
Linux 系统编程下用到的延时函数在头文件“#include <unistd.h>”中,包括函数sleep、usleep。
Linux 内核中用到的延时函数在“#include <linux/delay.h>”中,包括函数 ndelay、udelay、mdelay。
函数 sleep
函数 sleep 是秒延时。函数原型如下:
unsigned int sleep(unsigned int seconds);
例如:sleep(1),即延时一秒。
返回无符号的整形数值,如果延时成功则返回 0,如果延时过程中被打断,则返回剩余的秒数。
例如 sleep(5),返回值为 3,那么实际延时就是 5-3=2 秒。
函数 usleep
函数 usleep 是微妙延时。函数原型如下:
int usleep(useconds_t usec);
useconds 需要小于 1000000
例如:usleep(10),表示延时 10 微秒。
延时成功则返回 0,失败则返回-1
函数 delay 系列
函数 delay 系列是在 Linux 内核中用的,也就是在 linux 驱动中,会用到。函数 mdelay 是毫秒延时,函数原型如下:
void mdelay(unsigned long msecs);
例如:mdelay(10),表示延时 10 毫秒。
函数 udelay 是微秒延时,函数原型如下:
void udelay(unsigned long usecs);
例如:udelay(5),表示延时 5 微秒。
函数 ndelay 是纳秒延时,函数原型如下:
void ndelay(unsigned long nsecs);
例如:ndelay(3),表示延时 3 纳秒。
再提醒一下,这里的 delay 函数只是在内核中使用的,sleep 是在系统编程中使用的。要注意区分。
21.2 Linux应用中的延时实验
本实验先介绍简单的延时应用,在学习了后面时间管理之后,再对这些延时函数的进度进行测试,虽然函数看起来类似,但是实现的原理不一样,精度不同,导致应用的场合也会不同。
函数代码
linux 系统编程中使用的是 sleep 和 usleep 函数。编写简单的 sleep.c 文件测试 sleep 函数。
首先添加头文件,如下图所示。
然后 main 函数如下图所示。
如上图代码所示。
使用 sleep 和 usleep 函数分别延时 2 秒和 1 秒,然后循环打印信息。
编译运行测试
在 Ubuntu 系统下,如下图所示,进入前面实验创建的目录“/home/linuxsystemcode/”,使用命令“mkdir sleep”新建 sleep 文件夹,将源码sleep.c 拷贝进去。
进入新建的文件夹 sleep,如下图所示。
使用命令“arm-none-linux-gnueabi-gcc -o sleep sleep.c -static”编译 sleep 文件, 如下图所示,使用命令“ls”可以看到生成了 sleep 可执行文件。
这里介绍 U 盘拷贝代码的方法,也可以编译进文件系统,具体方法参考 10.3.5 小节。将编译成的可执行文件 sleep,拷贝到 U 盘,启动开发板,插入 U 盘,加载 U 盘,运行程序如下。
如上图所示,运行之后会打印“sleep 2!”和“usleep 1000000!”。退出可以使用键盘输入“Ctrl+c”
21.3 Linux内核驱动中的延时
Linux 内核中使用 delay 系列函数,在后面驱动的学习中,再去测试 delay 函数,用起来比较简单。
先要调用头文件“#include <linux/delay.h>”,然后就可以使用 delay 系列的函数,在驱动做做延时操作了。
常用的地方,例如在驱动对硬件进行初始化的时候,例如芯片有上电时序,那么这个时候就需要用到延时函数,直接调用 delay 即可。