找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2380|回复: 0
打印 上一主题 下一主题
收起左侧

多任务的人工堆栈在内存中的实际模样

[复制链接]
跳转到指定楼层
楼主
ID:51090 发表于 2014-10-13 14:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在处理堆栈的时候,采用了数组来保存人工堆栈的顶部地址.

现在假设创建了两个任务,那么也就是

unsigned char stack[4];//堆栈为两个任务分别分配两个字节

unsigned char task_stack_top[2];//两个任务的人工堆栈顶地址

void task_create(unsigned char task_id,void (*task)(),unsigned char *task_stack) {
     *task_stack = (unsigned int)task;     //保存的是task的高八位

     task_stack +=1;

     *(task_stack+1) = (unsigned int)task>>8;    //保存task地址的低八位
     task_stack_top[task_id] = (unsigned char)(task_stack+1);//赋值的时候,task_stack_top[0]保存了task_0的堆栈顶部,task_stack_top[1]保存了task_1的堆栈顶部

}



现在在主函数main中调用创建进程函数:



int main(void) {

     os_init();

     task_create(0,task_0,&stack[0]);

     task_create(1,task_1,&stack[2]);

     os_start();

     return 0;

}  



假设task_0的地址为:C:0x00B0,task_1的地址为:C:0x00C9。



stack在RAM中的首地址为D:0x08

那么,在调用创建任务函数之后,stack的数组情况如下:



stack首地址  D:0x08



    RAM地址由低到高   |    存储的数据



                     D:0x0B    |    0x00   |       ->task_1高8位           task_stack_top[1] = 0x0B

                     D:0x0A    |    0xC9  |       ->task_1低8位

                     D:0x09    |    0x00   |       ->task_0高8位           task_stack_top[0] = 0x09

                     D:0x08    |    0xB0   |       ->task_0低8位





也就是这样的

stack[4] = {0xB0,0x00,0xC9,0x00};   //记住了程序的地址

task_stack_top = {0x09,0x0B};         //记住了每个程序堆栈顶部的地址



在开始程序的时候,让SP = task_stack_top[0],也就是SP = 0x09,这时SP指向了stack中的第2位,

在执行os_start()的最后一步调用返回指令之后,程序就跳到了0x00B0这一段,也就是task_0的入口处执行。



分析透堆栈的地址,对以后学习系统堆栈和任务堆栈的划分,有很大的作用。

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表