博文

progma 语法(2007-10-25 14:08:00)

摘要:progma 是一个C语言中的预处理指令,它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作。依据定义,编译指示是机器或操作系统专有的,且对于每个编译器都是不同的。
其格式一般为: #pragma Para
其中Para 为参数,下面来看一些常用的参数。
(1)message 参数。 Message 参数是我最喜欢的一个参数,它能够在编译信息输出窗
口中输出相应的信息,这对于源代码信息的控制是非常重要的。其使用方法为:
#Pragma message(“消息文本”)
当编译器遇到这条指令时就在编译输出窗口中将消息文本打印出来。
当我们在程序中定义了许多宏来控制源代码版本的时候,我们自己有可能都会忘记有没有正确的设置这些宏,此时我们可以用这条指令在编译的时候就进行检查。假设我们希望判断自己有没有在源代码的什么地方定义了_X86这个宏可以用下面的方法
#ifdef _X86
#Pragma message(“_X86 macro activated!”)
#endif
当我们定义了_X86这个宏以后,应用程序在编译时就会在编译输出窗口里显示“_
X86 macro activated!”。我们就不会因为不记得自己定义的一些特定的宏而抓耳挠腮了
。 (2)另一个使用得比较多的pragma参数是code_seg。格式如:
#pragma code_seg( ["section-name"[,"section-class"] ] )
它能够设置程序中函数代码存放的代码段,当我们开发驱动程序的时候就会使用到它。 (3)#pragma once (比较常用)
只要在头文件的最开始加入这条指令就能够保证头文件被编译一次,这条指令实际上在VC6中就已经有了,但是考虑到兼容性并没有太多的使用它。 (4)#pragma hdrstop表示预编译头文件到此为止,后面的头文件不进行预编译。BCB可以预编译头文件以加快链接的速度,但如果所有头文件都进行预编译又可能占太多磁盘空间,所以使用这个选项排除一些头文件。
有时单元之间有依赖关系,比如单元A依赖单元B,所以单元B要先于单元A编译。你可以用#pragma startup指定编译优先级,如果使用了#pragma pack......

阅读全文(3347) | 评论:1

如何优化C语言代码(2007-10-03 13:59:00)

摘要: 如何优化C语言代码(程序员必读)

1、选择合适的算法和数据结构
应该熟悉算法语言,知道各种算法的优缺点,具体资料请参见相应的参考资料,有
很多计算机书籍上都有介绍。将比较慢的顺序查找法用较快的二分查找或乱序查找
法代替,插入排序或冒泡排序法用快速排序、合并排序或根排序代替,都可以大大
提高程序执行的效率。.选择一种合适的数据结构也很重要,比如你在一堆随机存
放的数中使用了大量的插入和删除指令,那使用链表要快得多。
数组与指针语句具有十分密码的关系,一般来说,指针比较灵活简洁,而数组则比
较直观,容易理解。对于大部分的编译器,使用指针比使用数组生成的代码更短,
执行效率更高。但是在Keil中则相反,使用数组比使用的指针生成的代码更短。。


3、使用尽量小的数据类型
能够使用字符型(char)定义的变量,就不要使用整型(int)变量来定义;能够使用
整型变量定义的变量就不要用长整型(long int),能不使用浮点型(float)变量就
不要使用浮点型变量。当然,在定义变量后不要超过变量的作用范围,如果超过变
量的范围赋值,C编译器并不报错,但程序运行结果却错了,而且这样的错误很难
发现。
在ICCAVR中,可以在Options中设定使用printf参数,尽量使用基本型参数(%c、
%d、%x、%X、%u和%s格式说明符),少用长整型参数(%ld、%lu、%lx和%lX格式说明
符),至于浮点型的参数(%f)则尽量不要使用,其它C编译器也一样。在其它条件不
变的情况下,使用%f参数,会使生成的代码的数量增加很多,执行速度降低。

