第一范文网 - 专业文章范例文档资料分享平台

uCOS-II源码详解

来源:用户分享 时间:2025/8/25 8:24:24 本文由loading 分享 下载这篇文档手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:xxxxxxx或QQ:xxxxxx 处理(尽可能给您提供完整文档),感谢您的支持与谅解。

函数,然后调用OSIntExit()将OSIntNesting减一,最后将各寄存器值出栈,使用中断返回指令IRET返回。

OSTimeTick在每个时钟中断中被调用一次,在该函数中会更新各个进程TCB所对应的OSTCBDly,如果该OSTCBDly减为0,则对应的TCB就被放入Ready TCBList中。

OS_ENTER_CRITICAL(); OSTime++;

OS_EXIT_CRITICAL(); ptcb = OSTCBList;

while (ptcb->OSTCBPrio != OS_IDLE_PRIO) { OS_ENTER_CRITICAL(); if (ptcb->OSTCBDly != 0) { if (--ptcb->OSTCBDly == 0) {

if ((ptcb->OSTCBStat & OS_STAT_PEND_ANY) != OS_STAT_RDY) { ptcb->OSTCBStat &= ~OS_STAT_PEND_ANY; ptcb->OSTCBPendTO = TRUE; } else {

ptcb->OSTCBPendTO = FALSE; }

if ((ptcb->OSTCBStat & OS_STAT_SUSPEND) == OS_STAT_RDY) { OSRdyGrp |= ptcb->OSTCBBitY;

OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX; } } }

ptcb = ptcb->OSTCBNext; OS_EXIT_CRITICAL(); }

首先在临界段将OSTime加一,然后遍历整个非Free的TCBList,如果OSTCBDly不为0,则,将OSTCBDly减一,如果这时OSTCBDly为0,而且TCB对应的进程需要等待任何信号量或Event等,则说明超时时间到了,将当前TCB的State中OS_STAT_PEND_ANY位去掉,然后将OSTCBPendTo设置为TRUE,表示这是PEND的超时,否则设置OSTCBPendTO为FALSE。 如果OSTCBDly减为零,且该进程没有Suspend,则将该进程放入Ready TCBList中,使用方法同TaskCreate中的方法。

然后我们来说说OSIntExit这个函数。该函数代码如下: void OSIntExit (void) { INT8U y;

if (OSRunning == TRUE) { OS_ENTER_CRITICAL(); if (OSIntNesting > 0) { OSIntNesting--; }

if (OSIntNesting == 0) { if (OSLockNesting == 0) { y = OSUnMapTbl[OSRdyGrp];

OSPrioHighRdy = (INT8U)((y << 3) + OSUnMapTbl[OSRdyTbl[y]]); if (OSPrioHighRdy != OSPrioCur) {

OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy]; OSCtxSwCtr++;

OSIntCtxSw(); } } }

OS_EXIT_CRITICAL(); } }

首先判断OSRunning是否为1,也就是OS是否在运行,当然没有运行就什么都不做。

然后将OSIntNesting减一,这个是需要在临界段进行的。如果OSIntNesting减为零,并且没有限制进程切换,则找到当前最高优先级的进程(方法同OS_Sched()),然后调用OSIntCtxSw进行进程切换。

OSIntCtxSw()是用户自定义函数,该函数的主要功能与OSCtxSw类似,只是需要对当前的堆栈进行稍微的调整,将OSIntExit和OSIntCtxSw调用所需要的堆栈去掉,然后做的和OSCtxSw一样。

在实际的Porting中发现要去掉OSIntExit和OSIntCtxSw调用所占用的堆栈还是比较麻烦的,因此我就现在OSTickISR刚开始的时候保存好现场之后就将堆栈指针赋给当前进程TCB的OSStkPtr,这样,在OSIntCtxSw中就不需要重新对当前堆栈的值进行保存,只需进行切换就可以了

堆栈结构

长度=SP-OSStkStart用户堆栈最高地址SP高OSTCBCurOSTCBCur--》OSTCBStkPtr?C_XBP低?C_XBP高R7R6R5R4R3R2R1R0PSWDPLDPHBACC长度=15用户堆栈长度15低地址R7R6R5R4R3R2R1R0PSWDPLDPHBACC不关心低OSStkStartOSStkStart-1

系统硬件堆栈 内部RAM空间

搜索更多关于: uCOS-II源码详解 的文档
uCOS-II源码详解.doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.diyifanwen.net/c3238q1yi364bptb10lzm_4.html(转载请注明文章来源)
热门推荐
Copyright © 2012-2023 第一范文网 版权所有 免责声明 | 联系我们
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:xxxxxx 邮箱:xxxxxx@qq.com
渝ICP备2023013149号
Top