打印

硬件N级堆栈是什么意思

[复制链接]
7961|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
大碗拉面|  楼主 | 2009-11-9 14:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
看PIC的DATASHEET时,都会介绍该芯片有几级硬件堆栈。
我估计这个几级是不是指支持几级函数嵌套啊?
请大家指点一下。
沙发
dhjlh| | 2009-11-9 15:51 | 只看该作者
本帖最后由 dhjlh 于 2009-11-9 16:14 编辑

我和楼主的理解一样的。

使用特权

评论回复
板凳
yewuyi| | 2009-11-9 16:18 | 只看该作者
硬件堆栈的意思就是在发生中断或退出中断时,由MCU自己把一些特殊寄存器压入硬件堆栈或弹出堆栈,而不是用户执行PUSH、POP指令,具体那些寄存器被压入,你需要看对应的MCU的数据手册。

硬件堆栈的好处显而易见,可以简化操作,避免出错,缺点也显而易见,最大的缺点就是递归调用一般是不支持的,如果非要用递归调用则必须辅助RAM变量才能实现。

使用特权

评论回复
地板
大碗拉面|  楼主 | 2009-11-9 18:00 | 只看该作者
谢谢版主的解答。
我看看数据手册。

使用特权

评论回复
5
NE5532| | 2009-11-9 21:33 | 只看该作者
中断也要算进去哦,8级堆栈是很小,不过一般是用不完的。

使用特权

评论回复
6
su_mj000| | 2009-11-10 07:54 | 只看该作者
本帖最后由 su_mj000 于 2009-11-10 07:55 编辑

不太同意3 楼的解释。

就PIC器件而言,‘硬件N级堆栈’意味着所支持最大的(子)程序以及中断调用深度。
即:最大的(子)程序调用深度+中断+中断子程序调用深度 <= N.
注意,进入中断时将消耗1级堆栈。

理论上,‘硬件堆栈’与是否支持递归或重入没有必然的联系,虽然‘硬件堆栈’的结构一般不支持递归。
事实上,只要再编程时采取必要的手段,PIC16之类也能实现有限的递归。

使用特权

评论回复
7
su_mj000| | 2009-11-10 08:43 | 只看该作者
本帖最后由 su_mj000 于 2009-11-10 08:54 编辑

通过特殊手段,在PIC16实现有限的递归不足以推广到一般。

但同样是具有‘硬件堆栈’结构的PIC18系列,尤其是带有扩展指令的PIC18芯片,则具有
支持递归的能力。当然这种能力会受限于‘硬件堆栈’的深度(31级)。

事实上,递归的实现受限于软件和硬件两个方面。前者通常指编译器(有时包括调试环境),
并且以后者是否支持为先决条件。据说MCC18不支持递归,PICC18是否支持不清楚。从硬件方面而言,
要支持递归(包括重入、多任务、多线程),最主要的是是否有数据堆栈(不管是软、硬件),以及对数据
堆栈的存取是否有效率。

顺便说一下,我以为像68HC11结构的芯片才是最佳的支持递归的环境。有比较材料表明,68HC11
的指令效率最高 (指8位机领域,采用标准测试程序)。只是它的指令周期太长了点。

使用特权

评论回复
8
大碗拉面|  楼主 | 2009-11-10 09:02 | 只看该作者
谢谢:)
大家

使用特权

评论回复
9
大碗拉面|  楼主 | 2009-11-10 09:14 | 只看该作者
原来做的一个项目是用p18f4682做的
会出现死机的问题,拿ICD2跟踪,
可程序也没有跑飞
当时就怀疑是不是硬件堆栈的问题(最后发现是因为CAN总线续接,接实了就好了)
但是芯片手册也没有具体解释硬件堆栈的含义
而且AVR和51的文档上也没有特别指出自身芯片上有几级硬件堆栈
想来这是不是PIC特有的特点
于是就问问大家想闹个明白
呵呵

使用特权

评论回复
10
ddb_21ic| | 2009-11-10 10:06 | 只看该作者
硬件堆栈就是可以PUSH(推倒)几次
堆栈溢出在编译的时候就能发现

使用特权

评论回复
11
cheungman| | 2009-11-10 15:23 | 只看该作者
顶#6,#7楼的牛人

使用特权

评论回复
12
bobo1957| | 2010-2-5 23:51 | 只看该作者
个人觉得PIC说的硬件堆栈有ls各位说的意思,还有一层意思就是PIC的堆栈是不可以程序控制的,只能硬件自动压栈弹栈

使用特权

评论回复
13
大碗拉面|  楼主 | 2010-2-20 15:30 | 只看该作者
我在看PIC16F87X的文档时发现,这款单片机的硬件堆栈是个循环缓冲器(circular buffer),即第九次“压入“”将覆盖第一次“压入”,即使出现这种情况,也是没有提示的。用起来感觉有点虚啊。
原文:
The stack operates as a circular buffer. This means that after the stack has been PUSHed eight times, the ninth push overwrites the value that was stored from the first push. The tenth push overwrites the second push (and so on).

Note 1: There are no status bits to indicate stack overflow or stack underflow conditions.
2: There are no instructions/mnemonics  called PUSH or POP. These are actions that occur from the execution of the CALL, RETURN, RETLW and RETFIE instructions, or the vectoring to an interrupt address.

使用特权

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

本版积分规则

35

主题

429

帖子

4

粉丝