4、使用自加、自减指令
通常使用自加、自减指令和复合赋值表达式(如a-=1及a+=1等)都能够生成高质量的
程序代码,编译器通常都能够生成inc和dec之类的指令,而使用a=a+1或a=a-1之类
的指令,有很多C编译器都会生成二到三个字节的指令。在AVR单片适用的ICCAVR、
GCCAVR、IAR等C编译器以上几种书写方式生成的代码是一样的,也能够生成高质量
的i......

阅读全文(3124) | 评论:0

51单片机扩展中断的简便方法(2006-06-23 00:43:00)

摘要:51单片机扩展中断的简便方法 MCS—51系列单片机内部只有两个外部中断源输入端,当外部中断源多于两个时,就必须进行扩展,下面介绍两种简单的扩展方法:
  一、采用硬件请求和软件查询的方法:
这种方法是:把各个中断源通过硬件“或非”门引入到单片机外部中断源输入端(INT0或INT1),同时再把外部中断源送到单片机的某个输入输出端口,这样当外部中断时,通过“或非”门引起单片机中断,在中断服务程序中再通过软件查询,进而转相应的中断服务程序。显然,这种方法的中断优先级取决于软件查询的次序。其硬件连接和软件编程如下:
          

  Void zhongduan (void) interrupt 0 using 3 //中断函数

EX0=0;//关中断
If(P0_0=1) { *****}//中断查询
If(P0_1=1) { *****}//中断查询
If(P0_2=1) { *****}//中断查询
EX0=1;开中断
}

  二、用定时器/计数器作外部中断
单片机的定时器/计数器是一个加一计数器,每当计数输入端有一个“1—0”的负跳变时,计数器加一,当加一计数器溢出时,就向CPU发出中断,利用这个特性来扩展中断的方法是:首先把定时器/计数器设置成计数方式,并预置满值,把外部中断源输入到P3口第4引脚或第5引脚(计数器输入端),这样就可以利用定时器/计数器作为单片机外部中断了。注意这种方法的中断服务的入口地址应在000BH或001BH。 http://www.zwmcu.com/News/2005,8/Article_375.htm
......

阅读全文(5901) | 评论:1

内存的了解(2006-06-18 01:04:00)

摘要:基本知识
  ●内存
  内存就是存储程序以及数据的地方,比如当我们在使用WPS处理文稿时,当你在键盘上敲入字符时,它就被存入内存中,当你选择存盘时,内存中的数据才会被存入硬(磁)盘。在进一步理解它之前,还应认识一下它的物理概念。
  ●只读存储器(ROM)
  ROM表示只读存储器(Read Only Memory),在制造ROM的时候,信息(数据或程序)就被存入并永久保存。这些信息只能读出,一般不能写入,即使机器掉电,这些数据也不会丢失。ROM一般用于存放计算机的基本程序和数据,如BIOS ROM。其物理外形一般是双列直插式(DIP)的集成块。
  ●随机存储器(RAM)
  随机存储器(Random Access Memory)表示既可以从中读取数据,也可以写入数据。当机器电源关闭时,存于其中的数据就会丢失。我们通常购买或升级的内存条就是用作电脑的内存,内存条(SIMM)就是将RAM集成块集中在一起的一小块电路板,它插在计算机中的内存插槽上,以减少RAM集成块占用的空间。目前市场上常见的内存条有4M/条、8M/条、16M/条等。
  ●高速缓冲存储器(Cache)
  Cache也是我们经常遇到的概念,它位于CPU与内存之间,是一个读写速度比内存更快的存储器。当CPU向内存中写入或读出数据时,这个数据也被存储进高速缓冲存储器中。当CPU再次需要这些数据时,CPU就从高速缓冲存储器读取数据,而不是访问较慢的内存,当然,如需要的数据在Cache中没有,CPU会再去读取内存中的数据。
  当你理解了上述概念后,也许你会问,内存就是内存,为什么又会出现各种内存名词,这到底又是怎么回事呢?
  在回答这个问题之前,我们再来看看下面这一段。

  物理存储器和地址空间
  物理存储器和存储地址空间是两个不同的概念。但是由于这两者有十分密切的关系,而且两者都用B、KB、MB、GB来度量其容量大小,因此容易产生认识上的混淆。初学者弄清这两个不同的概念,有助于进一步认识内存储器和用好内存储器。
  物理存储器是指实际存在的具体存储器芯片。如主板上装插的内存条和装载有系统的BIOS的ROM芯片,显示卡上的显示RAM芯片和装载显示BIOS的ROM芯片,以及各种适配卡上的RA......

