最新日志

发表于:2008-5-14 11:27:36
标签:auto,register,static,const,volatile  

0

C语言中auto,register,static,const,volatile的区别

1)auto
  这个关键字用于声明变量的生存期为自动,即将不在任何类、结构、枚举、联合和函数中定义的变量视为全局变量,而在函数中定义的变量视为局部变量。这个关键字不怎么多写,因为所有的变量默认就是auto的。

(2)register
  这个关键字命令编译器尽可能的将变量存在CPU内部寄存器中而不是通过内存寻址访问以提高效率。

(3)static
  常见的两种用途:
    1>统计函数被调用的次数;
    2>减少局部数组建立和赋值的开销.变量的建立和赋值是需要一定的处理器开销的,特别是数组等含有较多元素的存储类型。在一些含有较多的变量并且被经常调用的函数中,可以将一些数组声明为static类型,以减少建立或者初始化这些变量的开销.
  详细说明:
    1>、变量会被放在程序的全局存储区中,这样可以在下一次调用的时候还可以保持原来的赋值。这一点是它与栈变量和堆变量的区别。
    2>、变量用static告知编译器,自己仅仅在变量的作用范围内可见。这一点是它与全局变量的区别。
    3>当static用来修饰全局变量时,它就改变了全局变量的作用域,使其不能被别的程序extern,限制在了当前文件里,但是没有改变其存放位置,还是在全局静态储存区。

  使用注意:
    1>若全局变量仅在单个C文件中访问,则可以将这个变量修改为静态全局变量,以降低模块间的耦合度;
    2>若全局变量仅由单个函数访问,则可以将这个变量改为该函数的静态局部变量,以降低模块间的耦合度;
    3>设计和使用访问动态全局变量、静态全局变量、静态局部变量的函数时,需要考虑重入问题(只要输入数据相同就应产生相同的输出)。

(4)const
  被const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。它可以修饰函数的参数、返回值,甚至函数的定义体。
  作用:
    1>修饰输入参数
      a.对于非内部数据类型的输入参数,应该将“值传递”的方式改为“const引用传递”,目的是提高效率。例如将void Func(A a) 改为void Func(const A &a)。
      b.对于内部数据类型的输入参数,不要将“值传递”的方式改为“const引用传递”。否则既达不到提高效率的目的,又降低了函数的可理解性。例如void Func(int x) 不应该改为void Func(const int &x)。
    2>用const修饰函数的返回值
      a.如果给以“指针传递”方式的函数返回值加const修饰,那么函数返回值(即指针)的内容不能被修改,该返回值只能被赋给加const修饰的同类型指针。
       如对于: const char * GetString(void);
       如下语句将出现编译错误:
        char *str = GetString();//cannot convert from 'const char *' to 'char *';
       正确的用法是:
       const char *str = GetString();
      b.如果函数返回值采用“值传递方式”,由于函数会把返回值复制到外部临时的存储单元中,加const修饰没有任何价值。如不要把函数int GetInt(void) 写成const int GetInt(void)。
    3>const成员函数的声明中,const关键字只能放在函数声明的尾部,表示该类成员不修改对象.

   说明:
    const type m; //修饰m为不可改变
   示例:
    typedef char * pStr; //新的类型pStr;
    char string[4] = "abc";
    const char *p1 = string;
    p1++; //正确,上边修饰的是*p1,p1可变
    const pStr p2 = string;
    p2++; //错误,上边修饰的是p2,p2不可变,*p2可变
   同理,const修饰指针时用此原则判断就不会混淆了。
    const int *value; //*value不可变,value可变
    int* const value; //value不可变,*value可变
    const (int *) value; //(int *)是一种type,value不可变,*value可变
              //逻辑上这样理解,编译不能通过,需要tydef int* NewType;
    const int* const value;//*value,value都不可变

(5)volatile
  表明某个变量的值可能在外部被改变,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。它可以适用于基础类型如:int,char,long......也适用于C的结构和C++的类。当对结构或者类对象使用volatile修饰的时候,结构或者类的所有成员都会被视为volatile.
  该关键字在多线程环境下经常使用,因为在编写多线程的程序时,同一个变量可能被多个线程修改,而程序通过该变量同步各个线程。
  简单示例:
   DWORD __stdcall threadFunc(LPVOID signal)
   {
     int* intSignal="reinterdivt"_cast(signal);
     *intSignal=2;
     while(*intSignal!=1)
     sleep(1000);
     return 0;
   }
  该线程启动时将intSignal 置为2,然后循环等待直到intSignal 为1 时退出。显然intSignal的值必须在外部被改变,否则该线程不会退出。但是实际运行的时候该线程却不会退出,即使在外部将它的值改为1,看一下对应的伪汇编代码就明白了:
     mov ax,signal
     label:
     if(ax!=1)
     goto label
  对于C编译器来说,它并不知道这个值会被其他线程修改。自然就把它cache在寄存器里面。C 编译器是没有线程概念的,这时候就需要用到volatile。volatile 的本意是指:这个值可能会在当前线程外部被改变。也就是说,我们要在threadFunc中的intSignal前面加上volatile关键字,这时候,编译器知道该变量的值会在外部改变,因此每次访问该变量时会重新读取,所作的循环变为如下面伪码所示:
     label:
     mov ax,signal
     if(ax!=1)
     goto label
  注意:一个参数既可以是const同时是volatile,是volatile因为它可能被意想不到地改变。它是const因为程序不应该试图去修改它。

(6)extern
  extern 意为“外来的”···它的作用在于告诉编译器:有这个变量,它可能不存在当前的文件中,但它肯定要存在于工程中的某一个源文件中或者一个Dll的输出中。 


本文地址:http://read.newbooks.com.cn/info/197065.html

点击此处查看原文 >>

系统分类: 嵌入式   |    用户分类:    |    来源: 转贴

评论(1) | 阅读(33)
发表于:2008-5-14 11:12:36
标签:volatile  

0

