485半双工总线管理器,使用权分配与拿锁

本文档详细介绍了如何管理485总线的使用权,通过get_Lock_U1_485和un_Lock_U1_485函数实现锁的获取和释放。系统支持两个使用者,当一个使用者在使用时,其他使用者可以请求等待,直到使用者释放锁。同时,存在超时机制防止资源被长期占用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

适用范围:  
一个设备资源
两个使用者

使用方法:
 get_Lock_U1_485( lock_id); //传入使用者ID进行拿锁
 un_Lock_U1_485(); //调用即可解锁

.H 文件


#define LOCK_U1 	0
#define UNLOCK_U1	1

//id盒子,把需要使用的ID放进去
typedef enum e_lock{
	 NO_USER = 0,  //没有使用者,空闲状态
	 SET_LOCK =  0x22U,  //使用者1
	 RUN_LOCK  =  0x44U  //使用者2
}e_lock_type;
	 
//由此对485使用权进行管理
typedef struct manager{
	//当前485状态
	uint8_t use_state;  //LOCK 和 UNLOCK状态
	//当前使用者ID
	e_lock_type lock_id;
	//是否存在等待使用者
	e_lock_type waite_id;
}s_lock_manager;
定义一个全局变量  
s_lock_manager     lock_manager;

.C 文件

/**
 @bref 485半双工总线管理器,使用权分配与拿锁
 		user1在使用时,user2请求使用会被标记
 		等到user1使用后即可轮到user2使用
**/
uint8_t get_Lock_U1_485(e_lock_type lock_id){
	//printf("%d请求拿锁\n",lock_id);
	//当一个在使用时新增等待id,必须等到等待id使用并清空等待id才可以使用
	if((lock_manager.use_state == LOCK_U1)&&(lock_manager.lock_id != lock_id)){ //如果正在被使用,并且新来的id不等于当前
		lock_manager.waite_id = lock_id; //新增等待id
		//printf("新增等待id:%d\n",lock_id);
		return 0;
	}
	if((lock_manager.use_state == UNLOCK_U1)&&(lock_manager.waite_id != lock_id)&&((lock_manager.waite_id != NO_USER))){
		printf("抢占拿锁退出\n");
		return 0; //等待者还未使用,不能多次使用,防止多次占用
	}
	else if((lock_manager.use_state == UNLOCK_U1)&&(lock_manager.waite_id == lock_id)){
		//printf("等待id拿锁\n");  /之前排队等待的ID拿到锁 
		lock_manager.waite_id = NO_USER;  //等待位空出恢复
	}
	if( (lock_manager.use_state == UNLOCK_U1)||(lock_manager.waite_id == NO_USER)){
		lock_manager.lock_id = lock_id;
		//printf("此%d:已拿锁\n",lock_manager.lock_id);
		if(lock_manager.use_state == UNLOCK_U1){
			lock_Time = Start_cunter_0; //拿锁开始计时,不能超过3S
		}
		lock_manager.use_state = LOCK_U1; //拿锁,占用485的使用权
		return 1;
	}
	else{
		if(lock_Time >= 3000){ //拿锁最长时间3s  ,防止被一直抢占
			lock_manager.use_state = UNLOCK_U1; //解锁,解除485占用
			lock_manager.lock_id = NO_USER;
			lock_manager.waite_id = NO_USER;
			printf("拿锁超时\n");
		}
		printf("拿锁失败:%d\n",lock_manager.lock_id);
		return 0;
	}

}
/**
* @ bref 解除占用
**/
uint8_t un_Lock_U1_485(void){
	if(lock_manager.use_state == LOCK_U1){
		lock_manager.use_state = UNLOCK_U1; //解锁,解除485占用
		lock_manager.lock_id = NO_USER;
		//printf("还锁\n");
		return 1;
	}else{
		//printf("还锁\n");
		return 1;
	}

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

漏洞百出

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值