佚名通过本文主要向大家介绍了单片机多任务编程,单片机毕业设计任务书,单片机多任务,单片机课程设计任务书,单片机任务书等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题: 关于51单片机的中断实现多任务的问题
描述:
问题就是如何获得并修改断点地址,通过sp寄存器可以获得栈顶的地址,我想通过指针取地址就能得到断点地址,不知可行否。。以下代码是跳转测试,现象是先0x08对应的亮一个灯,随后0x80对应的灯一直亮着。。。0x0f没有出现,0x0855这个地址是通过keil查看汇编代码得到的地址,如下图,求问各位这样的方案可行吗,如果可行为什么代码没有跳到指定的位置(根据现象得出的)
描述:
中断多任务51栈
思路如下:进入中断保存断点地址,并且把栈内保存的断点地址修改,这样中断结束就跳转到修改后的相应位置,实现两个任务的切换。问题就是如何获得并修改断点地址,通过sp寄存器可以获得栈顶的地址,我想通过指针取地址就能得到断点地址,不知可行否。。以下代码是跳转测试,现象是先0x08对应的亮一个灯,随后0x80对应的灯一直亮着。。。0x0f没有出现,0x0855这个地址是通过keil查看汇编代码得到的地址,如下图,求问各位这样的方案可行吗,如果可行为什么代码没有跳到指定的位置(根据现象得出的)
#include <reg51.h>
unsigned char *sl;
unsigned char *sh;
void init()//初始化函数
{
TMOD=0x01;
TH0=0;
TL0=0; //初始值的设置
EA=1;//打开全局中断
ET0=1;//打开T0中断
TR0=1;
}
void delayms (unsigned int a)
{
unsigned int i,j;
for(i=0;i<a;i++)
for(j=0;j<124;j++);
}
void main()
{
int m;
for(m=0;m<5;m++)//-------------------------------------------------------预计是想跳到这,也就是这个灯会亮两次,然而并没有
{P0=0x08;delayms(500);}
P0=0x00;delayms(500);
init();
for(m=0;m<5;m++)
{P0=0x80;delayms(500);}
while(1){P0=0x0f;}
}
void T0time() interrupt 1
{
sh=(unsigned char *)SP;
sl=sh-1;
*sh=0x08;
*sl=0x55;
TH0=0;
TL0=0;
}
