请教各位C51单片机的堆栈问题
#includeunsignedcharidatastack[2];voidtask1(){}voidtask_load(unsignedintp){stack[0]=p...
#include unsigned char idata stack[2];void task1(){}void task_load(unsigned int p){ stack[0] = p & 0xff; stack[1] = p >> 8; SP = stack + 1;}void main(void){ task_load(task1);}上面是代码,我的问题是,为什么SP = stack + 1;这个赋值给SP指针才可以转到任务1,这句应该怎么理解。。请教各位老师解答。。
展开
2013-12-01
展开全部
试了半天函数名是一个16位的入口地址,要想赋值给SP堆栈指针,必须把这个16位的入口地址存放在 连续的 RAM里,所以上面的用的是一个数组来存,存完后把函数入口地址的高8位赋值给SP堆栈指针后,堆栈会自动减一取出函数入口地址低8位。 关键就是要存在连续的RAM里,要不然堆栈SP自动减一时,弹出的不是函数入口地址低8位,程序就会跑错。。。 51里的硬件堆栈向上增长,弹出时是由高向低弹出,所以存数据要先存低8位地址,后存高8位。这么多高手都吝啬。。。让小白自己摸索汗。
2013-12-01
展开全部
应该是这样的,Stack 表示的是Stack[0]的地址,Stack+1是Stack[1]的地址,赋值给SP堆栈指针的是TASK1任务的高8位地址。。。求解答
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2013-12-01
展开全部
看样子, 这是 OS 里面的一段任务初始化代码.void task_load(unsigned int p){ stack[0] = p & 0xff; stack[1] = p >> 8; SP = stack + 1;}这段代码是将某个任务的入口地址先保存入堆栈. 修改 SP 以后, 函数返回时要从堆栈中弹出地址, 于是就 "返回" 到任务入口地址了.警告: 通常的程序是不能随便修改 SP 的. 这种方法不要随便模仿哦
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2013-12-01
展开全部
...没人看
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询