博 文
1.什么是FIFO?FIFO是英文First In First Out 的缩写,是一种先进先出的数据缓存器,他与普通存储器的区别是没有外部读写地址线,这样使用起来非常简单,但缺点就是只能顺序写入数据,顺序的读出数据,其数据地址由内部读写指针自动加1完成,不能像普通存储器那样可以由地址线决定读取或写入某个指定的地址。2.什么情况下用FIFO?FIFO 一般用于不同时钟域之间的数据传输,比如FIFO的一端时AD数据采集,另一端时计算机的PCI总线,假设其AD采集的速率为16位 100K SPS,那么每秒的数据量为100K×16bit=1.6Mbps,而PCI总线的速度为33MHz,总线宽度32bit,其最大传输速率为 1056Mbps,在两个不同的时钟域间就可以采用FIFO来作为数据缓冲。另外对于不同宽度的数据接口也可以用FIFO,例如单片机位8位数据输出,而 DSP可能是16位数据输入,在单片机与DSP连接时就可以使用FIFO来达到数据匹配的目的。3.FIFO的一些重要参数FIFO的宽度:也就是英文资料里常看到的THE WIDTH,它只的是FIFO一次读写操作的数据位,就像MCU有8位和16位,ARM 32位等等,FIFO的宽度在单片成品IC中是固定的,也有可选择的,如果用FPGA自己实现一个FIFO,其数据位,也就是宽度是可以自己定义的。FIFO的深度:THE DEEPTH,它指的是FIFO可以存储多少个N位的数据(如果宽度为N)。如一个8位的FIFO,若深度为8,它可以存储8个8位的数据,深度为12 ,就可以存储12个8位的数据,FIFO的深度可大可小,个人认为FIFO深度的计算并无一个固定的公式。在FIFO实际工作中,其数据的满/空标志可以控制数据的继续写入或读出。在一个...
在调试控制台程序一般都会遇到成功启动之后就会一闪而过,没法看清楚打印的结果。一般有以下两种方法来解决这个问题:
1.在main函数结束之前 增加getch()或者_getch(),一直等到键盘输入再结束。需要的头文件:conio.h
2.在main函数结束之前 增加system(''pause"),使得系统暂停,需要的头文件:stdlib.h
2006年10月25日 星期三 14:15
(一)简单的函数指针的应用。//形式1:返回类型(*函数名)(参数表) char (*pFun)(int); char glFun(int a){ return;} void main() { pFun = glFun; (*pFun)(2); } 第一行定义了一个指针变量pFun。首先我们根据前面提到的“形式1”认识到它是一个指向某种函数的指针,这种函数参数是一个int型,返回值是char类型。只有第一句我们还无法使用这个指针,因为我们还未对它进行赋值。 第二行定义了一个函数glFun()。该函数正好是一个以int为参数返回char的函数。我们要从指针的层次上理解函数——函数的函数名实际上就是一个指针,函数名指向该函数的代码在内存中的首地址。 然后就是可爱的main()函数了,它的第一句您应该看得懂了——它将函数glFun的地址赋值给变量pFun。main()函数的第二句中“*pFun”显然是取pFun所指向地址的内容,当然也就是取出了函数glFun()的内容,然后给定参数为2。(二)使用typedef更直观更方便。 //形式2:typedef 返回类型(*新类型)(参数表)typedef char (*PTRFUN)(int); PTRFUN pFun; char glFun(int a){ return;} void main() { pFun = glFun; (*pFun)(2); } typedef的功能是定义新的类型。第一句就是定义了一种PTRFUN的类型,并定义这种类型为指向某...
typedef
typedef用法小结- -这两天在看程序的时候,发现很多地方都用到typedef,在结构体定义,还有一些数组等地方都大量的用到.但是有些地方还不是很清楚,今天下午,就想好好研究一下.上网搜了一下,有不少资料.归纳一下:来源一:Using typedef to Curb Miscreant CodeTypedef 声明有助于创建平台无关类型,甚至能隐藏复杂和难以理解的语法。不管怎样,使用 typedef 能为代码带来意想不到的好处,通过本文你可以学习用 typedef 避免缺欠,从而使代码更健壮。typedef 声明,简称 typedef,为现有类型创建一个新的名字。比如人们常常使用 typedef 来编写更美观和可读的代码。所谓美观,意指 typedef 能隐藏笨拙的语法构造以及平台相关的数据类型,从而增强可移植性和以及未来的可维护性。本文下面将竭尽全力来揭示 typedef 强大功能以及如何避免一些常见的陷阱。如何创建平台无关的数据类型,隐藏笨拙且难以理解的语法?使用 typedefs 为现有类型创建同义字。定义易于记忆的类型名 typedef 使用最多的地方是创建易于记忆的类型名,用它来归档程序员的意图。类型出现在所声明的变量名字中,位于 ''typedef'' 关键字右边。例如:typedef int size; 此声明定义了一个 int 的同义字,名字为 size。注意 typedef 并不创建新的类型。它仅仅为现有类型添加一个同义字。你可以在任何需要 int 的上下文中使用 size:void measure(size * psz);size array[4];size len = file.getlength();std::vector vs; typedef 还可以掩饰符合类型,如指针和数组。例如,你不用象下面这...
方法一:调用CWinApp类的成员函数SetDialogBkColor来实现。---- 其中函数的第一个参数指定了背景颜色,第二个参数指定了文本颜色。下面的例子是将应用程序对话 框设置为蓝色背景和红色文本,步骤如下:---- ① 新建一个基于Dialog的MFC AppWizard应用程序ExampleDlg。---- ② 在CExampleDlgApp ::InitInstance()中添加如下代码:BOOL CExampleDlgApp: : InitInstance ( ){… CExampleDlgDlg dlg; m_pMainWnd = &dlg;//先于DoModal()调用,将对话框设置为蓝色背景、红色文本 SetDialogBkColor(RGB(0,0,255),RGB(255,0,0)); int nResponse = dlg.DoModal();…}---- 编译并运行,此时对话框的背景色和文本色已发生了改变。值得注意的是:在调用DoModal()之前必须 先调用SetDialogBkColor,且此方法是将改变应用程序中所有的对话框颜色,并不能针对某一个指定的对 话框。---- 方法二:重载OnPaint(),即WM_PAINT消息。有关代码如下(以上例工程为准):void CExampleDlgDlg::OnPaint(){ if (IsIconic())… else { CRect rect; CPaintDC dc(this); ...
概述 在很多情况下,尤其是读别人所写代码的时候,对C语言声明的理解能力变得非常重要,而C语言本身的凝练简约也使得C语言的声明常常会令人感到非常困惑,因此,在这里我用一篇的内容来集中阐述一下这个问题。 问题:声明与函数 有一段程序存储在起始地址为0的一段内存上,如果我们想要调用这段程序,请问该如何去做? 答案 答案是(*(void (*)( ) )0)( )。看起来确实令人头大,那好,让我们知难而上,从两个不同的途径来详细分析这个问题。 答案分析:从尾到头 首先,最基本的函数声明:void function (paramList); 最基本的函数调用:function(paramList); 鉴于问题中的函数没有参数,函数调用可简化为 function(); 其次,根据问题描述,可以知道0是这个函数的入口地址,也就是说,0是一个函数的指针。使用函数指针的函数声明形式是:void (*pFunction)(),相应的调用形式是: (*pFunction)(),则问题中的函数调用可以写作:(*0)( )。 第三,大家知道,函数指针变量不能是一个常数,因此上式中的0必须要被转化为函数指针。 我们先来研究一下,对于使用函数指针的函数:比如void (*pFunction)( ),函数指针变量的原型是什么? 这个问题很简单,pFunction函数指针原型是( void (*)( ) ),即去掉变量名,清晰起见,整个加上()号。 所以将0强制转换为一个返回值为void,参数为空的函数指针如下:( void (*)( ) )。 OK,结合2)和3)的分析,结果出来了,那就是:(*(void (*)( ) )0)( ) 。 答案分析:从头到尾理解答案 (void...
函数在内存中有一个物理位置,而这个位置是可以赋给一个指针的。一零点函数的地址就是该函数的入口点。因此,函数指针可被用来调用一个函数。函数的地址是用不带任何括号或参数的函数名来得到的。(这很类似于数组地址的得到方法,即,在只有数组名而无下标是就得到数组地址。)
怎样说明一个函数指针变量呢? 为了说明一个变量 fn_pointer 的类型是"返回值为 int 的函数指针", 你可以使用下面的说明语句:int (*fn_pointer) ();为了让编译器能正确地解释这句语句, *fn_pointer 必须用括号围起来。若漏了这对括号, 则:int *fn_pointer ();的意思完全不同了。fn_pointer 将是一个函数名, 其返回值为 int 类型的指针。
函数在内存中有一个物理位置,而这个位置是可以赋给一个指针的。一零点函数的地址就是该函数的入口点。因此,函数指针可被用来调用一个函数。函数的地址是用不带任何括号或参数的函数名来得到的。(这很类似于数组地址的得到方法,即,在只有数组名而无下标是就得到数组地址。)
怎样说明一个函数指针变量呢? 为了说明一个变量 fn_pointer 的类型是"返回值为 int 的函数指针", 你可以使用下面的说明语句:int (*fn_pointer) ();为了让编译器能正确地解释这句语句, *fn_pointer 必须用括号围起来。若漏了这对括号, 则:int *fn_pointer ();的意思完全不同了。fn_pointer 将是一个函数名, 其返回值为 int 类型的指针。
逻辑电平之种种种种
逻辑电平简介逻辑电平有:TTL、CMOS、LVTTL、LVCMOS、ECL、PECL、LVDS、GTL、BTL、ETL、GTLP;RS232、RS422、RS485等。 图1-1:常用逻辑系列器件 TTL:Transistor-Transistor Logic CMOS:Complementary Metal Oxide Semicondutor LVTTL:Low Voltage TTL LVCMOS:Low Voltage CMOS ECL:Emitter Coupled Logic, PECL:Pseudo/Positive Emitter Coupled Logic LVDS:Low Voltage Differential Signaling GTL:Gunning Transceiver Logic BTL: Backplane Transceiver Logic ETL: enhanced transceiver logic GTLP:Gunning Transceiver Logic Plus TI的逻辑器件系列有:74、74HC、74AC、74LVC、74LVT等 S - Schottky Logic LS - Low-Power Schottky Logic CD4000 - CMOS Logic 4000 AS - Advanced Schottky Logic 74F - Fast Logic ALS - Advanced Low-Power Schottky Logic HC/HCT - High-Speed CMOS Logic BCT - BiCMOS Technology AC/ACT - Advanced CMOS Logic FCT - Fast CMOS Technology ABT - Advanced BiCMOS Technology LVT - Low-Voltage BiCMOS Technology LVC - Low Voltage CMOS Technology LV - Low-Voltage CBT - Crossbar Technology ALVC - Advanced Low-Voltage CMOS Technology AHC/AHCT - Advanced High-Speed CMOS CBTLV - Low-Voltage Crossbar Technology ALVT - Advanced Low-Voltage BiCMOS Technology AVC - Advanced Very-Low-Voltage CMOS Logic TTL器件和CMOS器件的逻辑电平:逻辑电平的一些概念要了解逻辑电...
一、手机发射功率的两个方面 手机发射功率在PHS、GSM、cdma2000 1x、wcdma等协议中,被设计得越来越复杂,它的重要性已不言而喻,哪手机发射功率是大些好哪,还是小些好哪?事实上单纯的说大些好或者小些好,都实在不是一个明智的回答,因为在设计手机功率时,要考虑以下两个方面: 1、在能保证正常通信情况下,手机发射功率越小越好 *、手机发射功率越小,手机的耗电量就越小,待机时间、通话时间越长; *、手机发射功率越小,对同系统别的手机的干扰越小,这不仅给同系统别的手机创造了好的无线环境,同时对于cdma2000 1x、wcdma来说,这就意味着小区容量越大; *、手机发射功率越小,对别的无线设备干扰越小,这就给别的无线设备创造了好的无线环境; 2、在有些情况下,为了能保证通信质量,手机发射功率希望能被调整的大些,再大些,再大些...... *、手机在小区的远端时,为了保证手机信号经过长距离传输到达基站后,手机信号仍能被正确解调,也就是手机发射功率要足够大,以克服信号经过长距离传输的衰减; *、手机被建筑物或其它遮挡,在无线阴影区内,手机发射功率也要足够大,以克服手机信号必须经过多次的反射、折射及长距离传输的衰减; *、手机在干扰比较大的情况下,如邻信道、同信道干扰,阻塞等等,手机发射功率也要足够大,以克服噪声的干扰。 综上所述,手机发射功率存在着两面性,一方面在能保证正常通信情况下,手机发射功率越小越好;另一方面,在有些情况下,为了能保证通信质量,手机发射功率必须要大一些,甚至要再大一些。这两方面看似矛盾,实为统一,准确表...
在typedef的使用中,最麻烦的是指向函数的指针,如果没有下面的函数,你知道下面这个表达式的定义以及如何使用它吗? int (*s_calc_func(char op))(int, int); 如果不知道,请看下面的程序,里面有比较详细的说明 // 定义四个函数int add(int, int);int sub(int, int);int mul(int, int);int div(int, int);// 定义指向这类函数的指针typedef int (*FP_CALC)(int, int); // 我先不介绍,大家能看懂下一行的内容吗?int (*s_calc_func(char op))(int, int); // 下一行的内容与上一行完全相同,// 定义一个函数calc_func,它根据操作字符 op 返回指向相应的计算函数的指针FP_CALC calc_func(char op); // 根据 op 返回相应的计算结果值int calc(int a, int b, char op); int add(int a, int b){ return a + b;}int sub(int a, int b){ return a - b;}int mul(int a, int b){ return a * b;}int div(int a, int b){ return b? a/b : -1;}// 这个函数的用途与下一个函数作业和调用方式的完全相同,// 参数为op,而不是最后的两个整形int (*s_calc_fun...