- 打卡等级:初来乍到
- 打卡总天数:5
- 最近打卡:2025-04-30 07:46:22
荣誉版主
- 积分
- 2319
|
发表于 2024-7-12 20:33:22
|
显示全部楼层
本帖最后由 tzz1983 于 2024-7-12 22:52 编辑
void OSTimeDly (INT32U ticks)
{
INT8U y;
#if OS_CRITICAL_METHOD == 3u
OS_CPU_SR cpu_sr = 0u; //如果定义了临界模式3,则申明变量 cpu_sr
#endif
if (OSIntNesting > 0u) // 中断里不允许调用, 如果检测到中断调用, 直接退出
{
return;
}
if (OSLockNesting > 0u) //如果调度器已被锁定,( ==不允许切换任务), 直接退出.
{
return;
}
if (ticks > 0u) // ticks 大于 0 时才有意义
{ //以下8行, 将当前任务从就绪表中移除
OS_ENTER_CRITICAL();
y = OSTCBCur->OSTCBY;
OSRdyTbl[y] &= (OS_PRIO)~OSTCBCur->OSTCBBitX;
OS_TRACE_TASK_SUSPENDED(OSTCBCur);
if (OSRdyTbl[y] == 0u)
{
OSRdyGrp &= (OS_PRIO)~OSTCBCur->OSTCBBitY;
}
OSTCBCur->OSTCBDly = ticks; // 延时时长保存在任务控制块
OS_TRACE_TASK_DLY(ticks);
OS_EXIT_CRITICAL();
OS_Sched(); // 此句 任务切换,
}
}
// 谁说不进行任务切换了?
// 有3 种情况不会进行任务切切换, 1:中断调用, 2. 任务锁定时调用, 3. 延时为0 .
// 以上3种情况, 皆为使用者自己的错误用法, 就是说自己的BUG, 与OS无关
// 正常情况下, 调用OSTimeDly()一定会发生任务切换
|
|