欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    程序调试黑宝书.pdf

    • 资源ID:74640521       资源大小:487.38KB        全文页数:8页
    • 资源格式: PDF        下载积分:15金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要15金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    程序调试黑宝书.pdf

    单片机程序调试黑宝书单片机程序调试黑宝书 一、一、前言:前言:1.1 你离高手有多远?首先我必须放下架子,因为本文的读者中很大一部分在不久的将来都会超越我。而且我也 100%不能自诩为高手,我不过是比本文的部分读者碰的钉子多些罢了。再退一步讲,即使你请了一位“高手”帮忙,如果他不是对你的具体系统十分了解,也只能给你一些原则上的建议罢了。结论:没有绝对的高手,高手是积累出来的,程序调试靠自己。1.2 谁应该读这篇文章?我们经常在论坛看到类似这些主题的帖子“I2C 程序怎么调 为什么我的程序不对?”,然后贴一堆代码上来;“为什么我这样写对,那样写不对”。如果你提过类似问题,或者不知道程序该怎么 Debug,就请读本文了。如果你刚开始学习单片机,可能觉得本文不着边际,那么请先死记这些结论,待到 3年后再从头读一遍,一定会和我发生共鸣。1.3 这篇文章针对哪种单片机或者哪种语言?这篇文章不涉及任何具体单片机型号和任何具体语言,你可以把他理解为凌驾在具体嵌入式技术之上的技术,就像哲学那样。1.4 这篇文章有版权吗?有的!但是我不准备出版,也不准备收费。因为我国 99.99%的高校毕业生(甚至读完研究生)都不曾看到这样专业化的程序调试教程,如果按大家为高等教育付出的几万元代价计算,这篇文章我起码会卖到 10 万/人,太天价了!这篇文章的目的是总结、提高,并在 21IC()上提供免费下载,你转载的时候只要保证本文的完整性,并注明出处就可以了。作为免费的等价条件,我也不承担读者因为本文造成的任何损失,请保持独立思考的习惯,并不要轻易使用本文中的代码,这些代码有的是伪语句,这些代码只是为了配合文字说明问题用。1.5 这篇文章所列举的事例和 BUG 真实吗?孙子云:兵不厌诈。这些例子不一定是我所在公司所遇到的,也有我经过组装修饰的,也得给我点隐私权嘛,鉴于本文的非商业化目的,我不对文中任何所提及的产品和技术负责。二二、该如何写程序该如何写程序:我们不怕得罪“Coder”,但是需要首先建立一个观点程序是电子技术里面最最简单的东西,因为程序的确定性比起硬件大得多。处理器的行为是认为设计的数字逻辑行为,不存在硬件上得容差问题。话说硬件设计需要很多数据库型的知识支撑,高频还需要黑色艺术细胞,学写程序除了背点语句,掌握一些基本技巧外加做好规划之外,不需要其他东西,会说话就会写程序会说话就会写程序!结论:程序的确定性比硬件大,不要害怕程序问题。2.1 什么是程序?“程序就是为了让处理器做某件事情而编写的有序汇编代码集合”。这里要注意两件事情,一是“做某件事情”,说明程序是为需求服务的,只有把需求搞清楚了,程序才能写得出来;二是“汇编代码集合”,所有计算机只认识一种语言机器码,也就是汇编所对应的机器语言,其他再华丽的高层语言(例如 C)最终都会成为汇编指令供机器执行,只是这个过程被编译器(例如 C 编译器)自动执行罢了。从这个角度来说,无论你掌握了多少种语言,例如 C、C+、汇编,也无论你可以在计算机二级 C 语言考试得多高分,都不等于你会写程序。结论:写程序,最重要的不是学会某种语言,而是会分析问题并提出解决问题的方法。2.2 顺序程序 如果当一个程序编写好后,所有语句被执行的先后顺序已经确定下来,这就是一个顺序程序。这种程序通常有如下特征:1)不使用中断系统(当然也就包括了不使用操作系统)2)不与操作者发生交互,或者在交互时,死等操作者指令 顺序程序可以用流程图非常明确地描述出来,例如非常经典的“如何把大象放进冰箱”问题,可以用右边的流程图【1】表达 虽然把大象放进冰箱只是一个笑话,但是说明了这个过程是由 3个动作组成的,并且这 3 个动作之间的顺序是不可颠倒的。任何初学者,只要能够理解“如何把大象放进冰箱”的奥妙,就能开始写程序了!作为一个特例,在程序中有等待用户操作环节的,只要在等待时不进行其他操作,同样也是顺序程序。2.3 含有中断的程序 打开冰箱门 把大象放进去 关上冰箱门 图【1】如果一个程序使用了中断,无论这个中断是用硬件中断(例如外中断 INT,串口接收中断等)直接操作,还是通过定时器切换的操作系统,都统称为含有中断的程序。这种程序的特点是:1)含有多个并行运行的代码(例如主循环和中断服务程序)2)这些并行代码间运行的先后顺序错综复杂,我们继续用“如何把大象放进冰箱”问题,来描述。金黄色部分流程线描述了在放大象的过程中接电话的“中断”。一旦程序加入了中断的环节,就会变得复杂起来,因为接电话这个事情可能发生在任何时候打电话的人不可能知道你在放大象嘛。另外,加入了中断环节的程序可能出现很多意想不到的事情,比如接电话期间,大象可能跑掉,或者冰箱门被加上了“不允许打开超过 1 分钟”的限制条件。对于复杂的中断,还可能存在着“接到电话,要求把大象红烧吃了”的情况,这样接完电话以后就没有大象可放了,这就是中断和操作系统中经常遇到的“临界资源”问题。结论:含有中断的程序较为复杂,需要编写者清楚同一时刻,我在做什么,其他人在做什么,用“并发”的方式思考问题,才能写好。2.4 程序模块化 首先说明,程序模块化是为了提高编程效率,扩大编程者对程序的掌握能力,便于程序维护而产生的,对计算机本身而言,程序是没有工整和杂乱的区别的。程序模块化的基本任务就是将复杂的设计任务划分为若干个功能明确,出入口简单的功能块。结论:程序模块化是为了编写而不是为了运行,模块化和函数是两个不同的概念,函数是为了将需要多次使用的代码统一编写,以便减少程序代码量,便于维护;模块化是指将复杂的程序功能化整为零而成的功能块,一个模块可能由多个函数组成,也可能就是一个函数,还有可能只是一段紧密相连的代码块。我们继续用大象的例子来示范,这里的 3 个动作都可以看成模块。假设我们由一个机器人来做这件事,机器人不能理解“打开冰箱门”、“把大象放进去”、“关上冰箱门”这 3 个步骤,那么就要用更基础的语言来为机器人编程。【模块打开冰箱门】1.抬起右手,移动到 冰箱门把中心右侧 1cm 处 2.弯曲右手手指,勾住冰箱门 打开冰箱门 把大象放进去 关上冰箱门 图【2】接电话 3.以 2kg 的力量向后拉 4.完成 当然,站在不同的角度来看,模块的定义可能将发生变化。比如任务整体扩大到“红烧大象”的级别,“买大象”、“把大象放进冰箱”、“把大象取出冰箱”和“烹饪大象”将成为模块。在很多时候,模块的划分仁者见仁,但是总的原则要求是功能内聚接口简洁,如果某种划分方式使得模块间到处都是接口,那么这个划分肯定是不好的。结论:好的模块化设计,模块间的接口简单明了。总的来说,好看好改的程序就是好程序。2.5 程序编写 我们来看一个 21ICBBS 上的实例:#include sbit latch1=P21;sbit latch2=P22;void delay(unsigned int t);unsigned char weima8=0 xfe,0 xfd,0 xfb,0 xf7,0 xef,0 xdf,0 xbf,0 x7f;unsigned char duanma10=0 x3f,0 x06,0 x5b,0 x4f,0 x66,0 x6d,0 x7d,0 x07,0 x7f,0 x6f;unsigned char LED=0 xcf,0 xf3,0 xfc,0 xf3;unsigned char tempdata10;void delay(unsigned int t);void display(unsigned char firstbite,unsigned char num);main(void)unsigned int m=30,n,i=0;P1=0 xcf;TMOD=0 x10;TH1=0 x3c;TL1=0 xb0;TR1=1;while(1)if(TF1=1)/等待定时器溢出中断标志 TF1=0;n+;/软件定时器 TH1=0 x3c;/重载定时器 TL1=0 xb0;if(n=20)n=0;if(m0)m-;if(m=0)i+;P1=LEDi;if(i=3)i=0;m=30;/End Of if(n=20)/End Of if(TF1=1)tempdata0=duanmam/10;tempdata1=duanmam%10;display(3,2);/End Of While(1)void delay(unsigned int t)while(t-);void display(unsigned char firstbite,unsigned char num)unsigned int i;for(i=0;inum;i+)P0=0;latch2=1;latch2=0;P0=weimai+firstbite;latch1=1;latch1=0;P0=tempdatai;latch2=1;latch2=0;delay(200);这个求助帖的原文是“这个程序的定时不准 我本来定的间隔是 1s 结果运行时是 1.04s左右,通过改初值也无法精确到一秒,总会多或少 0.0 几秒,请高手给看看是怎么回事?晶振是 12MHz 的 谢谢”很明显这是一个初学者写出来的程序。请注意,程序里的注释是我加上去的,因为程序是在太乱了,我用 UE 才排出现在大家看到的缩进。抛开程序里的其他设计问题不说,仅讨论楼主的问题为何定时不准,老实说我也不知道!因为我根本就不会把程序写到这个程度再来调试!很明显这个程序由 3 个模块组成基础定时模块(由 Timer 实现)、软件定时模块(由 m 和 n 组成的计数器实现)、显示模块(由函数 display 实现)。定时准确的核心是基础定时模块的溢出频率准确,所以在编写程序的时候先要对其进行测试。例如基础定时模块的设计中断周期是 1mS,我会在程序写到这个程度的时候停下来:_isr_timer_ovf()timer_reload();P0=0 x01;/测试代码 main()init_device();/Init Timer,IO and Interrupt while(1);假设设计的定时器溢出周期是 T,这段代码将在端口 P0.0 上产生一个以 2T 为周期的方波,用示波器或者频率计对这个方波进行测量,就可以知道基础定时器模块工作是否正常。接下来再编写软件定时模块。unsigned int timer;_isr_timer_ovf()timer_reload();timer-;if(timer=0)timer=1000;P0=0 x01;/测试代码 main()init_device();/Init Timer,IO and Interrupt timer=1000;while(1);在这一步,我们再一次用 P0.0 上的方波对软件定时器产生的 1S 周期定时进行检验,最后我们加入显示部分。unsigned int timer;_isr_timer_ovf()timer_reload();timer-;if(timer=0)timer=1000;display(timer);main()init_device();/Init Timer,IO and Interrupt timer=1000;while(1);如果这样写程序,即使有设计失误导致定时不准,在编写显示程序前已经被发现了。与 哲学的观点相同,事物是相互联系的,一个程序中包含的所有代码间都将相互关联,由于设计不当,显示程序可能侵占软件定时器所使用的内存空间,造成定时不准确。只有将这些代码从程序中去掉,才能彻底洗掉他们的嫌疑,使编写者集中精力调试要调试的模块。结论:编写程序的好习惯是分模块编写,边写边测试,在通过测试的模块基础上编写下一个模块,可以减少程序出现问题的可能性,快速排查与问题相关的模块并定位到程序语句。对例子程序另外一个需要注意的地方是作者完全没有写注释。注释是给人看的,编译器(IDE 环境,例如 Keil、ICC AVR 等)和目标 CPU(运行该程序的单片机)是完全不看注释行的,但是注释行能够理清编写者的思路,也方便日后修改维护的人(90%的可能是编写者自己)结论:注释不是程序,但可以帮助编写者提高编写的正确性,也可以大大提高程序的可维护性。建议 C 语言程序注释到函数,一些重要的操作至少要注释;汇编语言程序,至少注释 70%的语句行,建议一行一注。未完待续,详询:http:/ S

    注意事项

    本文(程序调试黑宝书.pdf)为本站会员(qwe****56)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开