全局变量jiffies用来记录自系统启动以来产生的节拍的总数。启动时,内核将该变量初始化为0,此后,每次时钟中断处理程序都会增加该变量的值。一秒内时钟中断的次数等于Hz,所以jiffies一秒内增加的值也就是Hz。
系统运行时间以秒为单位,等于jiffies/Hz。
注意,jiffies类型为无符号长整型(unsigned long),其他任何类型存放它都不正确。
将以秒为单位的时间转化为jiffies:
seconds * Hz
将jiffies转化为以秒为单位的时间:
jiffies / Hz
实验使用1:记下2个函数之间的间隔。
> unsigned long lcd_on_tick;
> unsigned long lcd_off_tick;
> unsigned long lcd_keep_tick;
> void lcd_on(void)
> {
> lcd_on_tick=jiffies;//记下当前时间
> printk("lcd_on_tick = %ld",lcd_on_tick);}
> void lcd_off(void)
> {
> lcd_off_tick=jiffies;
> printk("lcd_off_tick = %ld ",lcd_off_tick);//记下当前时间
>
> lcd_keep_tick=lcd_off_tick-lcd_on_tick;
> printk("lcd_off_tick - lcd_on_tick = %ld
> ms",lcd_keep_tick*1000/HZ);//计算出2者间隔多少ms 通过log显示还是非常准的
> }
>
> <4>[ 144.288757] lcd_on_tick = -15571
> <6>[ 144.289093] lcdc_truly_gpio_init: lcdc_gpio_initialized = 1
> <6>[ 144.289825] lcdc_gordon_panel_on
> <3>[ 144.510650] [TP]cap_touch_screen_set_reset: Set RESET: 0
> <3>[ 144.511840] [TP]cap_touch_screen_set_reset: Set RESET: 1
> <6>[ 144.562561] gt818 1-005d: Guitar Version: 0x00.0x83
> <7>[ 144.570892] BATT: msm_battery_late_resume
> <4>[ 144.571441] [MSM_BATT] msm_batt_set_compensation:
> batt_compensation=0
> <6>[ 145.384063] request_suspend_state: sleep (0->3) at 145385327712
> (2012-09-21 11:26:02.976361082 UTC)
> <7>[ 145.384277] BATT: msm_battery_early_suspend
> <4>[ 145.386718] [MSM_BATT] msm_batt_set_compensation:
> batt_compensation=1
> <6>[ 145.389465] Send suspend cmd
> <4>[ 145.498809] lcd_off_tick = -15450 lcd_off_tick - lcd_on_tick =
> 1210 ms
所以如果有需要比较2个函数执行时间间隔就有用处了,用的情况还是还多的。这里只是一点小用法。
2:设置超时
unsigned long timeout = jiffies + tick_rate * 2; // 2秒钟后超时
if(time_before(jiffies, timeout){
// 还没有超时
}
else{
// 已经超时
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@drawable/bg"
android:orientation="vertical" >
<LinearLayout
android:id="@+id/title_layout"
android:layout_width="fill_parent"
android:layout_height="40dp"
android:layout_alignParentTop="true"
android:background="#40000000"
android:orientation="vertical" >
<ImageView
android:id="@+id/title_bar"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@drawable/main_title_b"
android:gravity="center_horizontal"
/>
</LinearLayout>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
android:paddingLeft="10dip"
android:paddingRight="10dip"
android:paddingTop="20dip">
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content" >
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
>
<FrameLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content" >
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingLeft="4.5dip" >
<!-- 设置第一张图片 -->
<ImageView
android:id="@+id/img1"
android:layout_width="165dip"
android:layout_height="165dip"
android:background="#fff"
android:padding="5dip"
android:src="/blog_article/@drawable/b/index.html" />
</LinearLayout>
</FrameLayout>
<TextView
android:id="@+id/text1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:gravity="center_horizontal"
android:text="图片1"
android:textSize="14dip"
/>
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
>
<!-- 设置第二张图片 -->
<ImageView
android:id="@+id/img2"
android:layout_width="120dip"
android:layout_height="120dip"
android:layout_margin="10dip"
android:background="@drawable/four_bg"
android:src="/blog_article/@drawable/a/index.html" />
<TextView
android:id="@+id/text2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:gravity="center_horizontal"
android:text="图片2"
android:textSize="14dip"
/>
</LinearLayout>
</LinearLayout>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dp">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
>
<!-- 设置第3张图片 -->
<ImageView android:id="@+id/img3"
android:layout_width="120dip"
android:layout_height="120dip"
android:src="/blog_article/@drawable/c/index.html"
android:layout_margin="10dip"
android:background="@drawable/four_bg"
/>
<TextView
android:id="@+id/text3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:gravity="center_horizontal"
android:text="图片3"
android:textSize="14dip"
/>
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
>
<!-- 设置第4张图片 -->
<ImageView android:id="@+id/img4"
android:layout_width="120dip"
android:layout_height="120dip"
android:src="/blog_article/@drawable/d/index.html"
android:layout_marginTop="10dip"
android:layout_marginLeft="35dip"
android:background="@drawable/four_bg"
/>
<TextView
android:id="@+id/text4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:gravity="center_horizontal"
android:text="图片4"
android:textSize="14dip"/>
</LinearLayout>
</LinearLayout>
</LinearLayout>
</LinearLayout>
Point、Size、Rect、Mat 及 Scalar、Vec、Range都是OpenCV中常用的数据类型。
Mat是最强大但也最复杂的一个,而其他类型虽然简单,但是也是最常用的,且它们之间有着紧密的联系,本文先分析这些简单的类型。
1. 定义这些数据类型的目的有哪些?或者有哪些好处?
1.1 定义这些数据类型有哪些共性?
2. 这些数据类型之间的关系有哪些?如能否相互转化、几何逻辑上的操作关系等
3. 每种数据类型,有哪些定义的接口?为什么要定义这些接口?
在core.hpp中,首先定义了这些基本且重要的数据类型(数据结构)。
定义他们的目的有:
1. 存放基本数据,且采用模板的设计方式,适用于各种数据类型
2. 增加一些与所定义的类型的属性,如逻辑上的包含关系
3. 一些数学操作,重载操作符设计,方便图像图形的常见计算
定义它们的共性:
1. 模板设计方式,适用各种基本数据类型(char,int,float,double等)
template<typename _Tp> class CV_EXPORTS
2. 为方便使用,将模板类型特化为常用数据类型
3. 定义在core.hpp文件中,而实现与操作法重载在operation.hpp文件中。
操作符包括 + - * 计算操作符和+= -= *= 比较运算符 == !=
4. 操作符及成员函数,定义为inline函数
关系
转换关系
Point_ <-> Size_
Point_ <-> Vec<_TP, 2>
Point3_ <-> Vec<_TP, 3>
Point_ -> Point3_
Rect 包含 (Point, Size)
继承关系:
Scalar_ : public Vec<_Tp, 4>
Vec : public Matx<_Tp, cn, 1>
Matx: 小型矩阵
Mat 完全独立于上面类型的大型自定义数据类型
Point_
特征:
1. 存放多种数据基本类型,常用
2. 成员函数:构造函数重载,内积,inside rect检测
3. 重载各种操作符
Point3_
特征与Point_类似
Size_
1. 存放数据
2. 成员函数:面积计算
Rect_
1. 包含Point与Size两种属性
2. 成员:左上、右下点、大小、面积计算、点contain检测
Scalar_
1. 各种构造函数,默认参数为0
2. 成员函数:all静态初始化,mul乘积
Matx
在编译期就需要声明好维数和类型的小型Mat,若使用更灵活的类型,需要用Mat
主要用于数学运算,+ - * inv t转置等,类似matlab中的mat
Vec
1. 相当于一维的Matx
2. 成员mul,cross及数学运算符重载等。
Range
1. 非模板数据类型,整型,一维形式
2. 成员:大小、判空计算
Point、Size、Rect是整数类型的模板特化,最常用类型。