全文预览已结束
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
C语言里如何编写精确的微量延时广西民族大学物理与电子工程学院 白羽 2010-5-9众所周知,相比于其他编程语言,C语言在编写嵌入式编程中有着绝对的优势。但它总也有缺点的:它的时序性比较差,不容易编写精准的延时。而在编写嵌入系统驱动程序时,常常需要比较精确的软件延时,这使得C语言的“劣势”暴露了出来,一般都只能通过嵌入汇编的方式实现。例如,在1MHZ工作频率下需要延时10us,就需要嵌入10句“空操作”指令,显然在书写上比较难堪。本文提出一种简化书写的延时方案,使用带参数的宏构来造微小时间片,可以实现完全精确的软件延时,大大方便了驱动程序及软件模拟通信协议的编写。说明:以下皆为ICC AVR平台下的讨论,对AVR系列所有型号的单片机皆有效。至于其他平台,可据此方案自行修改和移值。该方案的实现方法其实很简单:首先定义N个宏,分别调用 1 N 个汇编“空操作”指令,如:#define NOP_1 asm(nop)/延时一个时钟周期#define NOP_2 NOP_1; asm(nop) /延时两个时钟周期#define NOP_3NOP_2; asm(nop) /延时三个时钟周期#define NOP_4 NOP_3; asm(nop) /延时四个时钟周期#define NOP_40 NOP_40; asm(nop)/延时40个时钟周期然后利用“#”操作符,实现带参数宏的延时:#define NOP(N) NOP_#N /延时 N个时钟周期操作符的作用是把两个部分的内容连成一个内容。就是说,NOP(3)展开后成为NOP_3,NOP(4)展开后成为NOP_4,等等。因此,定义上述宏之后,就可通过调用NOP(N)语句实现精确软件延时。例如:NOP(4); /延时4个时钟周期上述语句展开过程如下:NOP_3; asm(nop);NOP_2; asm(nop); asm(nop);NOP_1;asm(nop); asm(nop); asm(nop);asm(nop); asm(nop); asm(nop); asm(nop);正好延时4个时钟周期!不过,上面的宏还不够完善,如果试图使用下面的语句,程序将会出现漏洞:if(表达式) NOP(3);else NOP(4);这是因为NOP(N)宏展开之后,不是一个语句,而是变成N个语句。故必须用花括号括起来,程序才能运行正确。即应该改为:if(表达式) NOP(3);else NOP(4);如果把NOP(N)宏的定义改为:#define NOP(N) do NOP_#N ; while(0)则NOP(N)宏展开之后只形成一个语句,将不会出现上面的问题。但是要注意,“#”操作符只能按照原样把两边的内容连在一起。故NOP(N)的参数必须是具体的常量,即只能是数字,并且,与该数字相对应的宏NOP_N已必须已经定义。例如:“NOP(3+4);”语句展开之后,将将变成“NOP_3+4;”,出现语法错误;又如:“NOP(a);”语句展开之后,将将变成“NOP_a;”,而“NOP_a;”未定义。只有这样的语句才是正确的调用:NOP(20);/延时20个时钟周期将上述方案整理成一个头文件,以后就可以任意调用了。下面是整理好的头文件:注意:该文件不宜作长时间的延时。长时间的延时将会调用大量的“空操作”指令,占用大量的程序指令空间。这个问题将在V2.0版本中解决。NOP.H/* 单 位:广西民族大学物理与电子工程学院 文件名称:NOP.H 文件标识:_NOP_H_ 摘 要:精密延时头文件,可以精确延时40以内(包括40)的时钟周期 当前版本:V1.0 作 者:白 羽 完成日期:2010年5月9日 特别声明:您可以任意转载、复制本文件,但不能随便剔除本文件说明*/#ifndef _NOP_H_#define _NOP_H_#define NOP(N) do NOP_#N(); while(0)#define NOP_0()#define NOP_1() asm(nop)#define NOP_2() NOP_1();asm(nop)#define NOP_3() NOP_2();asm(nop)#define NOP_4() NOP_3();asm(nop)#define NOP_5() NOP_4();asm(nop)#define NOP_6() NOP_5();asm(nop)#define NOP_7() NOP_6();asm(nop)#define NOP_8() NOP_7();asm(nop)#define NOP_9() NOP_8();asm(nop)#define NOP_10() NOP_9();asm(nop)#define NOP_11() NOP_10();asm(nop)#define NOP_12() NOP_11();asm(nop)#define NOP_13() NOP_12();asm(nop)#define NOP_14() NOP_13();asm(nop)#define NOP_15() NOP_14();asm(nop)#define NOP_16() NOP_15();asm(nop)#define NOP_17() NOP_16();asm(nop)#define NOP_18() NOP_17();asm(nop)#define NOP_19() NOP_18();asm(nop)#define NOP_20() NOP_19();asm(nop)#define NOP_21() NOP_20();asm(nop)#define NOP_22() NOP_21();asm(nop)#define NOP_23() NOP_22();asm(nop)#define NOP_24() NOP_23();asm(nop)#define NOP_25() NOP_24();asm(nop)#define NOP_26() NOP_25();asm(nop)#define NOP_27() NOP_26();asm(nop)#define NOP_28() NOP_27();asm(nop)#define NOP_29() NOP_28();asm(nop)#define NOP_30() NOP_29();asm(nop)#define NOP_31() NOP_30();asm(nop)#define NOP_32() NOP_31();asm(nop)#define NOP_33() NOP_32();asm(nop)#define NOP_34() NOP_33();asm(nop)#define NOP_35() NOP_34();asm(nop)#define NOP_36() NOP_35();a
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 山东省无棣县鲁北高新技术开发区实验学校2025年生物高二上期末学业水平测试模拟试题含解析
- 沈阳工业大学工程学院《城市记忆与文化遗产保护》2024-2025学年第一学期期末试卷
- 2023年莱芜辅警协警招聘考试备考题库及一套完整答案详解
- 安徽省宿州市2025年生物高二第一学期期末监测试题含解析
- 生物七上期中试卷分析(3篇)
- 江西省抚州市临川区一中2025-2026学年数学高二上期末综合测试模拟试题含解析
- 2025年山东青岛胶州市高一生物第一学期期末预测试题含解析
- 2025-2026学年云南楚雄州南华县民中生物高一第一学期期末学业质量监测试题含解析
- 广东省湛江市第一中学2025-2026学年高二化学第一学期期末联考试题含解析
- 2025年江苏省苏州一中高二上数学期末检测模拟试题含解析
- 收养申请简易模板合集
- 药物分析教案设计
- 《影子的游戏》名师课件
- 在线学习平台的用户体验优化
- 《急救技能知识培训》课件
- 《往来账款管理》课件
- 小儿流行性感冒的护理措施
- 燕子来时阅读答案
- 1-中国建筑中建PPT模板
- 《科研诚信与学术规范》学习通课后章节答案期末考试题库2023年
- 国家开放大学《现代教育管理专题》平时作业1-5参考答案
评论
0/150
提交评论