Edit online

非命令队列模式

29 Nov 2024
Read time: 1 minute(s)

非命令队列模式,即 normal 模式。

GE normal 模式的控制流程如下所示:
  • GE HAL 层已经实现了 GE 的完整功能,可以不依靠 MPP 层和 DRV 层进行运行。

  • 在一般情况下,不会直接操作 HAL 层,而是通过 MPP 层间接操作 GE。

在 Normal 模式下,可用 hal_ge_control 控制 GE,包括以下几种操作:

  • IOC_GE_VERSION

  • IOC_GE_MODE

  • IOC_GE_FILLRECT

  • IOC_GE_BITBLT

  • IOC_GE_ROTATE

在 normal 模式下,对 IOC_GE_FILLRECTIOC_GE_BITBLTIOC_GE_ROTATE 接口的调用是同步的,即硬件执行任务完成后接口调用才会返回。

关键流程设计

在 normal 模式下,GE 驱动各种功能都是通过 hal_ge_control 调用来实现。

每一次 hal_ge_control 的调用都包括以下步骤:
  1. GE 参数配置。
  2. GE 模块中断开启。
  3. GE 硬件启动。
  4. GE 等待中断,当前线程进入等待状态,直到收到中断通知。
  5. 硬件完成任务后,关闭中断。

hal_ge_control 通过 mutex 保护,确保多线程环境下的安全性。在 normal 模式下,支持多应用同时打开驱动,并调用 hal_ge_control


ge_sw_normal_interrupt

1. Normal 模式中断流程

等待中断流程:

  • 在调用 hal_ge_init 时创建事件集: data → wait = aicos_event_create()

  • hal_ge_control 中调用如下函数,使当前应用在等待事件中睡眠:

    ret = aicos_event_recv(data->wait, HW_RUNNING_EVENT, &recved, GE_TIMEOUT)
  • 在中断服务程序中调用 aicos_event_send(data->wait, HW_RUNNING_EVENT),唤醒等待队列中的睡眠进程。