C语言关键字volatile的使用

        一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。下面是volatile变量的几个例子:
1) 并行设备的硬件寄存器(如:状态寄存器)
2)  一个中断服务子程序中会访问到的非自动变量(Non-automatic variables)
3)  多线程应用中被几个任务共享的变量
        回答不出这个问题的人是不会被雇佣的。我认为这是区分C程序员和嵌入式系统程序员的最基本的问题。嵌入式系统程序员经常同硬件、中断、RTOS等等打交道,这些都要求volatile变量。不懂得volatile内容将会带来灾难。
        假设被面试者正确地回答了这是问题(嗯,怀疑是否会是这样),我将稍微深究一下,看一下这家伙是不是直正完全懂得volatile的重要性。
1) 一个参数既可以是const还可以是volatile吗?解释为什么。
2) 一个指针可以是volatile 吗?解释为什么。
3) 下面的函数有什么错误:
int square(volatile int *ptr)
{
   return *ptr * *ptr;
}
下面是答案:
1) 是的。一个例子是只读的状态寄存器。它是volatile因为它可能被意想不到地改变。它是const因为程序不应该试图去修改它。
2) 是的。尽管这并不很常见。一个例子是当一个中断服务子程序修改指向一个buffer的指针时。
3) 这段代码里有个恶作剧。这段代码的目的是用来返指针*ptr指向值的平方,但是,由于*ptr指向一个volatile型参数,编译器将产生类似下面的代码:
int square(volatile int *ptr)
{
  int a,b;
  a = *ptr;
  b = *ptr;
  return a * b;
}
由于*ptr的值可能被意想不到地该变,因此a和b可能是不同的。结果,这段代码可能返回值不是你所期望的平方值!正确的代码如下:
long square(volatile int *ptr)
{
  int a;
  a = *ptr;
  return a * a;
}


================================================================================
volatile的本意是“易变的”
由于访问寄存器的速度要快过RAM,所以编译器一般都会作减少存取外部RAM的优化。比如:

static int i="0";

int main(void)
{
  ...
  while (1)
  {
    if (i) dosomething();
  }
}

/* Interrupt service routine. */
void ISR_2(void)
{
  i="1";
}

程序的本意是希望ISR_2中断产生时,在main当中调用dosomething函数,但是,由于编译器判断在main函数里面没有修改过i,因此可能只执行一次对从i到某寄存器的读操作,然后每次if判断都只使用这个寄存器里面的“i副本”,导致dosomething永远也不会被调用。如果将将变量加上volatile修饰,则编译器保证对此变量的读写操作都不会被优化(肯定执行)。此例中i也应该如此说明。

================================================================================

一般说来,volatile用在如下的几个地方:
1、中断服务程序中修改的供其它程序检测的变量需要加volatile;
2、多任务环境下各任务间共享的标志应该加volatile;
3、存储器映射的硬件寄存器通常也要加volatile说明,因为每次对它的读写都可能有不同意义;

另外,以上这几种情况经常还要同时考虑数据的完整性(相互关联的几个标志读了一半被打断了重写),在1中可以通过有关中断来实现,2中可以禁止任务调度,3中则只能依靠硬件的良好设计了。

volatile 的含义
volatile总是与优化有关,编译器有一种技术叫做数据流分析,分析程序中的变量在哪里赋值、在哪里使用、在哪里失效,分析结果可以用于常量合并,常量传播等优化,进一步可以使代码消除。但有时这些优化不是程序所需要的,这时可以用volatile关键字禁止做这些优化,volatile的字面含义是易变的,它有下面的作用:

1、不会在两个***作之间把volatile变量缓存在寄存器中。在多任务、中断、甚至setjmp环境下,变量可能被其他的程序改变,编译器自己无法知道,volatile就是告诉编译器这种情况。

2、不做常量合并、常量传播等优化,所以像下面的代码:
volatile int i = 1;
if (i > 0) ...

if的条件不会当作无条件真。

3、对volatile变量的读写不会被优化掉。如果你对一个变量赋值但后面没用到,编译器常常可以省略那个赋值***作,然而对Memory Mapped IO的处理是不能这样优化的。


================================================================================


前面有人说volatile可以保证对内存操作的原子性,这种说法不大准确,其一,x86需要LOCK前缀才能在SMP下保证原子性,其二,RISC根本不能对内存直接运算,要保证原子性得用别的方法,如atomic_inc。

对于jiffies,它已经声明为volatile变量,我认为直接用jiffies++就可以了,没必要用那种复杂的形式,因为那样也不能保证原子性。

你可能不知道在Pentium及后续CPU中,下面两组指令:

inc jiffies
;;
mov jiffies, %eax
inc %eax
mov %eax, jiffies

作用相同,但一条指令反而不如三条指令快。


================================================================================

关键在于两个地方:

1、编译器的优化


在本线程内,当读取一个变量时,为提高存取速度,编译器优化时有时会先把变量读取到一个寄存器中;以后,再取变量值时,就直接从寄存器中取值;当变量值在本线程里改变时,会同时把变量的新值copy到该寄存器中,以便保持一致;当变量在因别的线程等而改变了值,该寄存器的值不会相应改变,从而造成应用程序读取的值和实际的变量值不一致;当该寄存器在因别的线程等而改变了值,原变量的值不会改变,从而造成应用程序读取的值和实际的变量值不一致。

举一个不太准确的例子:
发薪资时,会计每次都把员工叫来登记他们的银行卡号,一次会计为了省事,没有即时登记,用了以前登记的银行卡号,刚好一个员工的银行卡丢了,已挂失该银行卡号,从而造成该员工领不到工资。

员工 -- 原始变量地址
银行卡号 -- 原始变量在寄存器的备份


2、在什么情况下会出现

1) 并行设备的硬件寄存器(如:状态寄存器)
2) 一个中断服务子程序中会访问到的非自动变量(Non-automatic variables)
3) 多线程应用中被几个任务共享的变量


