摘要: 编译器会单独变异每一个模块源文件(.c文件),并一一为之生成一个唯一的目标文件。这一编译过程是与外界完全隔离的——即便模块源文件中通过“#include”方法包含了别的模块接口描述,并使用了相关的接口函数和接口变量,编译器在编译当前模块时也并不会去真正核实这些信息,可谓“两耳不闻窗外事,一心只‘译’圣贤书”。为了避免一个模块接口文件在同一个模块源文件中被重复包含,可以在头文件的开头处加入条件编译代码。 如果在头文件中放入了某个函数的代码实体,这一部分代码将随着接口描述文件一起被绑定到每一个包含了该头文件的的模块源文件中参与编译。在最后,编译器整合所有目标文件时,会发现存在多个同名的函数实... 阅读全文
posted @ 2013-11-24 21:32 Bingoo&Echo 阅读(271) 评论(0) 推荐(0) 编辑
摘要: ISP(在系统编程)是一种不依赖于单片机自身软件的程序下载方式,特点是不需要从电路板上取下单片机,通过某种方式使单片机进入ISP模式,开放编程接口,由其使用的计算机将新的程序代码写入到存储器内。我们平时用于AVR单片机的“串行编程”实际上就是ISP用法。 IAP(在应用编程)与ISP相比,IAP需要单片机自身软件的支持,单片机中的软件从外界获得新的程序代码,并将它们写入自己的程序存储器中。如果更新的程序部涉及当前运行的部分,系统甚至不需要停下当前的工作,就可以更新程序代码。 阅读全文
posted @ 2013-11-24 20:57 Bingoo&Echo 阅读(492) 评论(0) 推荐(0) 编辑
摘要: 使用中断方式进行串口接收时,读取串口缓冲区的语句应尽可能靠近串口接收完成中断服务函数的入口处。当数据被连续接收时,函数的总执行时间不能大于一个帧的接收时间,考虑中断返回后主程序的运行等因素,这个时间还应留有充分的余量! 串口的第一级缓冲,用于组装逐位传输的帧数据。数据从RXD端逐位输入。串口第二级缓冲,用于程序访问。当接收到完整的帧结构后,数据被搬移到第二级缓冲等待程序取出。与此同时,串口接收完成中断被申请。 串口模块的缓冲区只用1Byte,如果接收到的数据没有被及时取出,就可能被后面的数据冲掉。然而,繁忙的主控程序在此时可能刚好“无暇顾及”接收到的数据包,这就必须在串口模块和主控程序... 阅读全文
posted @ 2013-11-24 19:09 Bingoo&Echo 阅读(600) 评论(0) 推荐(0) 编辑
摘要: BOOT区的由来基于一个简单的道理,即单片机的程序是保存在FLASH中的,要运行程序就必须不停的访问FLASH存储器。对于一般的FLASH存储器,数据的写入需要一定的时间来完成,在数据写入完成之前,存储器中所有的数据都是不可读的,这就在运行旧程序和写入新程序之间造成了一个矛盾。 使用BOOT区是解决这个矛盾的方法之一,它将FLASH存储器从物理上分为两个独立的区域,对其中的一个区的数据写入不会影响到另一个区的数据读取操作。我们可以让单片机的程序在其中一个区(通常是BOOT区)运行,而运行着的程序代码写入另外一个区(通常为应用程序区)内。 AVR高档单片机ATmega系列中含有BOOT代... 阅读全文
posted @ 2013-11-24 16:04 Bingoo&Echo 阅读(3565) 评论(1) 推荐(0) 编辑