求助有关uC/OS问题

[复制链接]
2202|4
 楼主| caiwenbin 发表于 2007-11-2 21:06 | 显示全部楼层 |阅读模式
uC/os, ST, ui, ni, pc
小弟不明白任务栈结构初始化OSTaskInit()的具体作用,望各位大哥指点指点,我能看懂下面函数的意思,但不明白OSTaskInit()的具体作用,为什么要初始化一些0啊?下面是LPC2210的原程序:<br />uint32&nbsp;*OSTaskInit(void&nbsp;(*task)(void&nbsp;*pd)&nbsp;,&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;void&nbsp;*pada&nbsp;,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uint32&nbsp;*ptos,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uint16&nbsp;opt)<br />{<br />&nbsp;&nbsp;uint32&nbsp;*stk;<br />&nbsp;&nbsp;opt=opt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//opt没有使用<br />&nbsp;&nbsp;stk=ptos;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//获取堆栈指针<br /><br />&nbsp;&nbsp;/*建立任务环境,ADS1.2使用满递减堆栈*/<br />&nbsp;&nbsp;*stk&nbsp;&nbsp;&nbsp;=&nbsp;(uint32)task;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//PC<br />&nbsp;&nbsp;*--stk&nbsp;=&nbsp;(uint32)task;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//LR<br />&nbsp;&nbsp;*--stk&nbsp;=&nbsp;0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//R12<br />&nbsp;&nbsp;*--stk&nbsp;=&nbsp;0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//R11<br />&nbsp;&nbsp;*--stk&nbsp;=&nbsp;0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//R10<br />&nbsp;&nbsp;*--stk&nbsp;=&nbsp;0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//R9<br />&nbsp;&nbsp;*--stk&nbsp;=&nbsp;0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//R8<br />&nbsp;&nbsp;*--stk&nbsp;=&nbsp;0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//R7<br />&nbsp;&nbsp;*--stk&nbsp;=&nbsp;0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//R6<br />&nbsp;&nbsp;*--stk&nbsp;=&nbsp;0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//R5<br />&nbsp;&nbsp;*--stk&nbsp;=&nbsp;0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//R4<br />&nbsp;&nbsp;*--stk&nbsp;=&nbsp;0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//R3<br />&nbsp;&nbsp;*--stk&nbsp;=&nbsp;0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//R2<br />&nbsp;&nbsp;*--stk&nbsp;=&nbsp;0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//R1<br />&nbsp;&nbsp;*--stk&nbsp;=&nbsp;uint32&nbsp;pdata;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//R0,第一个参数使用R0传递<br />&nbsp;&nbsp;*--stk&nbsp;=&nbsp;(USER_USING_MODE&nbsp;|&nbsp;0);&nbsp;&nbsp;&nbsp;&nbsp;//SPSR,允许IRQ,FIQ中断<br />&nbsp;&nbsp;*--stk&nbsp;=&nbsp;0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//关中断计数OsEnterSum<br />&nbsp;&nbsp;return(stk);<br />}
wishcom 发表于 2007-11-2 22:52 | 显示全部楼层

重要的不是那些0

你得明白uCOS的context(上下文)结构:<br />正式你贴出来的,uCOS的context由<br />PC;LR;R12;R11;R10;R9;R8;R7;R6;R5;R4;R3;R2;R1;R0;SPSR<br />组成,而且是有顺序的。<br />任务切换时就是将当前task的这些东西保存起来,然后把下一个task的这些东西读取进CPU就完成了Task的切换。<br />问题是:在新建议各task时,之前没有运行过这个task,也就没有保存过它的context,那么怎么才能调度到这个新的task呢?<br />答案很明显:就是用这个OSTaskInit,人工给他按照格式生成一个context,然后再调度就可以进这个task了。<br /><br />context中其他的之所以是0,因为这个task新起的,当然初始化为0了。<br />重点关注context中的PC,LR,SPSR。因为在task调度的时候是由他们决定了调到新的task什么地方运行。在这个程序中,他们的值设置为了task的入口地址,这是很显然的,因为task刚开始跑肯定是要从入口处开始的。。。<br /><br />建议LZ多了解:<br />1.&nbsp;多任务切换原理<br />2.&nbsp;Task的上下文结构
 楼主| caiwenbin 发表于 2007-11-3 20:05 | 显示全部楼层

感谢楼上大哥!

  
 楼主| caiwenbin 发表于 2007-11-3 20:11 | 显示全部楼层

再次感谢 wishcom

重点关注context中的PC,LR,SPSR。<br />一语惊醒梦中人啊!
wishcom 发表于 2007-11-5 00:48 | 显示全部楼层

不要这样客气嘛,我会不好意思的啦^^

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

本版积分规则

67

主题

509

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部