补充:volatile应该解释为“直接存取原始内存地址”比较合适,“易变的”这种解释简直有点误导人;
“易变”是因为外在因素引起的,象多线程,中断等,并不是因为用volatile修饰了的变量就是“易变”了,假如没有外因,即使用volatile定义,它也不会变化;
而用volatile定义之后,其实这个变量就不会因外因而变化了,可以放心使用了;大家看看前面那种解释(易变的)是不是在误导人。


------------简明示例如下------------------

volatile关键字是一种类型修饰符,用它声明的类型变量表示可以被某些编译器未知的因素更改,比如:操作系统、硬件或者其它线程等。遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进行优化,从而可以提供对特殊地址的稳定访问。
使用该关键字的例子如下:
int volatile nVint;
>>>>当要求使用volatile 声明的变量的值的时候,系统总是重新从它所在的内存读取数据,即使它前面的指令刚刚从该处读取过数据。而且读取的数据立刻被保存。
例如:
volatile int i="10";
int a = i;
...
//其他代码,并未明确告诉编译器对i进行过操作
int b = i;
>>>>volatile 指出i是随时可能发生变化的,每次使用它的时候必须从i的地址中读取,因而编译器生成的汇编代码会重新从i的地址读取数据放在b中。而优化做法是,由于编译器发现两次从i读数据的代码之间的代码没有对i进行过操作,它会自动把上次读的数据放在b中。而不是重新从i里面读。这样以来,如果i是一个寄存器变量或者表示一个端口数据就容易出错,所以说volatile可以保证对特殊地址的稳定访问。
>>>>注意,在vc6中,一般调试模式没有进行代码优化,所以这个关键字的作用看不出来。下面通过插入汇编代码,测试有无volatile关键字,对程序最终代码的影响:
>>>>首先,用classwizard建一个win32 console工程,插入一个voltest.cpp文件,输入下面的代码:
>>
#include <stdio.h>
void main()
{
int i="10";
int a = i;
printf("i= %d",a);
//下面汇编语句的作用就是改变内存中i的值,但是又不让编译器知道
__asm {
mov dword ptr [ebp-4], 20h
}
int b = i;
printf("i= %d",b);
}
然后,在调试版本模式运行程序,输出结果如下:
i = 10
i = 32
然后,在release版本模式运行程序,输出结果如下:
i = 10
i = 10
输出的结果明显表明,release模式下,编译器对代码进行了优化,第二次没有输出正确的i值。下面,我们把 i的声明加上volatile关键字,看看有什么变化:
#include <stdio.h>
void main()
{
volatile int i="10";
int a = i;
printf("i= %d",a);
__asm {
mov dword ptr [ebp-4], 20h
}
int b = i;
printf("i= %d",b);
}
分别在调试版本和release版本运行程序,输出都是:
i = 10
i = 32
这说明这个关键字发挥了它的作用!

------------------------------------

volatile对应的变量可能在你的程序本身不知道的情况下发生改变,比如多线程的程序,共同访问的内存当中,多个程序都可以操纵这个变量,你自己的程序,是无法判定这个变量会发生变化;还比如,他和一个外部设备的某个状态对应,当外部设备发生操作的时候,通过驱动程序和中断事件,系统改变了这个变量的数值,而你的程序并不知道。
对于volatile类型的变量,系统每次用到他的时候都是直接从对应的内存当中提取,而不会利用cache当中的原有数值,以适应它的未知何时会发生的变化,系统对这种变量的处理不会做优化——显然也是因为它的数值随时都可能变化的情况。

--------------------------------------------------------------------------------------

典型的例子:
for ( int i="0"; i<100000; i++);
这个语句用来测试空循环的速度的
但是编译器肯定要把它优化掉,根本就不执行
如果你写成:
for ( volatile int i="0"; i<100000; i++);
它就会执行了

 

http://gyy.javaeye.com/blog/166678

点击此处查看原文 >>

系统分类: 嵌入式   |    用户分类:    |    来源: 转贴

评论(0) | 阅读(88)
发表于:2008-5-6 10:26:54
标签:LABVIEW,定时器  

1

谈谈LABVIEW的几种定时器

LABVIEW提供了几种定时器(包括DELAY),如下图所示

(1) Tick Count

Returns the value of the millisecond timer. The base reference time (millisecond zero) is undefined. That is, you cannot convert millisecond timer value to a real-world time or date. Be careful when you use this function in comparisons because the value of the millisecond timer wraps from (2^32)1 to 0.(返回毫秒定时器的值. 基准参考时间(0 毫秒)未定义,也就是说,不能把返回的毫秒数直接转换成现实世界的时间和日期.必须注意当你使用这个函数进行比较的时候,毫秒定时器达到2^32-1后反转成0. )

 

基准参考时间未定义,说法比较模糊,难道会是个随机数,那显然不可能,如果是随机数,那两次调用TICK COUNT取得差值就不可能表示经过的毫秒数.无论如何,必须有个时间的起点.

 

API函数中也有一个类似的函数:GetTickCount,该函数返回计算机启动以来经过的毫秒数.在9X中,它读取的是BIOS中保存的系统时钟的滴答数,早期PC的ROM初始化Intel8259定时器芯片来产生硬件中断08H。这个中断有时称为"定时器滴答"中断。中断08H每隔54。925毫秒产生一次,或大约每秒18.2次。BIOS使用中断08H更新存于BIOS数据区的"时间"值.这就是长说的55MS的由来.对于NT操作系统,常规的说法是能精确到10MS,也就是说精度在1MS时是不精确的.

 

经过实际测试,LABVIEW的TICK COUNT的返回值和API的返回值是一致的,也就是计算机启动以来经过的毫秒数.

 

毫秒数达到2^32-1后反转成0,可见它的数值形式是U32,最大值是2^32-1,大概相当于49.7天.对于一个连续运行的计算机,用这个节点进行比较的时候,在连续运行49.7天后,该值自动恢复到零,如果在这个时刻进行比较,可能会出现错误的结果.

 

(2) wait(ms)