阅读全文(3711) | 评论:0

AT89S51不稳定的讨论 (2006-05-13 12:20:00)

摘要:AT89S51不稳定的讨论   S51晶体电路出现这种问题和其自身功耗关联很大,PHILP比S51在这点上强的原因是因为它的功耗较大的缘故,你可以找一块扳子,装上S51和P89C51UB并且烧一样的程序(代码基本兼容,如有小的不同,可做适当修改),测试一下整机功耗你就会发现,PHILP功耗远大于S51,所以S51晶体电路很容易被干扰停震,解决的办法无非是做好电路滤波,晶体电路部分加大面积的铺铜地层等等,但即使这样,任何MCU,如果你直接用金属体甚至是手等导电体接触的话,即使未形成电流环路,但因介入电容的影响,也都完全可能停震,如果用数字示波器测量需要把探头打到高阻状态,用万用表测量则要用数字表,模拟表阻抗一般都不够,引起停震纯属正常,PHILP、WINBOND、PIC……都有这样的问题,非一家之过。
另在此总结以下89C51的缺点:
1:在变化的磁场中其工作稳定性较差,
2:在脉冲群上效果也远不如PIC、PHILP等,
3:对电源干扰也比较敏感。
4:89C51无WDT,S51的WDT属于半软半硬性质,软件可关断的方式依我看来属于弊大于利,不知为何ATMEL会用这样方式
5:封装普遍比较大,不适合于小尺寸产品的设计
6:管脚输入输出电流过小使很多应用需要外接芯片才能完成。
7:运行速度偏慢,在很多应用中受到很大的限制。
8:无内部A/D模块,也须外接芯片
9:复位电路的工作方式不好,在干扰中容易复位大部分是由其引起的。
10:无内部电源检测模块,需外挂电源检测芯片。
从你的发言中看来,你对可靠性要求其实很一般,如果使用S51,并加适当的加强措施也完全能达到你的要求,EMC/EMI并非洪水猛畜,不必恐惧之,只要精心设计,肯定能做出满足使用要求的产品的……
......

阅读全文(4304) | 评论:0

CDMA、GPRS、GSM解释 (2006-05-13 12:10:00)

摘要:CDMA、GPRS、GSM解释         GPRS(General Packet Radio Service)的中文是通用分组无线业务,是在现有的GSM系统上发展出来的一种新的分组数据承载业务。GPRS与GSM系统最根本的区别是,GSM是一种电路交换系统,而GPRS是一种分组交换系统。GPRS特别适用于间断的、突发性的或频繁的、少量的数据传输,也适用于偶尔的大数据量传输。我们可以将GPRS理解为GSM的一个更高层次。    WAP(Wireless Application Protocol)的中文是无线应用协议,它与GPRS属于不同的范畴,它的目的是将互联网的丰富信息及先进的业务引入到移动电话等无线终端之中。打个比喻,GPRS和GSM都是马路,而WAP是在马路上的汽车。中国移动开通GPRS之后,WAP就行驶在GSM和GPRS两条马路上,而行驶在GPRS的马路上可以提高数据传输速度。因此,现有WAP上的内容一样可以通过GPRS进行浏览和应用。    CDMA是与GSM并列的移动通信技术,是码分多址数字无线技术的英文缩写,它拥有频率利用率较高、手机功耗低等优点。与GSM相同,CDMA也有2代、2.5代和3代技术。中国联通将于今年下半年推出的CDMA属于2.5代技术。   http://www.study-kit.com/bbs/showbbs.asp?bd=31&id=292&totable=1......

