- 1、本文档共16页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
C及汇编延时程序课件
有个好帖,从精度考虑,它得研究结果是:?void?delay2(unsigned?char?i)???????{????????while(--i);?????????}?为最佳方法。分析:假设外挂12M(之后都是在这基础上讨论)我编译了下,传了些参数,并看了汇编代码,观察记录了下面的数据:delay2(0):延时518us?????????518-2*256=6delay2(1):延时7us(原帖写“5us”是错的,^_^)delay2(10):延时25us???????????25-20=5delay2(20):延时45us???????????45-40=5delay2(100):延时205us?????????205-200=5delay2(200):延时405us?????????405-400=5见上可得可调度为2us,而最大误差为6us。精度是很高了!但这个程序的最大延时是为518us?显然不能满足实际需要,因为很多时候需要延迟比较长的时间。那么,接下来讨论将t分配为两个字节,即uint型的时候,会出现什么情况。void?delay8(uint?t){?while(--t);}我编译了下,传了些参数,并看了汇编代码,观察记录了下面的数据:delay8(0):延时524551us?????????524551-8*65536=263delay8(1):延时15usdelay8(10):延时85us????????????85-80=5??delay8(100):延时806us??????????806-800=6delay8(1000):延时8009us????????8009-8000=9delay8(10000):延时80045us??????80045-8000=45delay8(65535):延时524542us?????524542-524280=262如果把这个程序的可调度看为8us,那么最大误差为263us,但这个延时程序还是不能满足要求的,因为延时最大为524.551ms。那么用ulong?t呢?一定很恐怖,不用看编译后的汇编代码了。。。那么如何得到比较小的可调度,可调范围大,并占用比较少得RAM呢?请看下面的程序:/*--------------------------------------------------------------------程序名称:50us?延时注意事项:基于1MIPS,AT89系列对应12M晶振,W77、W78系列对应3M晶振例子提示:调用delay_50us(20),得到1ms延时全局变量:无返回:????无--------------------------------------------------------------------*/void?delay_50us(uint?t){?uchar?j;???for(;t0;t--)?????for(j=19;j0;j--)????;}我编译了下,传了些参数,并看了汇编代码,观察记录了下面的数据:delay_50us(1):延时63us?????????????63-50=13delay_50us(10):延时513us???????????503-500=13??delay_50us(100):延时5013us?????????5013-5000=13delay_50us(1000):延时50022us???????50022-50000=22赫赫,延时50ms,误差仅仅22us,作为C语言已经是可以接受了。再说要求再精确的话,就算是用汇编也得改用定时器了。/*--------------------------------------------------------------------程序名称:50ms?延时注意事项:基于1MIPS,AT89系列对应12M晶振,W77、W78系列对应3M晶振例子提示:调用delay_50ms(20),得到1s延时全局变量:无返回:????无--------------------------------------------------------------------*/void?delay_50ms(uint?t){?uint?j;???/****可以在此加少许延时补偿,以祢补大数值传递时(如delay_50ms(1000))造成的误差,但付出的代价是造成传递小数值(delay_50ms(1))造成更大的误差。因为实际应用更多时候是传递小数值,所以补建议加补偿!****/?for
您可能关注的文档
- 手术室入室着装要求详解.ppt
- 手卫生医疗废物管理培训详解.ppt
- CRTSⅢ型板式无砟轨道自密实混凝土课件.doc
- CRTSI型双块式无砟轨道桥梁底座板施工技术交底1课件.doc
- 打枣课件1详解.ppt
- CRTS_I型板施工课件.ppt
- CS6.0操作教程1课件.ppt
- crm项目需求文档课件.doc
- CRESTRON培训文件课件.ppt
- 托盘天平的使用-朱小春详解.ppt
- 数据仓库:Redshift:Redshift与BI工具集成.docx
- 数据仓库:Redshift:数据仓库原理与设计.docx
- 数据仓库:Snowflake:数据仓库成本控制与Snowflake定价策略.docx
- 大数据基础:大数据概述:大数据处理框架MapReduce.docx
- 实时计算:GoogleDataflow服务架构解析.docx
- 分布式存储系统:HDFS与MapReduce集成教程.docx
- 实时计算:Azure Stream Analytics:数据流窗口与聚合操作.docx
- 实时计算:Kafka Streams:Kafka Streams架构与原理.docx
- 实时计算:Kafka Streams:Kafka Streams连接器开发与使用.docx
- 数据仓库:BigQuery:BigQuery数据分区与索引优化.docx
文档评论(0)