Waits the specified number of milliseconds and returns the value of the millisecond timer. Wiring a value of 0 to the milliseconds to wait input forces the current thread to yield control of the CPU. This function makes asynchronous system calls, but the nodes themselves function synchronously. Therefore, it does not complete execution until the specified time has elapsed.(等待指定的毫秒数并返回毫秒定时器的值(上面提到的计算机启动以来的毫秒数).如果WAIT (MS)连接0会强迫当前线程放弃控制权. )

 

WAIT 0MS是一个相当重要的特点,相当于VB 的DOEVENTS,CVI中的PROCESSSYTEMEVENTS,实际是归还控制权给操作系统,来处理队列中的其他消息,如果没有消息需要处理,系统马上把控制权交给这个线程,继续运行.这里有两种情况,如果系统消息队列中无需要处理的消息,立即返回,如果系统消息队列中有消息需要处理,并且是一个耗时操作,无法预料LV线程何时再次取得控制权.我们比较LV是否加WAIT 0MS的速度.

实验过程中未执行其它任何操作,避免了处理其他消息造成的影响.两者之间,差距是惊人的.这也体现了LABVIEW的一个优点,对于一个倾向于硬件控制的编程软件,它有着极强的任务抢先能力.

 

在一个循环里多次并行执行WAIT,是累加时间,还是按最长的执行那,实际上是异步的还是同步的问题.我们做一下实验.

可见,这三个WAIT是同时执行的.

 

由于WAIT是基于线程的,一个循环里的WAIT不会影响同时运行的其它线程的运行.

 

(3)WAIT UNTIL NEXT MS MULTIPULE

Waits until the value of the millisecond timer becomes a multiple of the specified millisecond multiple. Use this function to synchronize activities. You can call this function in a loop to control the loop execution rate. However, it is possible that the first loop period might be short. Wiring a value of 0 to the milliseconds multiple input forces the current thread to yield control of the CPU. This function makes asynchronous system calls, but the nodes themselves function synchronously. Therefore, it does not complete execution until the specified time has elapsed. (一直等到毫秒定时器变成指定时间的整数倍.可以用于在一个循环中调节循环的执行速率.但是第一次的循环周期可能比较短.可以直接连接0到这个节点,强迫当前线程放弃控制权,归还给CPU. )

 

相比WAIT MS,这个节点在循环中更为常用,对于几个采用相同参数的WAIT UNTIL NEXT MS MULTIPULE,可以实现不特别精确的同步.由于LABVIEW的循环的特点,首次是立即执行的,所以第一次是不能保证同步的.如果必须要保证同步的话,可以在循环中第一次执行空循环来避免这个问题.

 

(4) TIME DELAY EXPRESS

我们先把TIME DELAY EXPRESS VI转换成常规VI,跟踪一下它是如何实现的.

 

 

进一步跟踪SUBTIMEDELAY

 

可见,实际上还是调用的wait(ms),不过是数据类型换成的DOUBLE,表示秒数,同时增加了错误簇,有利于实现顺序延时动作.其他完全等同于wait(ms).

 

(5)   ELAPSED TIME EXPRESS

LV7.1后新增加了这个ELAPSED TIME快速节点,这是一个非常有用的定时器.功能强大,可以实现复杂的控制功能.

 

1.循环定时触发一个事件.

 

 

2.输出一个方波 (5秒)

 

3.PWM波形.

 

4.系统时钟

 

出处:http://www.eefocus.com/myspace/blog/show_148601.html


 

点击此处查看原文 >>

系统分类: 虚拟仪器   |    用户分类:    |    来源: 整理

评论(2) | 阅读(170)
发表于:2008-4-30 11:45:14
标签:无标签

0

谐波定义

        供电系统谐波的定义是对周期性非正弦电量进行傅立叶级数分解,除了得到与电网基波频率相同的分量,还得到一系列大于电网基波频率的分量,这部分电量称为谐波。谐波频率与基波频率的比值(n=fn/f1) 称为谐波次数。电网中有时也存在非整数倍谐波,称为非谐波(Non-harmonics)或分数谐波。谐波实际上是一种干扰量,使电网受到“污染”。电工技术领域主要研究谐波的发生、传输、测量、危害及抑制,其频率范围一般为2≤n≤40。

点击此处查看原文 >>

系统分类: 电源技术   |    用户分类:    |    来源: 整理

评论(0) | 阅读(96)
发表于:2008-4-17 16:37:34
标签:机械防盗  电子防盗  

0

