编程系统通过BDM硬件命令WRITE_WORD发送1个字,需要调用5次字节发送程序。发送的5字节分别是1字节的命令操作码、2字节的内存地址、2字节的数据,同时硬件命令WRTE_WORD的完成还需要延迟150个编程调试器时钟周期。所以假如从编程调试器发送100 KB的数据到目标芯片内存,其所需要花费的时间计算如下:
在JB8的编程系统中,发送1个字节的周期为:2+(1+3+5+4+4+4+3+3+4+7)×8+4=310,100 KB的数据需要(100×1024÷2)个字×(5×310+150)个周期÷(3×106)=29.01 s。
在改进的编程系统中,发送1个字节的周期为:2+2+4+3+1+1+2+4+(1+3+6+88)×8+2+4=809,100 KB的数据需要(100×1024÷2)个字×(5×809+150)个周期÷(24×105)=8.95 s。
而JM60缓存中的数据是以连续存放的形式写入目标芯片内存的,因此可以选用BDM固件命令WRITE_NEXT,每次执行命令时寄存器X的值会先自动加 2,然后将1个字写入到X所指向的地址。所以只需要在写入开始时,对寄存器X进行一次地址赋值操作,将目标芯片内存地址减2处的地址值赋给X即可,后续数据可以直接调用WRITE_NEXT命令写入,不需要再发送地址信息。采用WRITE_NEXT写1个字需要发送3个字节(1个字节的命令操作码、2个字节的数据),它的完成需要延迟32个编程调试器时钟周期。因而从编程调试器发送100 KB的数据到目标芯片内存需要花费的时间计算如下:
(100×1024÷2)个字×(3×809+32)个周期÷(24×106)=5.25 s
改进后的编程系统在编程调试器内存与目标芯片内存的数据通信速度上提高了5.5倍,大大提高了编程调试器的工作效率。
2.2.2 编写目标芯片接收程序
优化通信子程序代码之后,从编程调试器内存向目标芯片内存发送数据的时间大大减少,但是使用BDM命令,除了发送2个字节的用户数据之外,还需要发送额外的字节,并且命令的完成都需要较长的延迟时间。由于BDM采用单线引脚串行通信,因此可以自己编写一段模拟BDM串行通信的程序,目标芯片只从编程调试器接收用户目标代码,提高通信速度。
另外将JM60的引脚PTBD.O与目标芯片PTA.0引脚相连来传送数据,以便数据通信过程不影响BKGD引脚。过程如下:
①按照编程调试器发送1位时序,在编程调试器方编写以PTBD.0为发送引脚的字节发送代码;
②按照目标芯片接收1位的过程,编写目标芯片以PTA.0为接收引脚的字节接收代码,进而编写好目标芯片接收程序;
③将自定义的目标芯片接收程序编译成目标代码,通过基本的BDM命令发送到目标芯片内存;
④执行目标芯片中自定义的接收程序,将接收到的字节写入目标芯片指定的内存空间。
由于目标芯片的接收程序是自己定义的,因此编程调试器不需要发送操作码与地址信息,也无需等待命令完成延迟时间。自定义的目标芯片接收程序代码量少于50字节,这部分时间很短。因而假如从编程调试器发送100KB的数据到目标芯片内存,需要花费的时间计算如下:
(100×1024)个字节×809个周期÷(24×106)=3.45 s
使用自定义目标芯片接收程序,在原有系统编程调试器内存与目标芯片内存的数据通信速度上提高了8倍多。
3 编程系统的通用性设计
编程系统的通用性在于两点:一是可以根据不同型号的目标芯片获取相应的MCU参数进行操作;二是可以根据不同型号MCU的总线频率调用相应的发送接收代码。
3.1 MCU信息的存储
S12系列MCU有很多型号,而且未来还会推出更多新型号。表1给出了数据库中MCU的信息。不同型号MCU属性参数不同,包括内部RAM及Flash的大小和起始地址。这些参数在对目标芯片进行擦除、写入及调试操作时极为重要。为了便于通用性方面的设计,在PC方数据库中保存了每款MCU的相关信息,在用户建立工程的时候就可以获取这些字段信息,对目标芯片进行正确的操作。