RTOS 开发指南

简介

Quectel FCM242D 和 FGM842D 系列模块支持 QuecOpen® 解决方案。QuecOpen® 是基于 RTOS 系统的嵌入式开发平台。它旨在简化物联网应用的开发和设计。有关 QuecOpen® 的更多信息,请参见 快速入门指南

本文档适用于基于 SDK 构建环境的 QuecOpen® 解决方案,并解释如何在 QuecOpen® 解决方案中为 FCM242D 和 FGM842D 系列模块开发 RTOS。

RTOS 简介

RTOS 定义

需要计算机在特定时间内响应的系统通常被称为关键系统或应用。为了满足这些关键系统或应用的响应时间要求,开发了实时操作系统 (RTOS)。

RTOS 是所有任务都在指定时间内完成的任务完成必须满足时间可预测性的系统。请注意,RTOS 的本质在于其时间上可预测的响应。因此,实时操作系统通常响应非常快。

RTOS 内核对象:tasksemaphoremutexmessage queuetimer

任务

在日常生活中,当我们管理一个严重问题时,我们通常将其分成几个部分来逐一解决。同样,在复杂的程序开发中,我们通常将一个大任务分成多个小任务,并在计算机上逐步处理它们,直到最终完成复杂程序的开发。这种解决方案使操作系统同时运行多个任务以提高处理器利用率。

任务及其内存结构

RTOS 任务通常由三部分组成:任务控制块、任务栈和任务代码。其中,任务控制块与任务代码相关联,并记录每个任务属性。任务栈保存任务环境。下图是 RTOS 任务概述的示意图。

RTOS 任务组成

多个任务的控制块通常以链表形式组织。链表如下图所示:

任务控制块链表

任务状态

任务状态描述如下:

状态 描述
睡眠 任务以代码形式驻留在程序空间(ROM 或 RAM)中,尚未交付给操作系统进行管理。简而言之,如果任务尚未分配任务控制块或已被剥夺任务控制块,则任务处于睡眠状态。
就绪 如果系统为任务分配任务控制块并在任务就绪表中注册任务以供进一步运行,则任务处于就绪状态。
运行 调度器确定就绪状态的任务获得 CPU 使用权,然后任务进入运行状态。一次只能运行一个任务。在就绪任务中,只有当所有优先级高于此任务的任务都变为等待状态时,此任务才能进入运行状态。
等待 如果运行任务正在等待间隔通过或事件发生后再运行,则任务将 CPU 使用权转让给其他任务以进入等待状态。
中断服务 一旦运行任务响应中断请求,它将暂停运行并执行中断服务。此时,任务处于中断服务状态。

任务可以在 5 种不同状态之间切换。切换过程如下图所示:

任务状态切换

任务创建和删除

模块提供的任务创建和删除的 RTOS API 如下所示。有关详细信息,请参见 ql_rtos_task_createql_rtos_task_delete

任务创建:

ql_rtos_status ql_rtos_task_create(
    ql_task_t *taskRef,
    uint32 stackSize,
    uint8 priority,
    char *taskName,
    void (*taskStart)(void*),
    void* argv
);

任务删除:

ql_rtos_status ql_rtos_task_delete(
    ql_task_t taskRef
);

任务创建需要传递的参数是任务句柄指针、任务栈大小、任务优先级、任务名称、任务入口函数和传递给任务的参数。其中,任务栈大小由任务代码决定。

模块任务优先级范围:0 到 9。0 表示最低任务优先级。应用层任务的优先级不应高于 4。

任务代码结构:

void user_task(void * argv)
{
    while(1)
    {
        //process your task
    }
    ql_rtos_task_delete(NULL);
}

注意

  1. 在任务中,退出 while(1) 结构后,必须删除当前任务以释放任务控制块和任务栈占用的资源。将 NULL 传递给 ql_rtos_task_delete(ql_task_t taskRef) 可以删除当前任务。

  2. 如果传递给 ql_rtos_task_delete(ql_task_t taskRef) 的参数不是 NULL,则删除任务句柄指向的任务。