阅读全文(4285) | 评论:0

美国国家半导体开关稳压调整器技术问答精选(2006-05-13 12:03:00)

摘要:美国国家半导体开关稳压调整器技术问答精选
问:在待机状态,能耗的降低会不会将系统稳定性降低? 
答:待机时有两种方法:1.高电压绕组降低到MCU低电压电源,系统进入突发模式,输出电压有更多波纹,但依然在反馈回路;至于某些临界的应用,线性调整器如7805适合这方面的应用,例如NCP1209或MC44608。2.对于NCP1200,它的输出波纹会很小,如2.5%,直接驱动MCU会很安全。我们确信,在待机时,上面的任一种方法依然在控制回路。 问:一个系统要降低功耗,一般应该从哪几方面来入手解决呢? 答:从系统的观点来看,不仅要谈到待机,效率是第一位的。我们首先要做的是要保证系统效率尽可能的高。为了达到这点,我们需要确定功率在什么地方损失掉,即是说,流过功率MOSFET的电流产生热量,场效应晶体管(FET)的Rds(on)决定了此时的损耗。类似这种考卷需要针对系统中每一个功率元件来进行。 问:DVD可以提供何种芯片做到0.4W?我们的输出功率260瓦。 答:NCP1200适合用在20-30WDVD播放机,达到0.4W。你的应用不仅仅是DVD播放机,应该是DVD+AMP(放大器)。我们有NCP1203(140W)和其它器件一起用的解决方案。请电邮到:manson.chan@onsemi.com,以便更清楚你的想法。 问:有些解决方案辅助绕组供电时需加稳压管,这样是不是过压保护功能实现不了? 答:齐纳二极管加接在Vcc引脚,保护IC免受损害。如果需要过压保护,要增加更多的外接元件。请参阅我们的应用手册AND8069。 问:采用安森美芯片的产品,在电磁兼容性方面应该做什么样的处理? 答:从根本上来说,它应该根据通常的EMC来考虑整个电路,如PCB的布局,变压器的结构,线路输入滤波器,开关电源(SMPS)的工作模式,屏蔽等。我们的一些芯片能安全地工作在关键的部位,能消除许多EMC的问题。 问:目前IC芯片的功耗在逐步降低,供电电压已降至1.5V,而传统5V供电芯片也在大量使用,这样在进行系统设计时,电源设计就是一个很大的问题。一个系统中,不同的芯片需要不同的工作电压,由此造成系统设计复杂化,各芯片接口部分产生诸多不确定错误,比如3V在5V芯片中会误认为低电平,如果加转换器件,又增加成本,请问如何解决系统设计中的此类问题? 答:事实上,......

阅读全文(6635) | 评论:0

AVR定时器的要点介绍(2006-05-13 00:59:00)

摘要:AVR定时器的要点介绍
AVR定时器的要点介绍  (大部分摘自 M16中文手册,未能一一测试)   M16的T1 16位定时器一共有15种工作模式,其他2个8位定时器(T0/T2)相对简单,除了T2有异步工作模式用于RTC应用外
                       (可以利用溢出中断和比较匹配中断作定时功能)
  分5种工作类型
  1  普通模式 WGM1=0
    跟51的普通模式差不多,有TOV1溢出中断,发生于TOP时
    1 采用内部计数时钟     用于 ICP捕捉输入场合---测量脉宽/红外解码
        (捕捉输入功能可以工作在多种模式下,而不单单只是普通模式)
    2 采用外部计数脉冲输入  用于 计数,测频
    其他的应用,采用其他模式更为方便,不需要像51般费神
    
  2 CTC模式 [比较匹配时清零定时器模式] WGM1=4,12
     跟51的自动重载模式差不多
     1 用于输出50%占空比的方波信号
     2 用于产生准确的连续定时信号
     WGM1=4时, 最大值由OCR1A设定,TOP时产生OCF1A比较匹配中断
     WGM1=12时,最大值由ICF1设定, TO......

阅读全文(6558) | 评论:2