搜索
bottom↓
回复: 4

请问马老师:中断现场手动保护,压栈顺序如何

[复制链接]

出0入0汤圆

发表于 2010-3-12 09:20:56 | 显示全部楼层 |阅读模式
我在打造自己的RTOS一文中看到压栈顺序为下面所示,请问是为什么啊,我没查到相关资料,请马老师帮忙。。。


在打造自己的RTOS一文里看到现场保护的顺序如以下,
请问是为什么啊。。。我查没查到熟读资料。。
   //  根据中断时保存寄存器的次序入栈,模拟一次中断后,入栈的情况   
  __asm__ __volatile__("PUSH __zero_reg__           
\t");  //R1  
  __asm__ __volatile__("PUSH __tmp_reg__            
\t");  //R0   
  __asm__ __volatile__("IN   __tmp_reg__,__SREG__   
\t");  //保存状态寄存器SREG  
  __asm__ __volatile__("PUSH __tmp_reg__            
\t");  
  __asm__ __volatile__("CLR  __zero_reg__           
\t");  //R0重新清零  
  __asm__ __volatile__("PUSH R18                    
\t");  
  __asm__ __volatile__("PUSH R19                    
\t");  
  __asm__ __volatile__("PUSH R20                    
\t");  
  __asm__ __volatile__("PUSH R21                    
\t");  
  __asm__ __volatile__("PUSH R22                    
\t");  
  __asm__ __volatile__("PUSH R23                    
\t");  
  __asm__ __volatile__("PUSH R24                    
\t");  
  __asm__ __volatile__("PUSH R25                    
\t");  
  __asm__ __volatile__("PUSH R26                    
\t");  
  __asm__ __volatile__("PUSH R27                    
\t");  
  __asm__ __volatile__("PUSH R30                    
\t");      
  __asm__ __volatile__("PUSH R31                    
\t");  
  __asm__ __volatile__("PUSH R28                    
\t");  //R28与R29用于建立在堆栈上的指针  
  __asm__ __volatile__("PUSH R29                    
\t");  //入栈完成

出0入0汤圆

发表于 2010-3-22 20:41:21 | 显示全部楼层
在你真的准备学习RTOS前,先评估自己的相关的基础知识,和对于所使用的芯片以及具体使用的开发环境(比如GCC或ICC)是否了解和掌握的比较深入了。

不明白你到底想知道什么,原则上这个压栈的顺序是顺便的,只要出栈的顺序与压栈顺序配合,遵循先进后出的顺序就可以了。

另外就是注意,AVR的PUSH,只能实现将R0-R31(32个工作寄存器)压栈。而标志寄存器SREG属于I/O寄存器,不能直接压栈,所以代码中采用tmp_reg(定义在R0寄存器)过渡一下,代码中的解释不是十分准确:

  __asm__ __volatile__("PUSH __tmp_reg__\t");            //将R0寄存器内容压栈        
  __asm__ __volatile__("IN   __tmp_reg__,__SREG__\t");   //将状态寄存器SREG的内容送到R0寄存器   
  __asm__ __volatile__("PUSH __tmp_reg__\t");            //将R0寄存器内容压栈,这里实际就是将状态寄存器SREG的内容压栈

出0入0汤圆

 楼主| 发表于 2010-3-24 10:05:36 | 显示全部楼层
谢谢老师,后来我查了很多资料,明白了,其实上面的顺序可以随便,只要出的时候相对应就行了,是这样吗。
上面的这段程序是别人写的,我研究了下,然后都弄到GCC里仿真,结果发现,所有任务都调用一周后,程序会从0地址重新运行,和复位一样。这个贴子的地址是:http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=574348&bbs_page_no=1&search_mode=4&search_text=savagex&bbs_id=9999

我查了很久还是没找到问题所在。。。

出0入0汤圆

发表于 2010-3-24 10:38:22 | 显示全部楼层
请原谅我实话实说,你目前的水平还不能去真正的理解学习RTOS。因为你的基础根本没有打好,好多基本的概念、知识、对芯片本身和编译器的了解都没有。

真正的掌握技术是没有捷径好走的。

出0入0汤圆

 楼主| 发表于 2010-4-3 11:14:26 | 显示全部楼层
回复【3楼】machao
请原谅我实话实说,你目前的水平还不能去真正的理解学习RTOS。因为你的基础根本没有打好,好多基本的概念、知识、对芯片本身和编译器的了解都没有。
真正的掌握技术是没有捷径好走的。
-----------------------------------------------------------------------

我也发现这个问题,但是我想通过学习RTOS来了解基本的概念、知识、对芯片本身和编译器,因为如果不看RTOS的东西,根本用不着考虑某些东西。

马老师说话比较直哦,不过您放心,我以后再也不会问您问题了。像我这种很浮躁很肤浅的人,根本不应该问您们这些懂得很多的人,根本就是浪费时间嘛,对不对。呵呵。谢谢马老师。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-2 12:18

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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