现在经常接触一些消费类的廉价SOC,特点是没有仿真器,没有调试器,调试程序的常规手段就是编译、烧录、观察LED闪烁来判断程序运行情况
考虑通过串口、I2C等通信接口来调试,在程序里内嵌一些通用的内存、寄存器读写函数:
#include <ABSACC.H>//提供一些直接DATA,IDATA,XDATA,CODE等地址的宏
unsigned char read_idata(unsigend char addr)//读取0x00-0xFF范围的RAM
{
return(DBYTE[addr]);
}
void write_idata(unsigend char addr,unsigned char value)//修改0x00-0xFF范围的RAM
{
DBYTE[addr] = value;
}
这些都比较简单,其他xdata,code等类型地址的访问依此类推……
问题是SFR的访问似乎做不了:
unsigned char read_reg8(unsigend char addr)//读取8位寄存器(51内核的高128字节:0x80-0xFF)
{
查了一些资料,似乎都无法实现……甚至嵌入汇编也不行
}
void write_reg8(unsigned char addr,unsigned char value)//修改8位寄存器(51内核的高128字节:0x80-0xFF)
{
}
我能想到的就是最笨的方法:
unsigned char read_reg8(unsigend char addr)//读取8位寄存器(51内核的高128字节:0x80-0xFF)
{
switch(addr)
{
case 0x80: return(P0);
case 0x90: return(P1);
case 0xA0: return(P2);
……依此类推,把所有已定义的寄存器地址都枚举一遍……
}
}
以前流行过一阵子单片机预烧录一小段调试器、监视器代码,keil通过串口跟它通信,可以通过指令来读取、修改寄存器,不知它是怎么实现的?
|