汽车防盗技术解读

      汽车防盗主要有各种防盗产品和原厂防盗设备。汽车防盗产品主要分两大类,机械防盗产品和电子防盗产品。机械防盗产品有车轮锁,挡锁和方向盘锁。电子防盗产品从普通的电子防盗器到手机遥控的GSM和卫星定位的GSP。下面我们挨个介绍每类防盗产品的特性和优缺点。

    机械防盗产品

    车轮锁:顾名思义,车轮锁上锁在车轮上,使车轮无法转动而达到防盗目的。

    优点:车轮锁一般十分笨重巨大,车贼几乎是不可能破坏车轮锁锁体的。而将锁上车轮锁的车轮卸下换一个车轮将车开走的可能性较低。

    缺点:车轮锁的防盗性能取决于它所采用的锁芯。它的锁芯若是园形锁孔,一字形,十字形或其它普通锁孔,则车轮锁不安全。因为这些普通锁芯用专用工具数秒之内便可强力扭开。

    另外,车轮锁是在室外使用,风吹雨打,再加上锁芯与地面距离很近,锁芯很易损坏。例如,若车停泊在泥地上,一场大雨过后,泥沙进入锁芯,车轮锁就很可能再也打不开了。

    排档锁:排挡锁有两种类型,一种类型需要铆接一块钢板在车体上,一个类拟普通挂锁的锁体固定在该钢板上。

    优点:可将排挡杆锁定在停泊车档位置而防止汽车开走。排挡锁使用较为方便。

    缺点:安全性不够。对大多数车而言,车贼只需打开车前盖,从车头处用杆拔弄排挡部件,便可挂上档将车开走。

    方向盘锁:是目前车主使用最多的防盗工具。

    优点:它便宜,使用不太麻烦,使用后给车主心理踏实感觉。此外如果发生紧急情况,还可当防身利器。

    缺点:方向盘的外圆和辐柱是由塑料包囊着很小的铝合金管(直径约为一厘米,壁厚约为一毫米)做成。用一把一尺长的铁剪,便可在数秒内轻易地剪开方向盘外圆或辐柱。然后把方向盘锁从切口处取出扔掉。整个过程只需6~60多秒!如果你的方向盘锁采用的是圆形锁匙孔或其它普通锁匙孔,那更简单,车贼用专用工具强力扭开锁芯把车锁打开。速度之快,可能比你用钥匙开锁还快。

    机械防盗产品是市面上最简单最廉价的一种,其原理是将转向盘和控制踏板或挡柄锁住。其优点是价格便宜,安装简便;缺点是防盗不彻底,机械式防盗器主要是起到限制车辆操作的作用,对防盗方面能够提供的帮助有限,很难抵挡住铁撬、钢锯、大剪刀等重型工具的盗窃。但如果歹徒用特制的开锁工具,或者用高腐蚀性的化学试剂通过锁孔腐蚀锁芯,偷盗汽车也只是几分钟的事情。此外每次拆装麻烦,不用时还要找地方放置。  

    电子防盗产品

    电子防盗器:电子防盗器是在汽车上加装电子防盗设备,从而达到监控车辆和报警目的。这是时下最流行而且销售量最大的防盗器,其普及程度恐怕是其他防盗器所不能比的。

    优点:无论是发动机盖、行李舱和车门的开启,车辆被碰撞或升离地面,或者有人闯进车厢等状况发生时,警报器都会发出警报声引起车主及他人的注意。

    缺点:这种防盗器普及之后,有些偷车贼已研究出对策。无论是简单跳码还是固定码,通过专门的解码器都能在几秒钟内对到码。而且,这种防盗器经常会有误报警的情形发生,产生扰民噪声,人们对此也习以为常,使其防盗效果大减。对付抢车和整车拖吊,这种防盗器也是无能为力,如果车主离爱车较远,被偷以后想追也难。

    GPS卫星定位系统

    GPS卫星定位系统是目前国内外最先进的防盗装置。

    优点:目前的GPS系统具有车辆定位、网络防盗、遥控熄火、车内监听、抛锚救援、路况信息、人工导航、车辆查询等多种功能。

    缺点:但目前它还不太普及,最主要的原因是价格太高。光安装一套不带显示屏的GPS就需要花费6000-7000元,而每年还需向GPS系统服务公司交纳近千元的服务费,高昂的购买费和使用费让许多车主望而却步。它还受到盲区多、价格高、使用费高及警方出警能力的限制,除了易被破坏外,也有侵犯车主隐私的嫌疑。

    与机械式防盗器相比,电子防盗器最大的优点在于具有报警功能,但是目前的电子防盗器误报现象也较普遍。此外,安装电子防盗器时必然会改动原车电路,如果安装不够正确,就有可能和原车的防盗系统发生冲突,还可能对空调、车内电器等线路造成损害

    电子防盗产品从原理上可能很先进复杂,但它们有一个共同的软肋:全国之内只要有一个盗窃专才能破解这些电子防盗产品,他就可把破解方法做成解码器或软件通过互联网售给全国各地车贼。各地车贼无需多少文化和电子知识,也能轻易地用购买到的解码器破解汽车电子防盗系统而将车开走(专用车系的解码器只需500多元,适用任何车型的解码器则需9千元)。并且,对付买车后加装的电子防盗系统,很多时候,车贼无需解码器和专门技术便可破解。他只需花点时间观察技工是如何将电子防盗系统的电线从车头牵引到其它部位,他就很容易地用铁丝做成的钩将这些电线勾出切断,使电子防盗系统失效。另外,对付手机遥控的GSM和卫星定位的GSP,只需用手机干挠器便可使其失效。因此,电子防盗产品只可吓阻小毛贼,对专业车贼可能毫无作用。

    原厂防盗设备

    智能车钥匙:汽车作为高科技产品,其自身的防盗性能也在逐步提高。特别是一些新车型和中高档车,其配备的防盗装置本身就是相当精密的防盗系统。它的每个钥匙内都带有发射芯片,当钥匙插入点火开关时,芯片向收发线圈输送信号,这相当于传输密码,如果防盗控制器识别编码不正确,就会立刻指令发动机电脑切断供油和点火系统,使发动机无法启动。

    如果原厂防盗器本身比较先进,就不必再花钱去装新的防盗器,目前多数汽车的防盗功能,都被集成到智能化的车钥匙上,但千万要管好你的车钥匙。因此,万一丢失后应在第一时间到授权服务中心去更换钥匙。但电脑系统却极易被调换,有的专业歹徒甚至在2-3分钟内不需要车钥匙也能通过保险装置轻易发动汽车并将汽车偷走。

    车钥匙的保管

    现代的车钥匙功能十分强大,但是注意一定要对钥匙的保管,不然任何措施都无从说起。车主们一定要注意以下几个环节。

    当不在车里时,不管是几分钟,都坚决不要把钥匙留在点火器上,务必要熄火锁车,拿下车钥匙,关紧车窗、天窗,不给给盗贼以可乘之机。

    一般不要把车的备用钥匙放在车里,现在的汽车防盗系统一般都是针对发动机的,偷车贼即使去配了一把车钥匙能打开车门,但也不能启动引擎开走车。而备用钥匙就能使引擎点火,所以备用钥匙千万不能放在车内。当开车去公众场所时,将车交由他人代泊要谨慎,那样很容易让盗贼乘机配制车钥匙。

    还有一点最重要,就是防盗器的遥控器与车钥匙要分开放置。最好将遥控器贴身存放,尤其在出入商场、电影院、娱乐场等人多的地方。曾经有这样一个案例:一男士驾驶一辆奔驰车停在停车场,被一偷车团伙看到,其中一人在车旁看守,另外两人尾随男士进入商厦,乘机窃走车钥匙,将车开走。因该男士将车钥匙与遥控器放在一起,所以防盗器根本没起作用。

    近年来,汽车上又出现了形形色色的人体锁,给车主提供了极大方便。这种锁的特点是将声音、指纹等人体生物特征作为密码输入,由计算机进行识别,控制开锁。因此,生物锁的安全程度相当高,也是汽车防盗锁的发展趋势。

    指纹锁是利用指纹图形每个人不同的特征制成的一种汽车门锁。制作时先在锁内安装车主的指纹图形,当车主开启车门时,只要将手指往门锁上一按,如果指纹图形相符,车门即开。眼睛锁是利用视网膜图纹来控制的汽车门锁。这种锁内设有视网膜识别和记忆系统,车主开锁时只需凑近门锁看一眼,视网膜图形与记录相吻合时,车门会自动打开,否则就会将人拒之车外。、
 
    六大精英防盗

    除了上述种种比较常见的汽车防盗方式,还有很多不常见的,多配备于高档车的精英式防盗方法。

    1、引擎防止起动器“防盗”的最高境界,是窃贼即使进入车内,破坏线路,也无法顺利将车子发动开走。目前凯迪拉克STS、福特蒙迪欧、欧宝等车型配备。

    2、密码式防盗器在每次发动前都需输入密码,经确认无误后才能解除防盗。车主可随时更改密码。雪铁龙休旅车等休闲、长途旅行车配备较多。

    3、红外线侦测器以红外线侦测器来侦测车内的任何风吹草动,只要一有动静,防盗系统立即启动。保时捷911等配备。

    4、气流侦测装置通过超音波传感器侦测“车内空气密度”细微变化,从而触动防盗器。沃尔沃及东风标致307等配备了此类装置。

    5、自动变换密码系统目前只有奔驰和宝马配有此种设备。该装置由点火开关、电子式防止起动器及引擎监理系统组合而成,系统先辨识钥匙中的密码,才授与“发动权”,同时辨识器还会再送出一组新密码,存在芯片中,作为下次点火的密码。

    6、欧版的防盗系统数字认证防盗系统是全球公认有效的起动抑制系统,很难破解,此种系统厂家管制非常严,修护上耗时费力,费用也高。

    五大草根怪招

    不过,相对于这些刻望不可及的设备,中国聪明的车主们想出了很多奇招怪招。

    1、我总是喜欢把我的夏利停在宝马车的旁边。犯罪分子要偷也只会偷宝马,不会偷我们的破车啊。

    2、在车上放一条戴头盔穿防弹衣身背氧气筒鼻子插氧气管的沙皮狗,100公斤级以上的,肌肉毕现,满脸横肉那种。对了、还有墨镜。

    3、高科技设备对付不了,拆车又麻烦,那就用生物技术吧,弄一条眼镜蛇放车上,看谁还敢来。不过在广东也许蛇和狗也不一定有用。

    4、弄一杠铃杆横着锁前轮子上。难道贼还能举着车走?那丫可神力了,趴车底下把杠铃杆夸脖子上背着走兴许有一试,赶上哪位同志的车是绿色捷达的,这大绿帽子乌龟可当定了。

    5、弄一举升机。到家就把车举起来,电源用接线板从家里引,用完一收。除非贼有病练原地掰档,否则不上去。下面又多了一个停车位,商量商量占地可以少交一半,连换机油都可以DIY,一举多得呀,全赢全赢。

    此外,车主可以根据车辆情况,自设一两处外人难以解除的小故障或机关,可在车门锁、发动启动线路、油路等处动脑筋,实用的方式可以把点火系中的低压线断掉(低压线比高压线隐蔽);或是改进外装汽车附件,如燃油箱、蓄电池、灯具等,应在连接紧固螺丝上加以改进,可以改用不标准螺母,如五角形螺母必须用特制的扳手才能拧开。这样如果盗车贼用2-3分钟解决了第一道防盗锁,而低压线不通或其他措施又会起作用,就使贼已没时间再去研究,只好罢手另寻目标。
 
 
 