任务管理 API 概述:

函数 描述
ql_rtos_task_create() 创建任务。
ql_rtos_task_delete() 删除任务。
ql_rtos_task_suspend() 挂起任务。
ql_rtos_task_resume() 将任务从挂起状态中取出。
ql_rtos_task_get_current_ref() 获取当前任务句柄。
ql_rtos_task_change_priority() 更改目标任务的优先级。
ql_rtos_task_yield() 立即切换任务。
ql_rtos_task_sleep_ms() 以毫秒为单位设置任务睡眠时间。
ql_rtos_task_sleep_s() 以秒为单位设置任务睡眠时间。
ql_rtos_enter_critical() 进入临界区保护。
ql_rtos_exit_critical() 退出临界区保护。

信号量

当复杂任务被分成几个小任务时,这些小任务应该有序地安排和处理。例如,一个应用被分成任务 A 和任务 B。任务 B 应该等待任务 A 完成相应操作以进一步执行任务 B。此时,任务 B 处于等待状态,直到任务 A 完成其操作。然后,任务 A 向任务 B 发送信号,通知任务 B 现在可以执行。

信号量不仅用于通知,它还可以测量任务执行的数量。如果任务 A 连续多次向任务 B 发送信号,任务 B 可以循环执行。信号量在多任务同步机制中发挥重要作用。

信号量使用伪代码:

sem_t sem;

void taskA(void * argv)
{
    while(1)
    {
        ...
        sem_post(&sem);
        sleep(1);
        ...
    }
}

void taskB(void * argv)
{
    int cnt = 0;
    while(1)
    {
        ...
        sem_wait(&sem);
        printf("got sem for %d time(s)\n", ++cnt);
        ...
    }
}

信号量 API 概述:

函数 描述
ql_rtos_semaphore_create() 创建信号量。
ql_rtos_semaphore_wait() 设置信号量的等待时间。
ql_rtos_semaphore_release() 释放信号量。
ql_rtos_semaphore_get_cnt() 获取信号量值。
ql_rtos_semaphore_delete() 删除信号量。

互斥锁

互斥锁,二进制信号量,其最大值为 1,用于保护共享资源不被多个任务同时访问,从而避免共享资源在同一任务前后访问时上下文不一致,导致一些意外情况(可能很严重)。因此,互斥锁在保护共享资源中发挥重要作用。

互斥锁使用伪代码:

bool bFlag = TRUE;

void taskA(void * argv)
{
    ...
    //lock();
    if(bFlag == TRUE)
    {
        //lableA:
        printf("bFlag value is: %d\n", bFlag);
        bFlag = FALSE;
    }
    //unlock();
    ...
}

void taskB(void * argv)
{
    ...
    //lock();
    if(bFlag == TRUE)
    {
        //lableB:
        printf("bFlag value is: %d\n", bFlag);
        bFlag = FALSE;
    }
    //unlock();
    ...
}

互斥锁 API 概述:

函数 描述
ql_rtos_mutex_create() 创建互斥锁。
ql_rtos_mutex_lock() 锁定互斥锁并永远等待。
ql_rtos_mutex_unlock() 解锁互斥锁。
ql_rtos_mutex_delete() 删除互斥锁。

消息队列

除了通过信号量发送进行交互外,多个任务还可以通过消息队列传递消息。消息队列从一个任务向另一个任务传递消息。消息传递方法:基于要传递的消息的起始地址和大小,一个任务将消息复制到消息队列中,然后向等待消息的另一个任务发送信号量。等待消息的线程将消息队列中的消息复制到本地缓冲区,然后删除队列中的消息。

消息队列使用伪代码:

queue_t queue;

void taskA(void * argv)
{
    while(1)
    {
        ...
        queue_post(&queue, &msg, msg_size);
        sleep(1);
        ...
    }
}

void taskB(void * argv)
{
    int cnt = 0;
    while(1)
    {
        ...
        queue_wait(&queue, &msg, msg_size);
        printf("got msg for %d time(s): %s\n", ++cnt, msg);
        ...
    }
}

