打印

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

[复制链接]
1589|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
aw50420181750|  楼主 | 2013-8-11 16:04 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
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 很给力!
5
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

粉丝