uCos的任务调用与通常意义下的函数调用的区别
通常意义下的函数调用是指以下情况:
- 保存当前调用函数(程序)的环境,程序指针跳转到被调用函数入口处,执行完被调用函数后,从堆栈中恢复调用函数的环境,继续执行原程序。
- 调用函数和被调用函数共用相同的堆栈,实际上被调用函数没有堆栈。
- 被调用函数的调用执行是由调用函数发出的。
- 被调用函数被调用后立即执行。
uCos的任务调用是指以下情况:
- 每个任务都有独立的堆栈空间,uCos下的任务调用是先把当前任务的执行环境保存在它自己的堆栈中,然后从被调用任务的堆栈恢复被调用任务的环境,这两个任务占用不同的堆栈空间。
- 被调用任务的入口地址来自其堆栈,而不是函数标号。
- 被调用函数的调用执行是由uCos调度器发出的,即由uCos内核调用的,而不是某个任务。
- 被调用任务进入就绪状态,即可以执行,但有可能不会立即执行。所以在一定意义上,任务的调度可以理解为返回到那个函数去执行,而不是调用那个函数来执行。任务永远不会返回,当前任务完成特定的功能后,释放微处理器占用权,进入等待状态,等待下一个“该函数返回”。当微处理器空闲时,uCos执行系统定义的优先级最低的空闲任务,这时每个时钟节拍到达时进行任务就绪状态检查和调度管理。