目录
一、RTOS操作系统之七大主要通讯方式及定时任务
二、实时操作系统(RTOS)中Event、 Semaphore、 Mutex 、 MessageQueue区别于用法?
1. 事件(Event)
2. 信号量(Semaphore)
3. 互斥锁(Mutex)
4. 消息队列(Message Queue)
总结
三、模组RTOS操作系统--SDK-DEMO
一、RTOS操作系统之七大主要通讯方式及定时任务
- ● osThreadId_t:线程ID,用于标识一个线程。
osThreadId_t 用于标识和引用 RTOS 中的一个线程。这个标识符可以在创建线程时获得,并且可以用于后续的操作,例如终止线程、获取线程状态等。
● osTimerId_t:定时器ID,用于标识一个定时器。
osTimerId_t 是实时操作系统(RTOS)中用于标识定时器的类型。sTimerId_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)");// 任务函数一定不能自动运行结束,一般是循环处理消息、事件等while (1){// 阻塞等待信号量释放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)");// 阻塞2s等待消息,当接收到消息时立即返回os_msg_t msg = {0};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)");}else{hal_info_log("[os demo] os get message timeout");}}
}