找回密码
 立即注册
查看: 242|回复: 2

请教杨老师FreeRTOS中的SPX指针存取问题

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:9
  • 最近打卡:2025-04-23 15:28:46

19

主题

65

回帖

223

积分

等待验证会员

积分
223
发表于 2024-4-2 10:06:06 | 显示全部楼层 |阅读模式
系统中sp指针的保存和恢复如下:

/* Saves the stack pointer for one task into its TCB. */
#define portSAVE_SPX()                      \
{                                           \
    __asm   { MOV   DR0,DR60    }           \
    __asm   { MOV   DR4,pxCurrentTCB    }   \
    __asm   { MOV   @WR6+0x2,WR2        }   \
}

/* Restores the stack from the new TCB read to
run the task. */
#define portRESTORE_SPX()                   \
{                                           \
    __asm   { MOV   DR4,pxCurrentTCB    }   \
    __asm   { MOV   WR2,@WR6+0x2        }   \
    __asm   { XRL   WR0,WR0     }           \
    __asm   { MOV   DR60,DR0    }           \
}

为什么不直接【 __asm   { MOV   pxCurrentTCB ,DR60    }   】和【__asm   { MOV   DR60,pxCurrentTCB }  】呢?
原文中SPX的操作我理解的仅仅是对低字节,高字节有其他信息么?

回复

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:16
  • 最近打卡:2025-04-30 08:41:32

105

主题

1215

回帖

1万

积分

荣誉版主

积分
12882
发表于 2024-4-2 12:42:52 | 显示全部楼层
本帖最后由 杨为民 于 2024-4-2 13:15 编辑

(1)关于SPX寄存器,参考下图

Fig_01_寄存器堆.jpg

Fig_02_寄存器映射.jpg

确实,SPX只有低16位有效,它对应的存储区域为EDATA空间


(2)“为什么不直接【 __asm   { MOV   pxCurrentTCB ,DR60    }   】和【__asm   { MOV   DR60,pxCurrentTCB }  】呢?”
如果是“MOV   pxCurrentTCB ,DR60”和“MOV   DR60,pxCurrentTCB”,在汇编语言中是“直接寻址”,适合于“pxCurrentTCB”是简单变量的情况数据存放在地址为pxCurrentTCB地方


(3)由于“pxCurrentTCB”是C语言中的指针变量,“__asm   { MOV   @WR6+0x2,WR2        }”和“__asm   { MOV   WR2,@WR6+0x2        } ”在汇编语言中是“间接寻址”,适合于“pxCurrentTCB”是指针变量的情况。
这里地址为pxCurrentTCB地方存放的是“指向数据存放地址”,而真正的数据存放在地址为@pxCurrentTCB的地方。
比如上面“__asm   { MOV   @WR6+0x2,WR2        }”指令中的WR6寄存器中,存放的是“pxCurrentTCB”在EDATA里面的内容的低16位指向了在EDATA中现行任务的TCB表的首地址(这个地址将存放现行任务的4字节的系统堆栈指针SPX),
而这条指令只存了SPX的低16位,这对于64KB的EDATA空间已经够了。



回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:9
  • 最近打卡:2025-04-23 15:28:46

19

主题

65

回帖

223

积分

等待验证会员

积分
223
发表于 2024-4-2 13:21:24 | 显示全部楼层
明白了,谢谢杨老师
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-2 20:53 , Processed in 0.147350 second(s), 63 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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