点击此处查看原文 >>

系统分类: 汽车电子   |    用户分类:    |    来源: 整理

评论(0) | 阅读(296)
发表于:2008-4-15 11:27:23
标签:nRF9E5  RTC  低频唤醒定时器  

1

nRF9E5 RTC 中断程序

设置了初始化和中断,如果进入RTC中断的话外部的LED应该是可以闪烁的。

void Init(void)
{
  unsigned char cklf;

  TH1 = 243;                 // 19200@16MHz (when T1M=1 and SMOD="1")
  CKCON |= 0x10;           // T1M=1 (/4 timer clock)
  PCON = 0x80;             // SMOD="1" (double baud rate)
  SCON = 0x52;             // Serial mode1, enable receiver
  TMOD = 0x20;             // Timer1 8bit auto reload
  TR1 = 1;                   // Start timer1
  P0_ALT |= 0x06;           // Select alternate functions on pins P0.1 P0.2
  P0_DIR |= 0x02;           // P0.1 (RxD) is input

  SPICLK = 5;               // SPI clock
  SPI_CTRL = 0x02;           // Connect internal SPI controller to Radio

  // Switch to 16MHz clock:
  RACSN = 0;
  SpiReadWrite(RRC | 0x09);
  cklf = SpiReadWrite(0) | 0x04;
  RACSN = 1;
  RACSN = 0;
  SpiReadWrite(WRC | 0x09);
  SpiReadWrite(cklf);
  RACSN = 1;
}

void RTC_init(void)
{
  TICK_DV=0x05;
  while((REGX_CTRL&0x10)!=0){;}
  REGX_MSB = 0x01;
  REGX_LSB = 0xff;
  REGX_CTRL= 0x0A;
}

