63 lines
2.0 KiB
C
63 lines
2.0 KiB
C
/*
|
||
* 模块名称:Volume Lock(卷锁)— FreeRTOS 实现
|
||
* 模块功能:osMutex 串行化 NAND FatFs 卷访问(设计/使用约定见 vol_lock.h)
|
||
* 适用平台:STM32F407ZGTx + FreeRTOS
|
||
* 作者:王建锋
|
||
* 创建日期:2026-10-02
|
||
* 修改记录:
|
||
* v1.0 2026-10-02 王建锋 创建
|
||
*/
|
||
|
||
/* 头文件包含区 */
|
||
#include "vol_lock.h"
|
||
|
||
#include "cmsis_os.h"
|
||
|
||
/* 静态变量定义区 */
|
||
static osMutexId_t s_lock; /* 卷串行化互斥锁(vol_lock_init 创建) */
|
||
|
||
/* 函数定义区 */
|
||
|
||
/*
|
||
* 函数功能:创建卷串行化互斥锁(幂等,重复调用安全)
|
||
* 入口参数:无 void
|
||
* 返回值:0 - 成功(已创建或已存在);-1 - osMutexNew 失败 int
|
||
* 限定条件:可在内核启动后任意时刻调用;本实现不检查是否已启动调度器
|
||
*/
|
||
int vol_lock_init(void) {
|
||
if (s_lock != NULL) {
|
||
return 0; /* 幂等 */
|
||
}
|
||
s_lock = osMutexNew(NULL);
|
||
return (s_lock != NULL) ? 0 : -1;
|
||
}
|
||
|
||
/*
|
||
* 函数功能:获取卷锁(首次调用自动 vol_lock_init)
|
||
* 入口参数:timeout_ms - 等待上限(毫秒);0 = try 语义(不阻塞) uint32_t
|
||
* 返回值:1 - 已持锁;0 - 超时/未取得,或锁创建失败(fail-open) int
|
||
* 限定条件:返回 0 时调用方**不得** vol_lock_release;fail-open 是为保证
|
||
* 看门狗喂狗点(defaultTask)绝不能因等锁而阻塞
|
||
*/
|
||
int vol_lock_wait(uint32_t timeout_ms) {
|
||
if (s_lock == NULL) {
|
||
(void)vol_lock_init();
|
||
if (s_lock == NULL) {
|
||
return 1; /* 锁创建失败:fail-open(不阻塞,保持启动段可用) */
|
||
}
|
||
}
|
||
return (osMutexWait(s_lock, timeout_ms) == osOK) ? 1 : 0;
|
||
}
|
||
|
||
/*
|
||
* 函数功能:释放卷锁
|
||
* 入口参数:无 void
|
||
* 返回值:无 void
|
||
* 限定条件:仅在 vol_lock_wait() 返回 1 后调用;锁未创建时静默返回
|
||
*/
|
||
void vol_lock_release(void) {
|
||
if (s_lock != NULL) {
|
||
(void)osMutexRelease(s_lock);
|
||
}
|
||
}
|