其他分享
首页 > 其他分享> > 485半双工总线管理器,使用权分配与拿锁

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

作者:互联网

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

使用方法:
 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;
	}

}

标签:管理器,lock,U1,state,半双工,manager,485,id
来源: https://blog.csdn.net/weixin_52668204/article/details/122270786