44B0

 今天该总结一下了,昨天一直都在做中断,搞来搞去,程序总是跑飞。

 仿真用的ADS,JLINK。自己写的BOOTLOADER(自认为是完美版),想测试一下中断。挑了一个watchdog做测试。傻傻的盯着ADS上的PC,每次中断申请,哗的一下就飞了。这个郁闷,上午看了06级的毕业设计公开答辩,觉得浪费了不少时间。下午想搞定新写的BOOT。可PC老是飞来飞去的完全不知道错在哪。

  不扯别的了,说点关键的吧。我现在还是个菜鸟,在44b0上跑着裸机程序。

  中断进不了,我相信像很多我这样菜鸟,多少都会碰见进不了中端的情况。现在根据我的情况将几种进不了中断的原因总结如下:

  1、向量表问题,我们往往在44b0中设置两级向量表,第一级以0X00起始。第二级地址可由我们在BOOT中设置一般将其指向RAM,二级向量表存放的才是我们中断服务函数的真正入口地址,是汇编BOOT与C函数的接口之一(另一接口是向MAIN函数的跳转)。一定要注意这两级向量表跳转方向。

  2、另外ADSrobase是我们设置的代码运行区间的代码段起始地址,这里我们叫绝对地址。我们在汇编及C中设置的标号及函数名都是相对这个绝对地址的,这个一定要搞清楚。要是绝对地址设在RAM 则代码一定要搬到RAM,否则程序只有跑飞的份了。中断能对吗?

  3、JLINK是个好动西,但是JLINK的仿真模式,有的时候会给我们错误的认识。JLINK仿真复位后PC就跑到,我们的绝对地址。这也使我有了个错误的认识。一直以为出现中断申请后,PC是自动到这个绝对地址处的向量表的,故没管扳子上固化的BOOT,我板子上固化的BOOT跟我现在的代码完全不兼容。而我没把我的新BOOT烧进去。这就是我PC乱飞的根本原因。

另外今天自己写了一个printf标准输出函数,就贴上来分享了。具体代码今天就不分析了。

void Uart_Sent(char Send_data)
{
 //U8 Uart_data;
 if(Uart_Work==0)
 { if(Send_data=='/n')
  {
   while(!(rUTRSTAT0&0x2));
   SystemDelay(10);
   WrUTXH0('/r');
  }
  while(!(rUTRSTAT0&0x2));
  SystemDelay(10);//据说延时跟超级终端反映慢有关,有待考证
  WrUTXH0(Send_data);
 }
 if(Uart_Work==1)
 { 
  if(Send_data=='/n')
  {
   while(!(rUTRSTAT0&0x2));
   SystemDelay(10);
   WrUTXH0(Send_data);
  }
  while(!(rUTRSTAT1&0x2));
  SystemDelay(10);
  WrUTXH1('/r');
 }
}
void Uart_Sentbyte(char Send_key)//第一次封装
{
 Uart_Ex_Empty();
 Uart_Sent(Send_key);
}
void Uart_SentString(char *pt)//串一次封装
{
 while(*pt)
 Uart_Sentbyte(*pt++);
}
void putc(char p)//字符二次封装
{
 Uart_Sentbyte(p);
}
void puts(char *pt)//串二次封装
{
 Uart_SentString(pt);
}
#ifdef __SDT_COMPILER
typedef char *__va_list[1];

#else

typedef int *__va_list[1];
#endif

int vsprintf(char * /*s*/, const char * /*format*/, __va_list /*arg*/);
void printf(char *fmt, ...)//最后封装成标准输出函数
{
 va_list ap;
 char string[256];
 va_start(ap,fmt);
 vsprintf(string, fmt, ap);//利用vsprintf函数简单构造了一个标准输出
 //函数,string为我们设定的字符串缓冲区,缓冲区作用可参照vsprint源码
 //不是将格式化结果标准
 //输出,而是将其存入szBuffer,我们定义的字符串缓冲区仅为256char故不能超过这个长度,可能不到这个值栈就会爆
 Uart_SentString(string);
 va_end(ap);
}

你可能感兴趣的:(c,String,list,汇编,测试,终端)