首页 > 学习收获 > 嵌入式相关 > Master’s 2007 第一天学习心得
2007
10-31

Master’s 2007 第一天学习心得

第一天学习心得如下:

第一天的下午,两门课,一个是11125 MPLAB IDE的调试,一个是11038,I2C的编程。看起来都是很基础的课。呵呵

首先是11125,MPLAB IDE的调试使用,这个听起来好像很多人都会不屑一顾,认为自己都搞PIC好久了,MPLAB调试还有啥不会的。呵呵。我本来也是这么想,不过听听课还是有发现的。主要是ICD2调试方面。当然,这可能是我没有用过ICD2的缘故,也许ICD2高手还是会不屑一顾吧。呵呵。

好,闲话到此,接下来开始讨论学习心得。

首先说一下,ICD2之所以能够调试,原因是在广大PIC芯片里面都有一块BDM(Background Debug Module,后台调试模块),BDM平时是不工作的,但是接到调试器命令后,该模块就会开始动作, 并开始调试流程。由此也可以推断,BDM不能很大,所以其调试功能不会太强大。各位ICD2的用户也会发现吧,仅有一个断点的不爽。

那么,这里就要说一下BDM断点的原理:BDM会在每条指令读入时比较该指令的地址和断点地址,当发现一致时会发出一个NMI(不可屏蔽中断),从而引发一个中断。然后在该中断里面,BDM会在一个特定位置生成一些称之为DE(Debug Execution?忘了怎么拼了)的程序,这些程序负责接收上位机的指令,并进行调试活动。嗯。那么,这里就有一个问题:当BDM发现该指令是中断位置时,该指令已经进入MCU的流水线了,于是,该NMI将会在该指令完成后才能生效。也就是说,当中断时,暂停后读出的PC指针是指向下一条指令的。这一点在调试时很容易看出来。表现为断点暂停时表示PC的绿箭头指向的是下一条指令。这个现象称之为:skidding。实际上,若是在dsPIC或者PIC24F中,读出的PC是断点后的第二条指令。

于是,有个小问题,如果我们把断点设在一个条件跳转之类的指令位置,那么,断住之后,PC就会跳飞。表现为:停住之后表示PC指针绿箭头不知道跑哪里去了。解决方法就是:不要在这种指令处设断点(-_-b),或者,据说添加一些NOP可以解决这个问题。实际上也是,在演示时,BTFSS后面加了两个NOP,然后单步几次,程序就又跳出来到NOP上。这个大家可以参考一下。

另外,还有就是,调试器有个叫做“自动单步”的功能,当在自动单步时,不会出现skidding情况。因为自动单步,只是一个软件的单步的重复。而单步的过程,BDM比较地址的时机发生在load以前。嗯。

然后,BDM为PIC提供的断点数量是不一样的,这点大家也都知道。一般就是8位的有1个,18F系列可能有1或者3或者5个。等等。这里就有个问题,大家知道MPLAB有个STEP OVER功能,用它可以跳过一段子程序的运行,直接跳到下一步。实际上,该功能的实现是将断点临时分配给CALL语句的下一句,从而实现STEP OVER。于是,很明显的,当断点数目已经用完时,这个是不可实现的,那么,此时的STEP OVER就会转变为一系列的自动单步的组合。这就是问题。因为大家知道,单步很慢的。如果该子程序很长,那这个STEP OVER就会很耗时间。

还有一个耗时间的事情是暂停调试。这个的原因是:暂停时,上位机会通过DE更新当前监视的数据。比如WATCH窗口里面的数据。这个是需要时间的。所以如果WATCH里面的变量过多的话,更新是需要很多时间的。那么,变量最多的WATCH是什么呢?MPLAB里面有两个窗口叫做:SFR和GFR,用来显示所有的GFR和SFR。这个里面的大量数据,在暂停时都需要更新的,所以如果开着这两个窗口,那么,恭喜你,暂停后你需要等好久好久。请不要着急,去泡杯咖啡吧……不过顺便说一句:MC官方也是推荐使用WATCH不要用GFR和SFR窗口。

这个时候的读取SFR也是有问题的。有一些副作用。比如,如果暂停时,DE更新读取那个该死的叫INDF的SFR时,INDF会自动加一。每读一次都会加一。所以,请不要把INDF加入WATCH列表。当然,INDF的问题比较特殊,MPLAB会自动屏蔽掉,即使你把它加入WATCH,也会显示不可读。还有一些SFR,MPLAB也会屏蔽。不过总有一些SFR会有问题。比如RCREG这个USART的SFR。当使用ICD2读取时是不会得到正确结果的。所以,处理SFR时,建议将SFR读入GFR,然后查看GFR的值比较好。

嗯。以上就是一些需要注意的地方。另外就是一些新功能,比如高级断点。18F系列的那一个断点是一个可以数据匹配和通过次数匹配的断点。而18F扩展型的一些器件有三个这样的断点。而18F的J系列,更是BT到有看门狗中断、休眠中断和跑表中断。而dsPIC的断点则有AND型断点(必须两个条件都满足才能断点)和顺序型断点(必须满足一定顺序条件才能断点)。这还是很方便的。

然后就是MC新出的一个叫REAL ICE的玩意,很不错哦。功能极其强大,其核心是一颗FPGA。赞。。当然价格也一样强大——500刀。。。NND。。。

以上就是这门基础课的收获。MC将其标为难度3还是有道理的。嗯。。不过接下来的I2C部分就实在一般了。毕竟没有用过I2C。不过有点小收获。首先,I2C的双总线上需要加上拉电阻。因为I2C的的器件默认是开路输出。

于是就有个小问题:如果我们要用软件模拟I2C时,使用的是普通IO口,这个IO可不是开路输出。于是,当我们用普通IO试图输出一个高电平,而本来的总线上是低电平时,会出现问题,会导致总线复位和数据混乱。而且,该IO口也容易损坏。——嗯,没有自己用过,所以无法更细致的分析,用过的人请自行分析——所以,为了避免这个情况,在使用普通IO口模拟I2C时,若需要在总线上输出高电平,请将该IO口设为输入态,输入态时,IO口对外是高阻状态,由于总线上的上拉电阻,就会在该IO口同样产生一个高电平。嗯。呵呵

嗯。以上就是今天基本全部收获。唉唉,会计学院这边电视有机顶盒和VOB系统,我现在一边看着《转角遇到爱》一边写日志,都有点头脑不清楚了。呵呵。大家随意看看把~明天继续~~

最后编辑:
作者:龙天
这个作者貌似有点懒,什么都没有留下。

留下一个回复

你的email不会被公开。