为什么可以做到随时装载代码呢?


答: 跟51emb-32k不同,我的仿真机不用预先擦除用户的程序空间,你可以随时装载你的调试代码, 不需要擦除,不需要重新启动.

为什么51emb-32k要预先擦除用户代码呢? 这是因为keil是通过发出一条0205的指令来装载代码的:

命令(1字节) 类型(一字节) 起始地址(2字节) 长度(一字节) 数据(可变) 校验(一字节)
02 05 0101 FE xxxxxxx XX


长度为一个字节,最大值为0FEH (254个),长度为1时,数据为1个字节,长度为8时,数据为8个字节,长度为 FE时,数据为254个字节,因此这条命令最长为259个字节.

如果用户的程序代码空间没有预先擦除的话,数据是不可以直接写到ROM里(SST89C58只有当原来的数据为0xff 时才可以直接写入),而且这时候必须写入1个扇区,在51emb-32k执行擦除写入操作时会超时(因为擦写操作至少要11毫秒),而引起数据包的数据丢失(11毫秒无法接收数据),装载便失败.

我的仿真机是双CPU的,数据包会在主CPU里临时存储,等到用户CPU擦写完毕之后才送到用户CPU,因此不会引起数据丢失,不会装载失败.
而且使用了128字节的ram来缓存要写入的代码,每装载128 字节的代码只要写入1次,执行速度很快.

代码装载可以重复装载,重复装载时,实际上是不改写原来的代码空间的(因为跟原来的存储的代码一样,不执行写入操作).

用户也可以装载多个目标文件.