读书人

又要通宵好几晚上了求帮忙分析下面保

发布时间: 2012-05-01 12:48:58 作者: rapoo

又要通宵好几晚上了,急求帮忙分析下面保存上下文esp是否正确!!谢谢
其中有一句 //此时上下文中得到的esp是不正确的
有没什么问题啊,网上的ucos的保存上下文的代码

void uniTskCtxSw(void)
{
UINT32 uwIntSave;
UINT32 *sp;
TSK_CB_S *pstSwitchIn;
TSK_CB_S *pstSwitchOut;

uwIntSave = uniIntDisable();

ContextCB[g_pRunningTask->usPriority] = Context;

sp = (UINT32 *)Context.Esp; //得到主线程当前堆栈指针
//在堆栈中保存相应寄存器。
//*--sp = Context.Eip; //先保存eip

*--sp = osTickSwitch;
*--sp = Context.EFlags; //保存efl
*--sp = Context.Eax;
*--sp = Context.Ecx;
*--sp = Context.Edx;
*--sp = Context.Ebx;
*--sp = Context.Esp; //此时保存的esp是错误的,但OSTCBCur保存了正确的
*--sp = Context.Ebp;
*--sp = Context.Esi;
*--sp = Context.Edi;
g_pRunningTask->pStackPointer = (UINT32 *)sp; //保存当前esp

g_pRunningTask = g_pHighestTask;
sp = g_pHighestTask->pStackPointer; //得到重新执行的任务的堆栈指针

//恢复所有处理器的寄存器
Context.Edi = *sp++;
Context.Esi = *sp++;
Context.Ebp = *sp++;
Context.Esp = *sp++; //此时上下文中得到的esp是不正确的
Context.Ebx = *sp++;
Context.Edx = *sp++;
Context.Ecx = *sp++;
Context.Eax = *sp++;
Context.EFlags = *sp++;
Context.Eip = *sp++;

Context.Esp = (unsigned long)sp; //得到正确的esp

uniIntRestore(uwIntSave);

SetThreadContext(mainhandle, &Context); //保存主线程上下文
}


[解决办法]
不是可以直接嵌入汇编吗?
需要这么麻烦么

还有什么是正确的esp呢?
[解决办法]
你可以用debug的方式...
[解决办法]

探讨

引用:
不是可以直接嵌入汇编吗?
需要这么麻烦么

还有什么是正确的esp呢?


用的一个线程去打断另外一个线程,保存和恢复上下文,模拟中断

[解决办法]
原来你说的是ucos的任务切换,我以为你是用户线程去打断其他线程,当我没说。:)

[解决办法]
探讨

引用:
原来你说的是ucos的任务切换,我以为你是用户线程去打断其他线程,当我没说。:)

恩,我想问的是,商业的ucos是真的用的这个方法吗? 还是外面流传的开源的

[解决办法]
就是Micrium网站上开源核。

[解决办法]
就是Micrium网站,点Downloads,注册一下就可以下载了。

读书人网 >汇编语言

热点推荐