消息队列 API 概述:

函数 描述
ql_rtos_queue_create() 创建消息队列。
ql_rtos_queue_wait() 等待队列中的消息。
ql_rtos_queue_release() 释放消息队列。
ql_rtos_queue_delete() 删除消息队列。

定时器

定时器用于定时。在指定时间到达后,定时器将通过回调函数通知用户到期。模块的定时器支持在系统服务和指定任务中执行回调函数。

定时器 API 概述:

函数 描述
ql_rtos_timer_create() 创建定时器。
ql_rtos_timer_start() 启动定时器。时间精度为毫秒。定时器到期后,系统将从睡眠模式中唤醒。
ql_rtos_timer_stop() 停止定时器。
ql_rtos_timer_is_running() 判断定时器是否正在运行。
ql_rtos_timer_delete() 删除定时器。
ql_rtos_timer_change_period() 更改定时器的定时间隔。
ql_rtos_up_time_ms() 获取从系统启动到当前时刻的持续时间。

事件组

事件组是一种任务间通信方式,主要用于实现任务同步。事件通信不涉及数据传输。与信号量不同,它可以实现一对多和多对多的同步。即,一个任务可以等待多个事件的发生。

事件组使用伪代码:

event_t event;

void taskA(void * argv)
{
    while(1)
    {
        ...
        event_set(event, val, in_isr);
        sleep(1);
        ...
    }
}

void taskB(void * argv)
{
    int cnt = 0;
    while(1)
    {
        ...
        event_wait(&event, val, clear_on_exit, wait_all_bits, wait_forever);
        printf("got event for %d time(s)\n", ++cnt);
        ...
    }
}

事件组 API 概述:

函数 描述
ql_rtos_event_group_create 创建事件组。
ql_rtos_event_group_delete 删除事件组。
ql_rtos_event_group_get_bits 获取当前事件组的值。
ql_rtos_event_group_wait_bits 等待事件组。
ql_rtos_event_group_clear_bits 清除事件组的指定位。
ql_rtos_event_group_set_bits 为事件组设置指定位。

任务通知

任务通知是一种机制,其中任务在创建时初始化,在任务内携带资源。它不需要在使用时创建,占用更少的 RAM 空间,并且比使用信号量来解除任务阻塞的方法更快。

任务通知使用伪代码:

void taskA(void * argv)
{
    while(1)
    {
        ...
        task_flags_set(taskB_handle_, flags);
        sleep(1);
        ...
    }
}

void taskB(void * argv)
{
    int cnt = 0;
    while(1)
    {
        ...
        task_flags_wait(wait_forever);
        printf("got task flags for %d time(s)\n", ++cnt);
        ...
    }
}

任务通知 API 概述:

函数 描述
ql_rtos_task_flags_set() 发送任务通知。
ql_rtos_task_flags_wait() 等待任务通知。

RTOS API

数据类型

ql_rtos_status

typedef int ql_rtos_status //RTOS API 返回值的数据类型。

ql_task_t

typedef void * ql_task_t //任务句柄的类型。

ql_sem_t

typedef void * ql_sem_t //信号量句柄的类型。

ql_mutex_t

typedef void * ql_mutex_t //互斥锁句柄的类型。

ql_queue_t

typedef void * ql_queue_t //消息队列句柄的类型。

ql_timer_t

typedef struct
{
    void * handle;
    timer_cb_t function;
    void * arg;
    volatile ql_timer_state_t state;
} ql_timer_t;
  • 参数
参数 描述
handle 定时器句柄。
function 定时器到期的回调函数。
arg 回调函数中的参数。
state 定时器状态。

ql_timer_state_t

typedef enum
{
    QL_TIMER_INIT = 0,
    QL_TIMER_DELETING,
    QL_TIMER_DELETED,
} ql_timer_state_t;
  • 成员
成员 描述
QL_TIMER_INIT 初始化
QL_TIMER_DELETING 删除中
QL_TIMER_DELETED 已删除

