当前位置: 首页 > 文档资料 > YoC 编程基础 >

任务

优质
小牛编辑
114浏览
2023-12-01

概述

现代操作系统都建立在任务的基础上,任务是rhino中代码的一个基本执行环境,有的操作系统也称之为线程(thread)。多任务的运行环境提供了一个基本机制让上层应用软件来控制/反馈真实的/离散的外部世界,从宏观上可以看作单个CPU执行单元上同时执行多个任务,微观上看,CPU快速地切换任务来执行。Rhino实时操作系统支持多任务机制。 每个任务都具有上下文(context),上下文context是指当任务被调度执行的时候此任务能看见的CPU资源和系统资源,,当发生任务切换的时候,任务的上下文被保存在任务控制块(ktask_t)中,这些上下文包括当前任务的CPU指令地址(PC指针),当前任务的栈空间,当前任务的CPU寄存器状态等等。 任务管理功能的相关源码位于:/components/rhino/core/目录中。

包含头文件

#include <aos/aos.h>
#include <aos/kernel.h>
#include <k_task.h>

接口定义

动态创建一个任务

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:任务栈大小(单位:字节)
  • 返回值:

    • 类型:0 返回成功 小于0返回失败

动态创建一个任务(扩展)

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任务)
  • 返回值:

    • 类型:0 返回成功 小于0返回失败

任务自动退出

void aos_task_exit(int code)

任务自动退出 受宏RHINO_CONFIG_KOBJ_DYN_ALLOC开关控制

  • 参数:

  • code:暂时无用

  • 返回值: 无返回参数

返回任务名

const char *aos_task_name(void)

返回任务名

  • 参数:

    • 无入参
  • 返回值:

    • 类型:char *;任务名

返回任务私有数据区域的空闲块索引

int aos_task_key_create(aos_task_key_t *key)

返回任务私有数据区域的空闲块索引

  • 参数:

    • key: 任务私有数据区域的空闲块索引; 范围0~RHINO_CONFIG_TASK_INFO_NUM-1; 每索引块可存放一个void*地址
  • 返回值:

    • 类型:0 返回成功 小于0返回失败

删除任务私有数据区域的空闲块索引

void aos_task_key_delete(aos_task_key_t key)

删除任务私有数据区域的空闲块索引

  • 参数:

    • Key: 任务私有数据区域的空闲块索引 范围0~RHINO_CONFIG_TASK_INFO_NUM-1
  • 返回值:

设置当前任务私有数据区域的某索引空闲块内容

int aos_task_setspecific(aos_task_key_t key, void *vp)

设置当前任务私有数据区域的某索引空闲块内容; 受宏RHINO_CONFIG_TASK_INFO开关控制

  • 参数:

    • Key: 当前任务私有数据区域的空闲块索引; 范围0~RHINO_CONFIG_TASK_INFO_NUM-1;
    • vp: 需要存放进入任务私有空闲区域的地址指针
  • 返回值: 0 返回成功 小于0返回失败

获取当前任务私有数据区域的某索引数据块内容

void *aos_task_getspecific(aos_task_key_t key)

获取当前任务私有数据区域的某索引数据块内容; 受宏RHINO_CONFIG_TASK_INFO开关控制

  • 参数:

    • Key: 任务私有数据区域的空闲块索引; 范围0~RHINO_CONFIG_TASK_INFO_NUM-1
  • 返回值:

    • void*:私有区域某索引内容

任务挂起若干毫秒

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 0x%x. \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(task_key);
    printf("%s task key 0x%x. \r\n", aos_task_name(), *(int*)task_value);

    /* 删除任务私有数据区域的空闲块索引 */
    aos_task_key_delete(task_key);

    /* 任务退出 */
    aos_task_exit(0);
}