Chinaunix首页 | 论坛 | 博客
  • 博客访问: 69383
  • 博文数量: 23
  • 博客积分: 906
  • 博客等级: 准尉
  • 技术积分: 250
  • 用 户 组: 普通用户
  • 注册时间: 2010-04-24 23:57
文章分类

全部博文(23)

文章存档

2011年(3)

2010年(20)

我的朋友

分类: C/C++

2010-06-24 23:18:01

C8051跑UCOS时,关于SFRPAGE的操作

不是简单的入出栈的关系了,因为调用RETI时SFRPAG硬伯会自动操作. 因为当系统心跳时钟时会引起
任务切换,RETI中断返回时PC不再是回到被中断的点,而是切换到新的任务运行空间; 所以SFRPAGE这
种自动操作会出问题.

中断和 SFR 分页:
   当一个中断发生时,SFR 页寄存器会自动切换到 SFR 页 0,所有包含中断标志位的寄存
器都位于 SFR 页 0 并且是可位寻址的.这种自动 SFR 页切换功能减轻了从中断服务程
序切换 SFR 页的负担.
  在执行RETI指令时,中断前使用的 SFR 页会被自动恢复.

这是通过一个 3 字节的 SFR 页堆栈来实现的:位于该堆栈顶部的是 SFRPAGE,即当前 SFR 页;
SFR 页堆栈 的第二个字节是 SFRNEXT;第三个或者说 SFR 堆栈底部的字节是 SFRLAST.
  发生中断时:当前 SFRPAGE 的值被压入到 SFRNEXT 字节, SFRNEXT 的值被压入到 SFRLAST.
然后硬件将包含该中断对应标志位的 SFR 页装入 SFRPAGE.
  在中断返回时执行 SFR 页堆栈出栈操作, SFRNEXT 的值返回到 SFRPAGE 寄存器,因此不需要
软件干预即可恢复 SFR 页的上下文. SFRLAST 中的值(如果堆栈底部没有 SFR 页值,则该值为
0x00)被保存到 SFRNEXT 寄存 器.如果需要,可以在中断服务程序中修改SFRNEXT和SFRLAST的值,
以使 CPU 在执行 RETI 指令(中断返回)时返回到不同的 SFR 页.
  修改 SFR 页堆栈中的寄存器并不引起压栈 或出栈操作.只有中断调用和返回才会导致对 SFR 页
堆栈的压栈/出栈操作
阅读(2907) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~