打印

移植中堆栈压栈的一个问题

[复制链接]
1766|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
qiqiang|  楼主 | 2007-4-26 22:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

下面这段代码是在建立任务时,进行任务的初始化,将任务堆栈模拟成发生过一次中断的情况,原来的代码(加红色的部分),先把栈底指针减一,浪费了一个堆栈空间,然后又两次把任务函数的入口地址压栈,又浪费了一个空间。因此,这里多浪费了两个空间。可以将它修改为新代码处的代码,节省两个堆栈空间(4个字节)。经过实际硬件测试,是可以的。
opt    = opt;                 
    top    = (INT16U *)ptos;                    

/*  源代码
    top--;                      // 16位的指针在减,一次变化两个字节
    *top = (INT16U)task;        // 保存的是任务起始地址,
    top--;
    *top = (INT16U)task;        // 保存的是任务起始地址
    top--;
*/    

/* 新代码
opt    = opt;                 
    top    = (INT16U *)ptos;                    
    *top = (INT16U)task;                // 保存的是任务起始地址,
    top--;  
*/
    // 使能中断
    
    *top = (INT16U)0x0008;            //  出栈弹出到SR,将使能中断          
  


//  以下压入的是立即数,除R12作为入口参数之外,其他没有实际意义
top--;
    *top = (INT16U)0x0404;
    top--;
    *top = (INT16U)0x0505;
    top--;
    *top = (INT16U)0x0606;
    top--;
    *top = (INT16U)0x0707;
    top--;
    *top = (INT16U)0x0808;
    top--;
    *top = (INT16U)0x0909;
    top--;
    *top = (INT16U)0x1010;
    top--;
    *top = (INT16U)0x1111;
    top--;
    
    
    //保存参数地址
    
    *top = (INT16U)p_arg;                          /* Pass 'p_arg' through register R12                 */
    top--;
    *top = (INT16U)0x1313;
    top--;
    *top = (INT16U)0x1414;                         
    top--;
    *top = (INT16U)0x1515;
    return ((OS_STK *)top);    

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

23

主题

43

帖子

2

粉丝