bit led="0";
void RTC_ISR(void) interrupt 12
{
  WDTI =0;
  led=!led;
  P04=led;
}

void main(void)
{
  P0_ALT = 0x00;
  P0_DIR = 0xAF;
  Init();
  EWDI=1;
  EA = 1;
  Delay100us(255);
  for (;
  {
  }
}

点击此处查看原文 >>

系统分类: 单片机   |    用户分类:    |    来源: 转贴

评论(0) | 阅读(112)
发表于:2008-3-27 14:32:24
标签:电磁兼容  印制电路板  

0

噪声耦合传输机制

 学习笔记之四(电磁兼容和印制电路板)

-----------------------------------------------------------

 

    对于每种耦合路径有四种传输机制,传导耦合、磁场耦合、电场耦合和电磁场耦合。如果耦合机理可以确定的话,就可以采用一种合理的解决方案来降低耦合。

l        传导耦合是一种共阻抗耦合。当噪声源和敏感电路通过公共阻抗连接时,就会发生这种耦合。两个连接的最小化是必须的。这是因为噪声电流必须从源流到负载并流回到源。图1.8给出了两个环路和一个电源。每个环路的电流都必须流经电源子系统内的公共阻抗以及公共连线。

点击看大图

 

l        当一个电流回路产生的一部分磁通量经过另一个电流路径形成的第2个环路时,就会出现磁场耦合。磁通量耦合由两个回路之间的互感系数表示。第2个回路感应形成的噪声电压为,这里就是互感系数,而就是路径上的电流变化的速率。磁通量耦合如图1.9所示。

 

 

l         电场耦合在低阻抗电路中产生。它的影响相对于其他可能出现的耦合来说要小。在一个电路中,如果高阻抗 (见图1.10)并联就会出现互电容。当一个电路产生的电通量的一部分在另一个电路的导体处结束,就会出现电容耦合。两个电路的电通量可以用互电容表示。流进一个敏感电路的噪声电流近似为I=CdV/dt.

 

l         电磁场耦合是电场和磁场同时影响电路的结合。根据源和接收器的距离,电场(E)和磁场(H)影响可能不同,取决于我们是在近场还是远场。这是观察到的最普遍的干扰能量传输机制。

    当处理辐射发射问题时,最普遍的规则是:频率越高,辐射耦合的效率就越高;频率越低,传导路径EMI的效率就越高。系统中耦合的概率为“1。耦合的程度取决于频率。

 最常见的噪声耦合方式是通过导体、电线或PCB走线。这种导体可以从“肇事的”设备中截取RF噪声并将噪声传送给受害的电路。阻止这种干扰传输发生的最简单的方法就是:消除有害线路的噪声,或者阻止受害线路接收RF能量。

    1.11显示了一种传播路径的模型。信号线直接连接源和目的元件。使用这种电路,在邻近电路中会同时出现电感耦合(L)和电容耦合(C)。观察图1.11,注意到输出电容将吸取一定比例的输出驱动电流。线路的电感将削弱信号,这些信号还会耦合到邻近的线路。信号路径间的电容不仅会通过引起串话而导致信号恶化,也会分流一部分RF能量。最后,负载的电容分得输入源中的一部分能量。然后负载电容将电磁信号能量耦合到大地。

点击看大图

    如果信号路径与信号的上升时间相比很长的话,就可以观察到分布效应。能量沿着特征阻抗为Z0的路径传播,到达负载。如果负载阻抗与源阻抗相同,也为Z0,所有的能量将被负载吸收。如果负载阻抗高的话,信号会被发射到源,因为信号能量不能被电路完全消耗。这种发射信号可以看作是振铃信号或过/欠发射信号。转移阻抗,无论是电感性还是电容性,都存在内部元件中。内部接地的不平衡将进一步降低传输信号的质量。

 

[]一个电长走线定义为走线中传输信号的上升时间小于信号回路的传输时间,包括从源到负载和从负载到源地时间总和。需要考虑信号振铃和发射引起的信号变化。

点击此处查看原文 >>

系统分类: PCB   |    用户分类:    |    来源: 整理

评论(0) | 阅读(183)
发表于:2008-3-26 10:00:30
标签:电磁兼容  印制电路板  

0

电磁干扰模型

学习笔记之三(电磁兼容和印制电路板)

-----------------------------------------------------------

一个简单的电磁干扰模型包括3个要素:

(1)必须有能量源

(2)必须有接收器,并且当电磁干扰强度超过允许的界限时这个能量源会使该接收器发生紊乱。

(3)在接收器和能量源之间必须有供那些不希望有的能量传输的耦合路径。

    只有所有的3个要素都存在时干扰才存在。一般而言,设计一个PCB来消除大多数射频干扰源是最经济的途径(称作抑制)。对PCB进行设计以保持射频能量只在那些需要这些能量的区域出现是必须的。第2个和第3个要素趋向于密封技术处理。对于PCB我们观察以下一些内容:

l         噪声源包括时钟产生电路、塑料封装内部元件的辐射、不正确的布线、电气意义上的长线、不良的阻抗控制、内部电缆连接等等。

l         传播路径是承载射频能量的媒质,例如自由空间或互联电缆(公共阻抗耦合)

l         接收器可以是PCB上的元件,它们可以很容易从I/O电缆接收有害辐射干扰,并将这个有害能量传送到容易受损的电路和设备。

 

点击此处查看原文 >>

系统分类: PCB   |    用户分类:    |    来源: 整理

评论(0) | 阅读(205)
发表于:2008-3-25 9:25:43
标签:电磁兼容  印制电路板  

0

设计工程师们常见的一些电磁兼容问题

学习笔记之二(电磁兼容和印制电路板)

---------------------------------------------------------------

1 规范

美国通讯委员会(FCC)建立了一系列电子设备的规范,以限制污染电磁环境的干扰的数量。FCC的做法是受了德国Verband Deutscher Electrotechniker(VDE)的推动,该组织从第二次世界大战后不久就开始颁布一些强制性的规范。世界上的其它国家也都已经效法VDEECC为数字产品开发规范。规范不仅控制发射也控制敏感性和抗干扰性。欧州在抗干扰性测试处于领先地位。

2 射频干扰

造成有害的干扰并不需要很大的发射功率。典型的设备故障出现在场强为1~10V/m的范围内。例如,一个功率为1W的无线电发射机在距一个电子设备1m远的地方大约有5V/m的场强, 该场强的测量因测量用的频率和天线的不同而不同。在欧洲、北美和很多亚洲国家,避免射频干扰损坏其它设备已经成为对所有产品在法律上的强制性规定。

3 静电放电(ESD

放电可以由直接或辐射的方式引起。直接接触的静电放电一般引起设备永久性损坏,或者造成潜在的隐患,从而在以后的每个时刻引发永久性的损坏。辐射引起的静电放电(比如房屋中家具的移动、建筑反射的静电放电能量或者是有人走过一块地毯)可能引起设备紊乱,导致工作不正常,但不会引起系统的永久性损坏。

静电放电被认为是一般边缘变化率小于十亿分之一秒一次的宽带高频问题,转换成频谱带宽可达到1GHz。在低于十亿分之一秒的时间内观察到静电放电现象也并不罕见。这个更快的边缘速率开始成为吉赫兹频谱带宽的问题。

为了符合欧盟的电磁兼容标准,要在抗干扰性的要求下处理静电放电问题。

4  电力干扰

随着越来越多的电子设备接入电力主干网,潜在的干扰出现了。这些问题包括电力线干扰、电快速瞬变(EFT)、电涌、电压变化(高/低电平),闪电瞬变和电力线谐波。老的产品和供电系统一般不受这些干扰的影响,而对于新的高频开关电源来说,这些干扰变得显著起来。因为开关元件一般在电压波形的波峰消耗能量,而不是整个波形。

模拟和数字设备对电力线干扰的反应不尽相同。数字电路被电力系统的尖峰信号(EFT 和闪电)所影响,就像过高或过低的电压导致的故障一样。模拟器件需工作在一定的电平上,当干扰引起系统电源参考电平变化时,该器件正常工作所需要的电平可能受到影响。

电力线谐波已经成为一个主要的问题,特别是在欧洲。非线性负载(开关电源)在周期的峰值处而不是整个正弦波期间消耗交流电源的能量。这个变化的负载产生谐波和波形失真,从而影响电力配送网。例如对于230V50Hz的交流电系统,经常可以发现150Hz的三次谐波、250Hz的五次谐波,并在这些高频上消耗不同的输入电流值。

5 自兼容性

数字部分或电路可能干扰模拟设备,在导线之间产生串扰,或者一个风扇马达可以引起数字电路的紊乱。增强对这个问题的认识,加上设计实现,从而避免内部系统故障的发生,将减少成本并使系统更加可靠。

点击此处查看原文 >>

系统分类: PCB   |    用户分类:    |    来源: 整理

评论(0) | 阅读(196)
发表于:2008-3-23 23:46:36
标签:电磁兼容  印制电路板  

1

电磁兼容基本定义

学习笔记之一(电磁兼容和印制电路板)

----------------------------------------------------

 

1.电磁兼容性(EMC,电气和电子系统、设备和装置,在设定的电磁环境中,在规定的安全界限内以设计的等级或性能运行,而不会由于电磁干扰引起损坏或不可接受的性能恶化的能力。

2.电磁干扰(EMI,即电磁兼容性不足,干扰的本质就是缺乏兼容性。电磁干扰是破坏性电磁能从一个电子设备通过辐射或传导传到另一个电子设备的过程。一般来说,这个术语特指射频信号,但电磁干扰可以在所有的频率范围内发生,从“直流到阳光”。

3.射频(RF,一个用于通信目的连续电磁辐射的频率范围(一般来说就是从10KHz100GHz), 这个能量可能是电子设备运行时的副产物。射频主要通过两种模式传送:

l        辐射发射(Radiated Emissions,射频能量通过电磁场媒介传播。尽管射频能量经常通过自由空间传导,也可以通过其它形式来传播。

l        传导发射(Conducted Emissions,射频能量通过发射形成传播波,一般通过电线或内部连接电缆。LCI(线路传导干扰)指的是在电流或交流干线的输入电缆中的射频能量。传导信号以传导波而不是以场的形式传播。

4.敏感度(Susceptibility, 设备或系统受电磁干扰而被中断或破坏的趋势的估量。它是抗干扰性不足引起的。

5.抗干扰性(Immunity, 设备或系统在保持预先设定的运行等级时抵抗电磁干扰能力的估量。

6.静电放电(ESD,有着不同静电电压的物体在靠近或直接接触时引发的静电荷转移。这个现象可视为可能导致敏感设备被破坏或功能受损的高电压脉冲。尽管闪电也是高电压脉冲,但术语静电放电ESD一般指安培数比较小的,特别是人为引起的事件。为了讨论方便,闪电也被包含在静电放电的种类中,因为尽管他们的量级不同,它们的防护措施却非常相似。

7.抗辐射干扰性(Radiated Immunity,产品抵抗来自自由空间电磁能的相对能力。

8.抗传导干扰性(Conducted Immunity,产品抵抗来自外部电缆、输电线和I/O连接器的电磁能量的相对能力。

9.密封(Containment, 即通过将产品用金属封套屏蔽(如法拉第笼或高斯结构),或者用一个涂有射频导电漆的塑料外壳屏蔽,从而阻止射频能量漏出封壳的处理方法。反过来,我们也可以说密封就是阻止射频能量进入封壳的过程。

10.抑制(Suppression),不依靠其它方法,如金属外壳或底盘而减少或消除存在的射频能量的过程。抑制也可以包含屏蔽和过滤。

点击此处查看原文 >>

系统分类: PCB   |    用户分类:    |    来源: 整理

评论(0) | 阅读(306)
总共 , 当前 /,2345下一页