文档

工作队列

更新时间:
一键部署

更正文档

概述

在操作系统中,如果我们需要进行一项工作处理,往往需要创建一个任务来加入内核的调度队列。一个任务对应一个处理函数,如果要进行不同的事务处理,则需要创建多个不同的任务。任务作为CPU调度的基本单元,任务数量越大,则调度成本越高。工作队列(workqueue)机制简化了基础的任务创建和处理机制,一个workqueue对应一个实体task任务处理,workqueue下面可以挂接多个work实体,每一个work实体都能对应不同的处理接口。即用户只需要创建一个workqueue,则可以完成多个挂接不同处理函数的工作队列。其次,当某些实时性要求较高的任务中,需要进行较繁重钩子处理时,可以将其处理函数挂在workqueue中,其执行过程将位于workqueue的上下文,而不会占用原有任务的处理资源。另外,workqueue还提供了work的延时处理机制,用户可以选择立即执行或是延时处理。当应用需要创建大量实时性要求不高的任务时,可以使用workqueue来统一调度;或者将任务中实时性要求不高的部分处理延后到workqueue中处理。如果需要设置延后处理,则需要使用work机制。注意:该机制不支持周期work的处理。

工作机制

workqueue的处理依赖于task任务。一个workqueue队列会创建关联其对应的task任务,一个workqueue会挂载多个work处理,每个work处理对应一个处理函数。当workqueue得到调度,即其关联的task得到运行,在每次task的调度期间,都会从工作队列中按照先后顺序取出一个work来进行处理。workqueue模块在初始化时,会创建一个系统默认的工作队列,用户可根据需要将work添加到该队列中去执行。

工作队列功能函数

函数名

描述

aos_workqueue_create()

工作队列创建函数

aos_workqueue_del()

工作队列删除函数

aos_work_init()

work创建函数

aos_work_destroy()

work销毁函数

aos_work_run()

work触发函数

aos_work_sched()

work触发函数(由系统默认工作队列来执行)

aos_work_cancel()

工作队列删除函数

常用配置

说明

消息队列功能:默认使能,如需修改,在YAML中修改RHINO_CONFIG_BUF_QUEUE配置

def_config:
  RHINO_CONFIG_WORKQUEUE: 0

API说明

使用示例

  1. t0时刻,任务T调用aos_sem_create()创建一个信号量,调用aos_workqueue_create()创建一工作队列wq1。 任务T然后调用aos_work_init()创建7个任务:work0、work1、work2、work3、work4、work5、work6,延迟参数分别为0、0、1、20、18、40、50。

  2. t1时刻,任务T调用aos_work_run()依次: a、将work0加入工作队列wq1 b、将work1加入工作队列wq1 c、将work1再次工作队列wq1 d、将work2加入工作队列wq1 e、将work2加入工作队列wq1 f、将work3加入工作队列wq1 g、将work4加入系统默认工作队列 h、将work5加入系统默认工作队列 i、将work6加入系统默认工作队列

  3. t2时刻,任务T调用aos_sem_wait()等待信号量进入阻塞状态,

  4. t3时刻,work4被执行释放信号量,任务T解除阻塞,将work5再加入系统默认工作队列后因等待信号量进入阻塞状态

  5. t4时刻,work5被执行释放信号量,任务T解除阻塞,释放资源。

步骤1 创建或打开工程

打开已有工程

如果用于测试的案例工程已存在,可参考《AliOS Things集成开发环境使用说明之打开工程》打开已有工程。

创建新的工程

组件的示例代码可以通过编译链接到AliOS Things的任意案例(solution)来运行,这里选择helloworld_demo案例。helloworld_demo案例相关的源代码下载可参考《AliOS Things集成开发环境使用说明之创建工程》

步骤2 添加组件

案例下载完成后,需要在helloworld_demo组件的package.yaml中添加对组件的依赖:

depends:
  - osal_aos: dev_aos # helloworld_demo中引入osal_aos组件

步骤3 下载组件

在已安装了的开发环境工具栏中,选择Terminal -> New Terminal启动终端,并且默认工作路径为当前工程的workspace,此时在终端命令行中输入:

aos install osal_aos

上述命令执行成功后,组件源码则被下载到了./components/osal_aos路径中。

步骤4 添加示例

说明

osal_aos组件的package.yaml中添加example示例代码:

depends:
  - rhino: dev_aos
  - cli: dev_aos # 添加cli依赖
source_file:
  - "*.c"
  - "example/workqueue_example.c" # 添加 workqueue_example.c

步骤5 编译固件

在示例代码已经添加至组件的配置文件,并且helloworld_demo已添加了对该组件的依赖后,就可以编译helloworld_demo案例来生成固件了,具体编译方法可参考《AliOS Things集成开发环境使用说明之编译固件》

步骤6 烧录固件

helloworld_demo案例的固件生成后,可参考《AliOS Things集成开发环境使用说明之烧录固件》来烧录固件。

步骤7 打开串口

固件烧录完成后,可以通过串口查看示例的运行结果,打开串口的具体方法可参考《AliOS Things集成开发环境使用说明之查看日志》

当串口终端打开成功后,可在串口中输入help来查看已添加的测试命令。

步骤8 测试示例

说明

CLI命令行输入:

workqueue_example
说明

关键日志:

--WORK 0--
--WORK 1--
--WORK 1--
--WORK 2--
--WORK 4--
--WORK 3--
--WORK 6--
--WORK 5--

注意事项

  • 当work延时参数为0时,调用aos_work_run()触发多次,则会在对应工作队列中会被执行多次;若work延迟参数不为0,调用aos_work_run()触发多次,则只会在对应工作队列中被执行一次。

FAQ

Q1: 系统默认工作队列对应的任务优先级和栈大小是多少? 答:优先级为:20,栈大小为:3072字节。

  • 本页导读 (0)