ql_wait_e

typedef enum
{
    QL_WAIT_FOREVER = 0xFFFFFFFFUL,
    QL_NO_WAIT = 0
} ql_wait_e;
  • 成员
成员 描述
QL_WAIT_FOREVER 永久等待
QL_NO_WAIT 无等待

ql_event_group_t

typedef void * ql_event_group_t; //事件组句柄的类型。

头文件

ql_osi.h,RTOS API 的头文件,在 SDK 的 ql_components\api\ 目录中。除非另有说明,本文档中提到的所有头文件都在此目录中。

API 描述

ql_rtos_task_create

此函数创建任务。

  • 原型
ql_rtos_status ql_rtos_task_create(
  ql_task_t *taskRef, 
  uint32_t stackSize, 
  uint8_t priority, 
  char *taskName, 
  void (*taskStart)(void*), void* argv
)
  • 参数

    • taskRef: [出] 任务句柄。

    • stackSize: [入] 任务栈大小,由任务代码决定。最大值:128 KB。单位:字节。

    • priority: [入] 任务优先级。范围:0--9。

    • taskName: [入] 任务名称。最大值:16 字节。

    • taskStart: [入] 任务入口函数。

    • argv: [入] 传递给任务的参数。

  • 返回值

    • 0: 执行成功

    • 其他值: 执行失败

ql_rtos_task_delete

此函数删除任务。

  • 原型
ql_rtos_status ql_rtos_task_delete (ql_task_t taskRef)
  • 参数

    • taskRef: [入] 任务句柄。如果参数为 NULL,删除当前任务。否则,删除任务句柄指向的任务。
  • 返回值

    • 0: 执行成功

    • 其他值: 执行失败

ql_rtos_task_suspend

此函数挂起任务。

  • 原型
ql_rtos_status ql_rtos_task_suspend(ql_task_t taskRef)
  • 参数

    • taskRef: [入] 任务句柄。
  • 返回值

    • 0: 执行成功

    • 其他值: 执行失败

ql_rtos_task_resume

此函数将任务从挂起状态中取出。

  • 原型
ql_rtos_status ql_rtos_task_resume(ql_task_t taskRef)
  • 参数

    • taskRef: [入] 任务句柄。
  • 返回值

    • 0: 执行成功
    • 其他值: 执行失败

ql_rtos_task_get_current_ref

此函数获取当前任务句柄。

  • 原型
ql_rtos_status ql_rtos_task_get_current_ref(ql_task_t * taskRef)
  • 参数

    • taskRef: [出] 任务句柄。
  • 返回值

    • 0: 执行成功
    • 其他值: 执行失败

ql_rtos_task_change_priority

此函数更改目标任务的优先级。

  • 原型
ql_rtos_status ql_rtos_task_change_priority(ql_task_t taskRef, uint8 new_priority)
  • 参数

    • taskRef: [入] 任务句柄。
    • new_priority: [入] 任务的新优先级。范围:0--9。0 表示最低任务优先级。
  • 返回值

    • 0: 执行成功
    • 其他值: 执行失败

ql_rtos_task_yield

此函数立即切换任务。

  • 原型
void ql_rtos_task_yield()
  • 参数

  • 返回值

ql_rtos_task_sleep_ms

此函数以毫秒为单位设置任务睡眠时间。

  • 原型
void ql_rtos_task_sleep_ms(uint32 ms)
  • 参数

    • ms: [入] 任务睡眠时间。单位:毫秒。
  • 返回值

ql_rtos_task_sleep_s

此函数以秒为单位设置任务睡眠时间。

  • 原型
void ql_rtos_task_sleep_s(uint32 s)
  • 参数

    • s: [入] 任务睡眠时间。单位:秒。
  • 返回值

ql_rtos_enter_critical

此函数进入临界区保护。

  • 原型
ql_rtos_status ql_rtos_enter_critical(void)
  • 参数

  • 返回值

ql_rtos_exit_critical

此函数退出临界区保护。

  • 原型
ql_rtos_status ql_rtos_exit_critical(void)
  • 参数

  • 返回值

ql_rtos_semaphore_create

此函数创建信号量。

  • 原型
ql_rtos_status ql_rtos_semaphore_create(ql_sem_t *semaRef, uint32 initialCount)
  • 参数

    • semaRef: [出] 信号量句柄。
    • initialCount: [入] 初始信号量值。
  • 返回值

    • 0: 执行成功
    • 其他值: 执行失败

ql_rtos_semaphore_wait

此函数设置信号量的等待时间。

  • 原型
ql_rtos_status ql_rtos_semaphore_wait(ql_sem_t semaRef, uint32 timeout)
  • 参数

    • semaRef: [入] 信号量句柄。
    • timeout: [入] 信号量的等待时间。单位:毫秒。除了以下值外,您还可以根据需要设置等待时间。

QL_WAIT_FOREVER: 永久等待

QL_NO_WAIT: 无等待

  • 返回值

    • 0: 执行成功
    • 其他值: 执行失败

ql_rtos_semaphore_release

此函数释放信号量。

  • 原型
ql_rtos_status ql_rtos_semaphore_release(ql_sem_t semaRef)
  • 参数

    • semaRef: [入] 信号量句柄。
  • 返回值

    • 0: 执行成功
    • 其他值: 执行失败

ql_rtos_semaphore_get_cnt

此函数获取信号量值。

  • 原型
ql_rtos_status ql_rtos_semaphore_get_cnt(ql_sem_t semaRef, uint32* cnt_ptr)
  • 参数

    • semaRef: [入] 信号量句柄。
    • cnt_ptr: [出] 输出信号量。
  • 返回值

    • 0: 执行成功
    • 其他值: 执行失败

ql_rtos_semaphore_delete

此函数删除信号量。

  • 原型
ql_rtos_status ql_rtos_semaphore_delete(ql_sem_t semaRef)
  • 参数

    • semaRef: [入] 信号量句柄。
  • 返回值

    • 0: 执行成功
    • 其他值: 执行失败

ql_rtos_mutex_create

此函数创建互斥锁。

  • 原型
ql_rtos_status ql_rtos_mutex_create(ql_mutex_t *mutexRef)
  • 参数

    • mutexRef: [出] 互斥锁句柄。
  • 返回值

    • 0: 执行成功
    • 其他值: 执行失败

ql_rtos_mutex_lock

此函数锁定互斥锁并永远等待。

  • 原型
ql_rtos_status ql_rtos_mutex_lock(ql_mutex_t mutexRef)
  • 参数

    • mutexRef: [入] 互斥锁句柄。
  • 返回值

    • 0: 执行成功
    • 其他值: 执行失败

ql_rtos_mutex_unlock

此函数解锁互斥锁。

  • 原型
ql_rtos_status ql_rtos_mutex_unlock(ql_mutex_t mutexRef)
  • 参数

    • mutexRef: [入] 互斥锁句柄。
  • 返回值

    • 0: 执行成功
    • 其他值: 执行失败

ql_rtos_mutex_delete

此函数删除互斥锁。

  • 原型
ql_rtos_status ql_rtos_mutex_delete(ql_mutex_t mutexRef)
  • 参数

    • mutexRef: [入] 互斥锁句柄。
  • 返回值

    • 0: 执行成功
    • 其他值: 执行失败

ql_rtos_queue_create

此函数创建消息队列。

  • 原型
ql_rtos_status ql_rtos_queue_create(ql_queue_t *msgQRef, uint32 maxSize, uint32 maxNumber)
  • 参数

    • msgQRef: [入] 消息队列句柄。
    • maxSize: [入] 消息队列支持的最大消息大小。单位:字节。
    • maxNumber: [入] 消息队列支持的最大消息数量。
  • 返回值

    • 0: 执行成功
    • 其他值: 执行失败

ql_rtos_queue_wait

此函数等待队列中的消息。

  • 原型
ql_rtos_status ql_rtos_queue_wait(ql_queue_t msgQRef, uint8 * recvMsg, uint32 size, uint32 timeout)
  • 参数

    • msgQRef: [入] 消息队列。
    • size: [入] 仅为与其他 Quectel 模块兼容而设计的无效参数。值等于创建队列时的 maxSize
    • recvMsg: [入] 接收消息的指针。
    • timeout: [入] 消息队列的等待时间。单位:毫秒。
      特殊值:
      • QL_WAIT_FOREVER: 永久等待
      • QL_NO_WAIT: 无等待
  • 返回值

    • 0: 执行成功
    • 其他值: 执行失败

ql_rtos_queue_release

此函数释放消息队列。

  • 原型
ql_rtos_status ql_rtos_queue_release(ql_queue_t msgQRef, uint32 size, uint8 *msgPtr, uint32 timeout)
  • 参数

    • msgQRef: [入] 消息队列。
    • size: [入] 消息大小。单位:字节。
    • msgPtr: [入] 要发送的数据的起始地址。
    • timeout: [入] 消息队列的等待时间。单位:毫秒。
      特殊值:
      • QL_WAIT_FOREVER: 永久等待
      • QL_NO_WAIT: 无等待
  • 返回值

    • 0: 执行成功
    • 其他值: 执行失败

ql_rtos_queue_delete

此函数删除消息队列。

  • 原型
ql_rtos_status ql_rtos_queue_delete(ql_queue_t msgQRef)
  • 参数

    • msgQRef: [入] 消息队列。
  • 返回值

    • 0: 执行成功
    • 其他值: 执行失败

ql_rtos_timer_create

此函数创建定时器。

  • 原型
ql_rtos_status ql_rtos_timer_create(ql_timer_t* timerRef, uint32_t time_ms, void (* callBackRoutine )(void *), void * timerArgc )
  • 参数

    • timerRef: [入] 定时器句柄。
    • time_ms: [入] 定时器的定时间隔。单位:毫秒。
    • callBackRoutine: [入] 定时器回调函数。
    • timerArgc: [入] 定时器回调函数的参数。
  • 返回值

    • 0: 执行成功
    • 其他值: 执行失败

ql_rtos_timer_start

此函数启动定时器。时间精度为毫秒。定时器到期后,系统将从睡眠模式中唤醒。

  • 原型
ql_rtos_status ql_rtos_timer_start(ql_timer_t timerRef)
  • 参数

    • timerRef: [入] 定时器句柄。
  • 返回值

    • 0: 执行成功
    • 其他值: 执行失败

ql_rtos_timer_stop

此函数停止定时器。

  • 原型
ql_rtos_status ql_rtos_timer_stop(ql_timer_t timerRef)
  • 参数

    • timerRef: [入] 定时器句柄。
  • 返回值

    • 0: 执行成功
    • 其他值: 执行失败

ql_rtos_timer_is_running

此函数判断定时器是否正在运行。

  • 原型
ql_rtos_status ql_rtos_timer_is_running(ql_timer_t timerRef)
  • 参数

    • timerRef: [入] 定时器句柄。
  • 返回值

    • 1: 定时器正在运行。
    • 0: 定时器未运行。

ql_rtos_timer_delete

此函数删除定时器。

  • 原型
ql_rtos_status ql_rtos_timer_delete(ql_timer_t timerRef)
  • 参数

    • timerRef: [入] 定时器句柄。
  • 返回值

    • 0: 执行成功
    • 其他值: 执行失败

ql_rtos_timer_change_period

此函数更改定时器的定时间隔。

  • 原型
ql_rtos_status ql_rtos_timer_change_period(ql_timer_t timerRef, uint32_t time_ms)
  • 参数

    • timerRef: [入] 定时器句柄。
    • time_ms: [入] 定时器的新定时间隔。单位:毫秒。
  • 返回值

    • 0: 执行成功
    • 其他值: 执行失败

ql_rtos_up_time_ms

此函数获取从系统启动到当前时刻的持续时间。

  • 原型
uint32_t ql_rtos_up_time_ms()
  • 参数

  • 返回值

    • 从系统启动到当前时刻的持续时间。单位:毫秒。

