(3)基于软件的栈溢出检测 任务切换时会调用一个钩子函数:OSTaskSwHook(),这允许程序员在任务切换时扩展一些功能。所以,如果处理器没有硬件栈指针溢出检测的机制的话,可以通过在钩子函数中添加些代码来模拟出这个机制。由于软件实现没有硬件监测来的及时,.StkLimitPtr设置时需要留下更多空间。 (4)统计剩余栈空间 ...
OS_TASK_SW()将处理器相关的软件中断机制封装起来,便于操作系统移植 10.调度时机 1.用函数OSTaskCreate( )创建任务 应用程序通过调用OSTaskCreate( )函数来创建一个任务,OSTaskCreate( )函数的原型如下: INT8UOSTaskCreate(void(*task)(void*pd),//指向任务的指针void*pdata,//传递给任务的参数OS_STK*ptos...
OSTaskDelHook(); OSTaskSwHook(); OSTaskStatHook(); OSTimeTickHook(); OSTCBInitHook (); OSTaskIdleHook (); 实际需要修改的只有OSTaskStkInit()函数,其它九个函数都是由用户定义的。如果用户需要使用这九个函数,可将文件OS_CFG.H中的#define constant OS_CPU_HOOKS_EN设为1,设为0表示不使用这些函数。本...
OSTaskSwHook(); //调用钩子函数 asm{ ldx OSTCBCur // 加载OSTCBCur 的地址到 x lds 0,x //把OSTCBStrPtr 载入堆栈指针 sp ldaa OSRunning inca // SRunning = TRUE staa OSRunning rti } } 3.2.4 任务级任务切换函数OSCtxSw()和中断级任务切换函数OSIntCtxSw() ...
jsr OSTaskSwHook //调用用户定义接口函数 lda OSRunning //设置OSRunning变量,标志进入多任务模式 inca sta OSRunning ldx OSTCBHighRdy //取得最高优先级就绪任务TCB地址 stx OSTCBCur //保存到OSTCBCur中 pshx ldx OSTCBHighRdy:1//保存地址的第二个字节 ...
因此,这部分代码需要在任务的切换过程中和中断返回时执行。在本实验中,这部分代码写在μC/OS—II扩展文件os_cpu_c.c中的OSTaskSwHook()函数中,同时在OSIntCtxSw()中也用了这个函数。 3.4 设置处理器的频率和电压 由于设置处理器的频率和电压是与操作系统所运行的硬件平台相关的,不同的处理器设置处理器频率和...
OSTaskDelHook() OSTaskSwHook() OSTaskStatHook() OSTimeTickHook() 实际需要修改的只有OSTaskStkInit()函数,其他五个函数需要声明,但不一定有实际内容。这五个函数都是用户定义的,所以OS_CPU_C.C中没有给出代码。如果需要使用这些函数,可以将文件OS_CFG.H中的#define constant OS_CPU_HOOKS_EN设为1,设为0表...
OS_TASK_SW(); /* Perform a context switch */ } } } OS_EXIT_CRITICAL(); } 在该函数中,简单的讲,只是做了两件事,首先找出当前优先级最高的就绪任务(也可能是运行态任务本身),其次调用了任务级的任务切换函数OS_TASK_SW(),由此进行切换任务间的出栈入栈操作,并模拟一次CPU中断完成任务切换。
当需要在中 断发生后切换到更高优先级的任务时,调用中断级任务切换函数OSIntCtxSw(),然后执行用户调用函数OSTaskSwHook()。因为该函数是在中断程序中被调用,所以不需要保存中断任务的寄存器;中断子程序在调用函数OSInExit()时,将返回地址压入堆栈,在这里不需要再返回,所以必须从堆栈中清理掉返回地址。