在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
芯片精品文章合集(500篇!) 创芯人才网--重磅上线啦!
查看: 2135|回复: 5

大侠们都来帮忙看看这个程序哪里出问题了!!!!!

[复制链接]
发表于 2009-8-22 15:10:06 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
大侠们都来帮忙看看这个程序哪里出问题了!!!!!

首先说下程序。程序在中断中修改中断的返回地址,回到想要的回到的地方执行,判断要执行哪个任务,以达到快速响应的目的。
问题:程序在Keil中仿真通过,可以实现想要的功能,但下载到单片机后一点反应都没有……不知道是什么原因,期待大侠指点!!!!!
下面是程序:
include <at89x51.h>
#include <intrins.h>
#define  uchar unsigned char
#define  uint  unsigned int
xdata PC_Value, SP_Value; //储存中断返回点、SP初值的全局变量
uchar Ctrl_Code=0;
void initinal()
{
EX0=1;
IT0=1;
}//外部中断0允许中断,下降沿触发


Get_Next_PC(void)        //获取下一条指令的地址
{
  xdata address;
  address=*((uchar *)SP);//PC的高字节
  address <<= 8;
  address+=*((uchar *)(SP-1)); //PC的低字节
  return address+8;      //查看反汇编代码,计算所得
}

void delay_ms(uint aa)
{
    uint  i,j;
for(i=0;i<aa;i++)
   for(j=0;j<114;j++);
}//1ms延时程序

void task(uchar bb)
{
if(bb==1) P1=0xfe;
else if(bb==2) P1=0xfc;
else if(bb==3) P1=0xf8;
delay_ms(1000);
for(;;)
    {
      P1=_crol_(P1,1);
   delay_ms(1000);
    }  
}

void main()               
{
initinal();           //初始化函数
SP_Value=SP;            //获取SP的初始值
PC_Value=Get_Next_PC();            //获取下一条指令的地址
EA=1;                  //获取PC、SP初值后再开中断保证稳定性
if(Ctrl_Code!=0)  SP=SP_Value;         //重置堆栈指针,防止堆栈溢出

switch( Ctrl_Code)   //任务入口地址,即中断的返回点
  {
   case 1:   goto  TASK1;
   case 2:   goto  TASK2;
   case 3:   goto  TASK3;
   default:  goto  TASK4;
  }
TASK1:  for( ; ; )
        {  task(1);               }
TASK2:  for( ; ; )
        {  task(2);               }
TASK3:  for( ; ; )
        {  task(3);               }
TASK4:   for(;;);
}


void TX0(void) interrupt 0 using 0
{
uchar a1,a2;
a1=a1*a2;//使寄存器B入栈,保证堆栈结构稳定
EA=0;
*((unsigned char *)(SP-5))=(PC_Value>>8);
*((unsigned char *)(SP-6))=(PC_Value&0x00ff);  //修改中断返回时程序计数器PC值*/
Ctrl_Code++;
if(Ctrl_Code==4)  Ctrl_Code=1;
}
 楼主| 发表于 2009-8-22 16:38:29 | 显示全部楼层
大家都给点建议啊!不知道从哪里着手了这个问题。
 楼主| 发表于 2009-8-27 21:49:22 | 显示全部楼层
问题解决了,在次谢谢关注过的每一位朋友!!!!!
Get_Next_PC(void)  函数放在程序的最后面,在程序开始时加函数声明就可以了。经过试验,这个函数只有放在程序最后面,程序才能正常运行!!!!不知道是怎么回事,希望哪位达人能给予解答。
另外,这个程序是参考网上的《基于51的多任务机制》写的,如果哪位朋友要用的话发信给我。
我的邮箱:bujizhizhou0218@163.com
发表于 2009-8-28 19:22:56 | 显示全部楼层
要彻底弄明白怎么回事,只能反汇编看了。
发表于 2009-10-13 22:52:37 | 显示全部楼层
不知道!
发表于 2009-10-14 11:13:39 | 显示全部楼层
可能和编译器有关吧
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /2 下一条


小黑屋| 手机版| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-12-24 04:24 , Processed in 0.034037 second(s), 9 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表