请教各位C51单片机的堆栈问题

[复制链接]
 楼主| aw50420181750 发表于 2013-8-11 16:04 | 显示全部楼层 |阅读模式
本帖最后由 aw50420181750 于 2013-8-12 11:03 编辑

#include <reg51.h>
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);
}
上面是代码,怎么理解。。请教各位老师解答。。
 楼主| aw50420181750 发表于 2013-8-11 22:01 | 显示全部楼层
本帖最后由 aw50420181750 于 2013-8-12 11:04 编辑

应该是这样的,赋值给SP堆栈指针的是TASK1任务的高8位地址。。。求解答
 楼主| aw50420181750 发表于 2013-8-11 22:44 | 显示全部楼层
本帖最后由 aw50420181750 于 2013-8-12 11:02 编辑

...没人看
airwill 发表于 2013-8-13 10:22 | 显示全部楼层
看样子, 这是 OS 里面的一段任务初始化代码.

void task_load(unsigned int p)
{
    stack[0] = p & 0xff;
    stack[1] = p >> 8;
    SP = stack + 1;
}

这段代码是将某个任务的入口地址先保存入堆栈. 修改 SP 以后, 函数返回时要从堆栈中弹出地址, 于是就 "返回" 到任务入口地址了.
警告:  通常的程序是不能随便修改 SP 的. 这种方法不要随便模仿哦

评分

参与人数 1威望 +2 收起 理由
aw50420181750 + 2 很给力!

查看全部评分

 楼主| aw50420181750 发表于 2013-8-13 14:24 | 显示全部楼层
airwill 发表于 2013-8-13 10:22
看样子, 这是 OS 里面的一段任务初始化代码.

void task_load(unsigned int p)

之前没人解释给听,斑竹解释的正确。 存任务入口函数地址时,高8位放高地址,低8位放低地址,硬件51的堆栈是向上增长,这样SP堆栈弹出时,SP减一取出低八位地址才能返回到正确的函数。存放函数名的RAM不能有其他变量打断。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

73

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部