您的位置:首页 > 编程语言

Zephys OS nano 内核篇:task 服务 - 基础

2016-10-07 17:05 337 查看
Zephyr OS 所有的学习笔记已托管到 Github,CSDN 博客里的内容只是 Github 里内容的拷贝,因此链接会有错误,请谅解。

最新的学习笔记请移步 GitHub:https://github.com/tidyjiang8/zephyr-inside

task 的概念

task 的生命周期

task 调度

定义后台 task

task 的概念

nanokernel 中的 task 是一个可抢占式的线程。task 主要用于处理那些太复杂或者执行时间太长而不能由 fiber 和 isr 完成的工作。

nanokernel 的应用程序可以且必须定义一个 task,即所谓的后台(background) task。只有没有 fiber 和 isr 在运行时,后台 task 才会运行。后台 task 的入口函数是 main() 函数。

注意,nanokernel 中的后台 task 与 microkernel 中的通用 task 有很大的不同,具体信息请参考 microkernel 相关章节。

task 的生命周期

在系统启动进行初始化时,内核会自动运行后台 task,即自动运行 main() 函数。更多信息请参考《Zephyr OS nano 内核篇:系统启动流程(C语言部分)》。

后台 task 一旦被启动,它将永远执行下去(这里的永远执行下去指的是不会被杀死)。如果后台 task 主动从 main() 函数中返回了,内核会将这个 task 放入一个永久的空转状态()。

task 调度

由于 task 的优先级比 fiber 和 isr 的优先级低,所以只有系统中没有 fiber 和 isr 需要执行时才会执行这个后台 task。

由于 task 是可抢占式的,所以当有新的 fiber 或者 isr 需要执行时,新的 fiber 或者 isr 会抢占当前 task 的 CPU 使用权,这是一个上下文切换的过程。当进行上下文切换时,内核会自动保存后台 task 的 CPU 的寄存器的值到内存中。当后台 task 在后来恢复执行时,这些值将从恢复到寄存器中。

定义后台 task

应用程序必须定义后台 task,其格式如下:

void main(void)
{
/* background task processing */
...
/* (optional) enter permanent idling state */
return;
}


内核配置选项 CONFIG_MAIN_STACK_SIZE 指定了后台 task 在内存中所使用的栈空间的大小,以字节为单位。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息