首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 汇编语言 >

又要通宵好几晚上了,求帮忙分析下面保存上下文esp是否正确!多谢

2012-05-01 
又要通宵好几晚上了,急求帮忙分析下面保存上下文esp是否正确!!谢谢其中有一句 //此时上下文中得到的esp是

又要通宵好几晚上了,急求帮忙分析下面保存上下文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,注册一下就可以下载了。

热点排行