⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sem.c

📁 msLinux v1.0 可以在arm ads 下仿真运行的linux
💻 C
字号:
/* MShowTec - www.mshowtec.com
** msLinux sem.c ver1.0
** 20051221 lmjx create limiao@mshowtec.com
** 
*/

#define MSLINUX_SEM_C

#include "errno.h"
#include "string.h"
#include "sem.h"

struct semaphore mslinux_sem_list[256];

void mslinux_semaphore_init()
{
	memset(mslinux_sem_list,0,(sizeof(struct semaphore)*MSLINUX_MAX_SEM_NUM));
}

int semaphore_init(short sem_num,short sem_max,short sem_init)
{
	int ret = 0;
	int irq_save = 0;
	
	irq_save = mslinux_save_disable_irq();
	
	if(sem_num>(MSLINUX_MAX_SEM_NUM-1)){
		ret = ESEMNOOUT;
		goto RET;
	}
	
	if(mslinux_sem_list[sem_num].sem_used){
		ret = ESEMINUSE;
		goto RET;
	}
	
	mslinux_sem_list[sem_num].sem_used = 1;
	mslinux_sem_list[sem_num].sem_max = sem_max;
	mslinux_sem_list[sem_num].sem_init = sem_init;
	mslinux_sem_list[sem_num].sem_val = sem_init;
	mslinux_sem_list[sem_num].sem_wait = 0;
	
RET:
	mslinux_restore_irq(irq_save);
	
	return ret;
}

int semaphore_take(short sem_num)	//P(s) ::=s:= s-1
{
	int ret = 0;
	int irq_save = 0;
	
	irq_save = mslinux_save_disable_irq();
	
	if(sem_num>(MSLINUX_MAX_SEM_NUM-1)){
		ret = -ESEMNOOUT;
		goto RET;
	}
	
	if(mslinux_sem_list[sem_num].sem_used == 0){
		ret = -ESEMNOTINIT;
		goto RET;
	}
	
	
	if(mslinux_sem_list[sem_num].sem_val > 0){	
		mslinux_sem_list[sem_num].sem_val--;	
		goto RET;	
	}
	
	while(1){
		if(mslinux_sem_list[sem_num].sem_val <= 0){
			mslinux_restore_irq(irq_save);
			sleep_on(&(mslinux_sem_list[sem_num].sem_wait));
			irq_save = mslinux_save_disable_irq();
		}else{
			mslinux_sem_list[sem_num].sem_val--;
			goto RET;
		}
	}
				
RET:
	mslinux_restore_irq(irq_save);	
	return ret;
		
}

int semaphore_give(short sem_num)	//V(s) ::=s:= s+1
{
	int irq_save = 0;
	
	irq_save = mslinux_save_disable_irq();
	
	mslinux_sem_list[sem_num].sem_val++;
	
	if(mslinux_sem_list[sem_num].sem_val > mslinux_sem_list[sem_num].sem_max)
		mslinux_sem_list[sem_num].sem_val = mslinux_sem_list[sem_num].sem_max;
		
	if(mslinux_sem_list[sem_num].sem_val > 0)	
		wake_up(&(mslinux_sem_list[sem_num].sem_wait));
	
	mslinux_restore_irq(irq_save);	
	
	return 0;
	
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -