ML307R 模组软件调试之操作系统 RTOS 解析

本文由 简悦 SimpRead 转码, 原文地址 triot.blog.youkuaiyun.com

一、RTOS 操作系统之七大主要通讯方式及定时任务


osThreadId_t:线程 ID,用于标识一个线程。

  • osThreadId_t 用于标识和引用 RTOS 中的一个线程。这个标识符可以在创建线程时获得,并且可以用于后续的操作,例如终止线程、获取线程状态等。

osTimerId_t:定时器 ID,用于标识一个定时器。

  • osTimerId_t 是实时操作系统(RTOS)中用于标识定时器的类型。osTimerId_t用于标识和引用 RTOS 中的一个定时器。这个标识符可以在创建定时器时获得,并且可以用于后续的操作,例如启动、停止和删除定时器。

osEventFlagsId_t:事件标志 ID,用于标识一组事件标志。

  • osEventFlagsId_t 用于标识和引用 RTOS 中的一个事件标志组。这个标识符可以在创建事件标志组时获得,并且可以用于后续的操作,例如设置、清除、等待和读取事件标志。

osMutexId_t:互斥锁 ID,用于标识一个互斥锁。

  • osMutexId_t 用于标识和引用 RTOS 中的一个互斥锁。这个标识符可以在创建互斥锁时获得,并且可以用于后续的操作,例如获取、释放和删除互斥锁。

osSemaphoreId_t:信号量 ID,用于标识一个信号量。

  • osSemaphoreRelease 是实时操作系统(RTOS)中用于释放信号量的函数。信号量是一种同步机制,通常用于控制对共享资源的访问或协调多个线程 / 任务之间的操作。在许多 RTOS 中,例如 FreeRTOS 或者 CMSIS-RTOS,信号量可以用来实现互斥锁、计数信号量等功能。

osMemoryPoolId_t:内存池 ID,用于标识一个内存池。

osMessageQueueId_t:消息队列 ID,用于标识一个消息队列。

  • osMessageQueueId_t 用于标识和引用 RTOS 中的一个消息队列。这个标识符可以在创建消息队列时获得,并且可以用于后续的操作,例如发送、接收和删除消息队列。

二、实时操作系统(RTOS)中 Event、 Semaphore、 Mutex 、 MessageQueue 区别于用法?


  在实时操作系统(RTOS)中,事件(Event)、互斥锁(Mutex)和消息队列(Message Queue)是常见的同步和通信机制。它们各自有不同的用途和特性,适用于不同的场景。下面是这三种机制的区别和用法:

1. 事件(Event)

定义:事件是一种简单的同步机制,用于通知任务某些条件已经满足或某个操作已经完成。

特点

轻量级:事件通常占用较少的系统资源。

标志位:可以设置多个标志位,每个标志位代表一个特定的事件。

等待 / 触发:任务可以等待一个或多个事件的发生,而其他任务或中断可以触发这些事件。

用法

状态通知:当某个条件发生变化时,可以通过事件来通知相关的任务。

超时处理:任务可以等待事件,并设置超时时间,以避免无限期等待。

2. 信号量(Semaphore)

定义:信号量是一种同步机制,用于控制对共享资源的访问。它可以是二值信号量(0 或 1)或计数信号量(非负整数)。

特点

资源计数:信号量维护一个计数值,表示可用资源的数量。

阻塞 / 非阻塞:如果信号量计数值为 0,尝试获取信号量的任务会被阻塞,直到有其他任务释放信号量。

多任务协调:可以用于协调多个任务之间的操作。

用法

资源管理:确保一次只有一个任务可以访问某个资源。

任务同步:用于同步多个任务的操作,例如生产者 - 消费者问题。

3. 互斥锁(Mutex)

定义:互斥锁是一种同步机制,用于保护共享资源,确保同一时间只有一个任务可以访问该资源。

特点

独占性:互斥锁确保对共享资源的独占访问。

递归性:某些互斥锁支持递归锁定,即同一个任务可以多次获取同一个互斥锁。

优先级继承:互斥锁可以配置为支持优先级继承,以防止优先级反转问题。

用法

保护共享资源:当多个任务需要访问同一个资源时,使用互斥锁来确保一次只有一个任务可以访问该资源。

避免竞争条件:通过互斥锁来避免多任务并发访问导致的数据不一致问题。

4. 消息队列(Message Queue)

定义:消息队列是一种通信机制,用于在任务之间传递数据块(消息)。

特点

数据传递:任务可以通过消息队列传递结构化的数据。

缓冲区:消息队列通常有一个缓冲区,可以存储多个消息。

阻塞 / 非阻塞:发送和接收消息的操作可以是阻塞的或非阻塞的。

用法

任务间通信:当任务需要交换数据时,使用消息队列来传递消息。

解耦合:通过消息队列,任务之间的耦合度降低,提高了系统的可维护性和扩展性。

总结

事件:用于简单地通知任务某个条件已经满足或某个操作已经完成。

*信号量:用于控制对共享资源的访问,确保一次只有一个任务可以访问某个资源。

*互斥锁:用于保护共享资源,确保同一时间只有一个任务可以访问该资源。

*消息队列:用于在任务之间传递结构化的数据,实现任务间的通信。

  选择哪种机制取决于你的具体需求。如果你只需要简单的状态通知,事件可能就足够了;如果你需要控制对共享资源的访问,信号量是一个很好的选择;如果你需要保护共享资源并避免竞争条件,互斥锁会更合适;如果你需要在任务之间传递数据,那么消息队列会更合适。

三、模组 RTOS 操作系统 --SDK-DEMO



void app_os_demo_task(void)

    hal_info_log("[os demo] os task start success");

if (NULL == os_sem_handle)

        os_sem_handle = osSemaphoreNew(1, 0, NULL);

    app_info_log("app_os_demo_func create semaphore success!(2/7)");

if (NULL == os_timer_handle)

        os_timer_handle = osTimerNew(app_demo_os_timer_callback, osTimerPeriodic, NULL, NULL);

        osTimerStart(os_timer_handle, (30 * 1000) / portTICK_PERIOD_MS );  // 定时周期单位为tick,此处示例为30s

    app_info_log("app_os_demo_func create timer success!(3/7)");

if (NULL == os_msgqueue_handle)

        os_msgqueue_handle = osMessageQueueNew(10, sizeof(os_msg_t), NULL); // 消息队列深度为10个,单个元素为结构体大小

    app_info_log("app_os_demo_func create message queue success!(4/7)");

// 任务函数一定不能自动运行结束,一般是循环处理消息、事件等

        osSemaphoreAcquire(os_sem_handle, osWaitForever);

        hal_info_log("[os demo] os sem acquire success");

        hal_info_log("[os demo] os timer count: %d", os_timer_cb_count);

        app_info_log("app_os_demo_func acquire semaphore success!(5/7)");

        app_info_log("app_os_demo_func timer arrived!(6/7)");

if (osMessageQueueGet(os_msgqueue_handle, &msg, NULL, 2000 / portTICK_PERIOD_MS) == osOK)

            hal_info_log("[os demo] os get messageid: %d", msg.msg_id);

            app_info_log("app_os_demo_func message queue get success!(7/7)");

            hal_info_log("[os demo] os get message timeout");
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值