项目概述
本案例使用移远通信EG800Z-CN开发板和UniRTOS,调用UniRTOS中互斥锁(Mutex)相关功能函数编写。当两个任务访问同一共享资源时,设置访问资源前需先获取Mutex,可确保同一时刻仅有一个任务能够进入受保护的临界区。
功能特性
高可靠内核级互斥锁机制
- 严格互斥访问控制:确保同一时刻仅有一个任务或线程能够进入受保护的临界区,彻底杜绝多任务并发访问共享资源引发的数据竞争与状态不一致问题。
- 超时安全退出机制:提供带超时参数的加锁接口(qosa_mutex_lock),若在指定时间内未能获取锁,则返回错误码,防止任务无限期挂起。
开发准备
硬件要求

- USB数据线(USB-A转USB-C),点此购买。

软件要求
- Quectel USB驱动,点此获取。
- UniRTOS SDK,请联系技术支持获取。
- EPAT工具:移芯平台日志调试工具,点此获取。
快速上手
下载项目
示例代码位于UniRTOS官方创客仓库,点此访问下载。
添加项目到UniRTOS SDK
SDK新增Demo,固件编译和烧录请参考UniRTOS板块的快速启动。
硬件连接
仅需使用数据线连接开发板和电脑即可。
日志展示
两个线程修改一个共享变量,线程A增加且速度较快,线程B减少且速度较慢。

代码概览
示例流程图

主要功能接口
unir_test_demo_init
功能:互斥锁演示功能的入口与初始化函数。主要职责是创建互斥锁,再启动两个独立任务,用于安全访问共享资源,不阻塞主程序。
关键操作:
- 创建互斥锁:调用qosa_mutex_create创建count_mutex,用于保护共享变量share_count。
- 任务创建:分别创建Task A和Task B两个任务,栈大小 4 KB,普通优先级。
- 重要性:用户需在应用初始化时调用,完成互斥锁与任务的启动,是多任务资源保护的标准入口。
unirtos_task_a_handler
功能:互斥锁演示任务A。循环对共享资源执行加1操作,通过互斥锁保证原子性与线程安全。
关键操作:
- 申请互斥锁:qosa_mutex_lock,永久等待直到获取锁。
- 操作共享资源:对share_count执行 + 1。
- 释放互斥锁:qosa_mutex_unlock,让其他任务可以使用资源。
- 任务延时:qosa_task_sleep_ms(100) 模拟业务处理。
- 重要性:展示读 - 改 - 写类共享资源如何安全加锁、解锁。
unirtos_task_b_handler
功能:互斥锁演示任务B。循环对共享资源执行减1操作,与任务A竞争同一把锁,验证互斥机制。
关键操作:
- 申请互斥锁:qosa_mutex_lock,永久等待直到获取锁。
- 操作共享资源:对share_count执行 - 1。
- 释放互斥锁:qosa_mutex_unlock。
- 任务延时:qosa_task_sleep_ms(150),模拟业务处理。
- 重要性:与任务A形成竞争场景,直观体现互斥锁防止多任务并发冲突的作用。