附录 F - GUIX RTOS 绑定服务

GUIX 需要底层 RTOS 提供的线程或任务服务、互斥、事件队列和计时服务。 默认情况下,GUIX 已配置为使用 ThreadX 实时操作系统来提供这些服务。 若要将 GUIX 移植到其他操作系统,开发人员应 # 定义预处理器指令 GX_DISABLE_THREADX_BINDING,并重新生成 GUIX 库,以删除 ThreadX 依赖项。 此外,开发人员还需要提供以下宏定义和支持函数。 这些宏定义和支持函数的示例可在文件 gx_system_rtos_bind.h 和 gx_system_rtos_bind.c 中找到,其中提供了通用 RTOS 集成示例。

系统集成宏:

GX_RTOS_BINDING_INITIALIZE

此宏在系统初始化过程中调用。 应定义宏,以便在使用之前调用准备 RTOS 系统服务或 RTOS 资源所需的任何函数。 这是一个绑定机会,可用于准备 GUIX 将使用的 RTOS 资源。

GX_SYSTEM_THREAD_START

此宏在 GUIX 任务或线程应开始执行时调用。 应定义此宏,以便调用将让 GUIX 线程启动运行的函数。 GUIX 线程的入口点将传递给被调用的函数。 被调用函数的签名必须是

UINT function_name(VOID (thread_entry_point)(VOID));

此函数应返回 GX_SUCCESS(如果线程已成功启动)或 GX_FAILURE。

GX_EVENT_PUSH

调用此宏可将事件推送到 GUIX 使用的 FIFO 事件队列。 移植到新的 RTOS 时,你负责以线程安全的方式实现此事件队列。 必须将 GX_EVENT 结构复制到此队列中,并从该队列中复制出来,也就是说,GX_EVENT 指针队列将不起作用,因为从事件生成方的角度来看,GUIX 事件可以是自动变量。 此宏调用的函数的签名必须是:

UINT function_name (GX_EVENT event_ptr);*

如果事件已推送到事件队列中,此函数应返回 GX_SUCCESS,否则应返回 GX_FAILURE。

GX_EVENT_POP

调用此宏可从 GUIX 事件队列中删除(最旧的)头事件,并将其复制到请求的位置。 如果当前事件队列中没有事件,此函数必须能够选择阻止或等待事件。 此宏调用的函数的签名必须是

UINT function_name(GX_EVENT *put_event, GX_BOOL wait)

如果 wait 参数为 GX_TRUE,在提供事件之前,该函数不应返回。 如果 wait 参数为 GX_FALSE,该函数应立即返回,无论是否有事件。

如果从队列中检索到事件,则应将其复制到 put_event 位置,并且返回状态为 GX_SUCCESS。 否则,返回状态应为 GX_FAILURE。

GX_EVENT_FOLD

此宏由 GUIX 调用,用于将事件折叠到 FIFO 事件队列中。 折叠某个事件表示,如果队列中已经存在相同类型的事件,则将该条目更新为包含新事件的有效负载。 如果在队列中找不到相同类型的现有事件,则会将新事件推送到队列中。

对于无法实现事件折叠功能的绑定,只需调用 GX_EVENT_PUSH 即可。

GX_TIMER_START

此宏在 GUIX 需要接收定期计时器输入时调用。 此宏应该调用启动低级别 RTOS 定期计时器服务的服务。 如果无法轻松停止和启动 RTOS 计时器服务,则可让此服务一直运行,但效率较低。

当低级别 RTOS 计时器服务定期过期时,绑定必须调用 GUIX 系统函数 _gx_system_timer_expiration(0)。定期调用此函数可以驱动高级别 GUIX 计时器小组件计时器服务。

GX_TIMER_STOP

此宏在 GUIX 不再需要定期计时器时(即没有活动 GUIX 计时器运行时)调用。 如果无法轻松停止和启动 RTOS 计时器服务,则可让此服务一直运行并定义此宏不执行任何操作,但效率较低。

GX_SYSTEM_MUTEX_LOCK

此宏由 GUIX 在关键代码段中调用,用于防止其他任务抢占和修改通用数据结构,从而可能导致损坏。 此宏应调用实现适当的 RTOS 资源锁定服务的函数。

如果从不在 GUIX 线程之外使用任何 GUIX API 服务,则可将此宏定义为不执行任何操作。

GX_SYSTEM_MUTEX_UNLOCK

此宏在关键代码段结束时调用,应该使用适当的底层 RTOS 服务解锁 GUIX 资源。 如果从不在 GUIX 线程之外使用任何 GUIX API 服务,则可将此宏定义为不执行任何操作。

GX_SYSTEM_TIME_GET

此宏应调用返回当前系统时间为“系统时钟周期”的函数,这通常是自系统启动以来发生的低级计时器中断的数量。 此服务用于计算触控输入笔势的触控事件触笔速度。 此宏调用的函数的签名必须是:

ULONG function_name(VOID);

GX_CURRENT_THREAD

调用此宏可标识当前正在执行的线程。 此宏调用的服务必须返回 void *,这表示操作系统用于标识当前执行线程的数据类型必须转换为 void * 才能返回到 GUX。

在提交的 gx_system_rtos_bind.h 和 gx_system_rtos_bind.c 中实现了通用 RTOS 绑定的完整示例