ql_rtos_event_group_create

此函数创建事件组。

  • 原型
ql_rtos_status ql_rtos_event_group_create(ql_event_group_t *event_group)
  • 参数

    • event_group: [入] 事件组。
  • 返回值

    • 0: 执行成功
    • 其他值: 执行失败

ql_rtos_event_group_delete

此函数删除事件组。

  • 原型
void ql_rtos_event_group_delete(ql_event_group_t event_group)
  • 参数

    • event_group: [入] 事件组。
  • 返回值

ql_rtos_event_group_get_bits

此函数获取当前事件组的事件位。

  • 原型
uint32_t ql_rtos_event_group_get_bits(ql_event_group_t event_group)
  • 参数

    • event_group: [入] 事件组。
  • 返回值

    • 当前事件组的事件位。

ql_rtos_event_group_wait_bits

此函数等待事件组。

  • 原型
uint32_t ql_rtos_event_group_wait_bits(
    ql_event_group_t event_group,
    const uint32_t val,
    const bool clear_on_exit,
    const bool wait_all_bits,
    int timeout
)
  • 参数

    • event_group: [入] 事件组。
    • val: [入] 事件组的事件位。
    • clear_on_exit: [入] 函数退出后是否清除事件组。
    • wait_all_bits: [入] 是否等待所有指定事件。
    • timeout: [入] 等待的超时时间。单位:毫秒。
      特殊值:
      • QL_WAIT_FOREVER: 永久等待
      • QL_NO_WAIT: 无等待
  • 返回值

    • 0: 执行成功
    • 其他值: 执行失败

ql_rtos_event_group_clear_bits

此函数清除事件组的指定位。

  • 原型
uint32_t ql_rtos_event_group_clear_bits(ql_event_group_t event_group, const uint32_t val, bool isr)
  • 参数

    • event_group: [入] 事件组。
    • val: [入] 事件组的事件位。
    • isr: [入] 当前是否处于中断状态。
      特殊值:
      • 1: 在中断中
      • 0: 不在中断中
  • 返回值

    • 0: 执行成功
    • 其他值: 执行失败

ql_rtos_event_group_set_bits

此函数为事件组设置指定位。

  • 原型
uint32_t ql_rtos_event_group_set_bits(ql_event_group_t event_group, const uint32_t val, bool isr)
  • 参数

    • event_group: [入] 事件组。
    • val: [入] 事件组的事件位。
    • isr: [入] 当前是否处于中断状态。
      特殊值:
      • 1: 在中断中
      • 0: 不在中断中
  • 返回值

    • 0: 执行成功
    • 其他值: 执行失败

ql_rtos_task_flags_set

此函数发送任务通知。对象任务接收通知后,将与其自身的任务通知值进行按位或运算。

  • 原型
ql_rtos_status ql_rtos_task_flags_set (ql_task_t taskRef, uint32_t flags)
  • 参数

    • taskRef: [入] 任务句柄。
    • flags: [入] 要发送的任务通知值。
  • 返回值

    • 0: 执行成功
    • 其他值: 执行失败

ql_rtos_task_flags_wait

此函数等待任务通知。

  • 原型
uint32_t ql_rtos_task_flags_wait (uint32_t timeout)
  • 参数

timeout: [入] 等待的超时时间。

  • 返回值

    • 1: 成功等待任务通知。

    • 其他值: 等待任务通知超时。

示例文件

ql_osi_demo,RTOS API 的示例文件,在 SDK 的 ql_applicationexampleosi_demo 目录中。您可以参考此文件来实现相关功能。

附录参考

相关文档:

文档名称
Quectel_FCM242D&FGM842D_Series_QuecOpen(SDK)_Quick_Start_Guide

术语和缩略语:

缩略语 描述
API 应用程序编程接口
CPU 中央处理器
IoT 物联网
PC 个人计算机
RAM 随机存取存储器
ROM 只读存储器
RTOS 实时操作系统
SDK 软件开发工具包