任务管理
更新时间:2019-02-13 14:01:21
概念
现代操作系统都建立在任务的基础上,任务是rhino中代码的一个基本执行环境,有的操作系统也称之为线程(thread)。多任务的运行环境提供了一个基本机制让上层应用软件来控制/反馈真实的/离散的外部世界,从宏观上可以看作单个CPU执行单元上同时执行多个任务,微观上看,CPU快速地切换任务来执行。Rhino实时操作系统支持多任务机制。
每个任务都具有上下文(context),上下文context是指当任务被调度执行的时候此任务能看见的CPU资源和系统资源,,当发生任务切换的时候,任务的上下文被保存在任务控制块(ktask_t)中,这些上下文包括当前任务的CPU指令地址(PC指针),当前任务的栈空间,当前任务的CPU寄存器状态等等。
任务管理功能的相关源码位于:/kernel/rhino/core/目录中。
包含头文件
#include <aos/aos.h>
#include <aos/kernel.h>
#include "k_task.h"
API列表
名称 | 描述 |
---|---|
aos_task_new() | 动态创建一个任务,任务句柄不返回,创建完后自动运行 |
aos_task_new_ext() | 动态创建一个任务,传入任务句柄,并指定优先级,创建完后自动运行 |
aos_task_exit() | 任务自动退出 |
aos_task_delete() | 任务删除 |
aos_task_name() | 返回任务名 |
aos_task_key_create() | 返回任务私有数据区域的空闲块索引(目前用于yloop,2.1版本后不用于yloop) |
aos_task_key_delete() | 删除任务私有数据区域的空闲块索引(目前用于yloop,2.1版本后不用于yloop) |
aos_task_setspecific() | 设置当前任务私有数据区域的某索引空闲块内容(目前用于yloop,2.1版本后不用于yloop) |
aos_task_getspecific() | 获取当前任务私有数据区域的某索引数据块内容(目前用于yloop,2.1版本后不用于yloop) |
aos_msleep() | 任务挂起若干毫秒 |
API 详情
aos_task_new()
定义描述
函数原型 | int aos_task_new(const char name, void (fn)(void ), void arg, int stack_size); |
---|---|
描述 | 动态创建一个任务,任务句柄不返回,创建完后自动运行 采用默认优先级AOS_DEFAULT_APP_PRI(32) |
受宏RHINO_CONFIG_KOBJ_DYN_ALLOC开关控制
|
| 入参 | name:任务名 |
| | fn:任务处理函数 |
| | Arg: 任务处理函数参数 |
| | stack_size:任务栈大小(单位:字节) |
| 返回值 | 类型:int 返回成功或失败 |
aos_task_new_ext()
定义描述
函数原型 | int aos_task_new_ext(aos_task_t task, const char name, void (fn)(void ), void *arg, int stack_size, int prio); |
---|---|
描述 | 动态创建一个任务,传入任务句柄,并指定优先级,创建完后自动运行 受宏RHINO_CONFIG_KOBJ_DYN_ALLOC开关控制 |
入参 | task:任务句柄 |
name:任务名 | |
fn:任务处理函数 | |
Arg: 任务处理函数参数 | |
stack_size:任务栈大小(单位:字节) | |
Prio:任务运行优先级 (范围:0~ RHINO_CONFIG_PRI_MAX-2; RHINO_CONFIG_PRI_MAX-1为idle任务) | |
返回值 | 类型:int 返回成功或失败 |
aos_task_exit()
定义描述
函数原型 | void aos_task_exit(int code) |
---|---|
描述 | 任务自动退出 受宏RHINO_CONFIG_KOBJ_DYN_ALLOC开关控制 |
入参 | code:暂时无用 |
返回值 | 无返回参数 |
aos_task_delete()
定义描述
函数原型 | int aos_task_delete(char *name) |
---|---|
描述 | 任务删除 |
入参 | name:任务名 |
返回值 | 类型:int 返回成功或失败 |
aos_task_name()
定义描述
函数原型 | const char *aos_task_name(void) |
---|---|
描述 | 返回任务名 |
入参 | 无入参 |
返回值 | 类型:char *;任务名 |
aos_task_key_create()
定义描述
函数原型 | int aos_task_key_create(aos_task_key_t *key) |
---|---|
描述 | 返回任务私有数据区域的空闲块索引 |
出参 | Key: 任务私有数据区域的空闲块索引; |
范围0~RHINO_CONFIG_TASK_INFO_NUM-1;
每索引块可存放一个void*地址
|
| 返回值 | 类型:int;成功或失败 |
aos_task_key_delete()
定义描述
函数原型 | void aos_task_key_delete(aos_task_key_t key) |
---|---|
描述 | 删除任务私有数据区域的空闲块索引 |
出参 | Key: 任务私有数据区域的空闲块索引 |
范围0~RHINO_CONFIG_TASK_INFO_NUM-1 |
| 返回值 | 无 |
aos_task_setspecific()
定义描述
函数原型 | int aos_task_setspecific(aos_task_key_t key, void *vp) |
---|---|
描述 | 设置当前任务私有数据区域的某索引空闲块内容; |
受宏RHINO_CONFIG_TASK_INFO开关控制
|
| 出参 | Key: 当前任务私有数据区域的空闲块索引;
范围0~RHINO_CONFIG_TASK_INFO_NUM-1;
Vp: 需要存放进入任务私有空闲区域的地址指针 |
| 返回值 | Int:成功或失败 |
aos_task_getspecific()
定义描述
函数原型 | void *aos_task_getspecific(aos_task_key_t key) |
---|---|
描述 | 获取当前任务私有数据区域的某索引数据块内容; |
受宏RHINO_CONFIG_TASK_INFO开关控制
|
| 出参 | Key: 任务私有数据区域的空闲块索引;
范围0~RHINO_CONFIG_TASK_INFO_NUM-1
|
| 返回值 | Void*:私有区域某索引内容 |
aos_msleep()
定义描述
函数原型 | void aos_msleep(int ms) |
---|---|
描述 | 将当前任务睡眠,单位ms |
参数 | 输入参数类型int,表示睡眠ms数 |
返回值 | 无 |
调用示例
创建一个任务,获取任务名字,创建任务私有数据区域,设置私有区域内容、获取私有区域内容,删除私有数据区域,任务退出
/* 创建任务test_task,任务栈大小为1024字节 */
aos_task_new("test_task", test_task, NULL, 1024)
static void test_task(void *paras)
{
int ret = -1;
int var = 0;
aos_task_key_t task_key;
void *task_value = NULL;
/* 创建任务私有数据区域*/
ret = aos_task_key_create(&task_key);
/* 打印任务名和任务私有数据区域索引值*/
printf("%s task key %d: \r\n", aos_task_name(), task_key);
aos_msleep(10); // 任务休眠10ms
var = 0x5a5a;
/* 设置当前任务私有数据区域的某索引空闲块内容 */
ret = aos_task_setspecific(task_key, &var);
/* 获取当前任务私有数据区域的某索引数据块内容 */
task_value = aos_task_getspecific(taks_key);
printf("%s task key %d: \r\n", aos_task_name(), *(int*)task_value);
/* 删除任务私有数据区域的空闲块索引 */
aos_task_key_delete(task_key);
/* 任务退出 */
aos_task_exit(0);
}