rt-thread学习笔记——8、创建信号量

官网链接:https://www.rt-thread.org/document/site/programming-manual/ipc1/ipc1/#_11

代码:

#define	THREAD_PRIORITY		7					//优先级
#define THREAD_STACK_SIZE	512				//内存大小
#define	THREAD_TIMESLICE	5					//线程一次调度能够运行的最大时间长度

//指向信号量的指针
static rt_sem_t dynamic_sem = RT_NULL;



//信号量应用示例,一个释放,一个接受
/******************************************************************************************
*** 函数名称: semaphore_thread1_entry
*** 输入参数: 无
*** 返 回 值: 无
*** 说    明:线程1,释放信号量
***	链		接:https://www.rt-thread.org/document/site/programming-manual/ipc1/ipc1/#_11
***	编者										时间										版本
***	wagnlu									2020/11/16							V0.1
******************************************************************************************/ 
static void semaphore_thread1_entry(void *parameter)
{
	static rt_uint8_t count =0;
	
	while(1)
	{
		if(count <= 10)	//释放10次信号量
		{
			count ++;
			rt_kprintf("thread1 release count %d\n",count);
			rt_sem_release(dynamic_sem);
		}
		else if(count == 11)
		{
			count ++;
			rt_kprintf("thread1 release over\n");
		}
		else
		{
			
		}
			
		rt_thread_mdelay(1000);
	}
	
}


/******************************************************************************************
*** 函数名称: semaphore_thread2_entry
*** 输入参数: 无
*** 返 回 值: 无
*** 说    明:线程2,接收信号量
***	链		接:https://www.rt-thread.org/document/site/programming-manual/ipc1/ipc1/#_11
***	编者										时间										版本
***	wagnlu									2020/11/16							V0.1
******************************************************************************************/ 
static void semaphore_thread2_entry(void *parameter)
{
	static rt_err_t result;
	static rt_uint8_t number =0;
	
	while(1)
	{
		//永久等待信号量,获取到信号量,number自加
		result = rt_sem_take(dynamic_sem, RT_WAITING_FOREVER);
		if(result != RT_EOK)
		{
			rt_kprintf("thread2 take semphore, failed \n");	//获取错误
			rt_sem_delete(dynamic_sem);											//删除信号量以释放系统资源
			return;
		}
		else
		{
			rt_kprintf("thread2 take count %d\n", ++number);
		}
		
		
	}
	
}



/******************************************************************************************
*** 函数名称: thread_semaphore
*** 输入参数: 无
*** 返 回 值: 无
*** 说    明:创建线程
***	链		接:https://www.rt-thread.org/document/site/programming-manual/ipc1/ipc1/#_11
***	编者										时间										版本
***	wagnlu									2020/11/16							V0.1
******************************************************************************************/ 
int thread_semaphore(void *parameter)
{
	//创建一个动态信号量,初始值 0, 先进先出
	dynamic_sem = rt_sem_create("dsem", 0, RT_IPC_FLAG_FIFO);
	if(dynamic_sem == RT_NULL)
	{
		rt_kprintf("create dynamic semaphore failed\n");
		return -1;
	}
	else
	{
		rt_kprintf("create done,dynamic_sem value 0\n");
	}
	
	
	rt_thread_t	tid = RT_NULL;		//创建一个线程句柄
	
	tid = rt_thread_create(	"thread1",					//线程名称
													semaphore_thread1_entry,		//线程入口函数
													RT_NULL,						//线程入口函数参数
													THREAD_STACK_SIZE,	//线程栈,单位字节
													THREAD_PRIORITY,		//线程的优先级
													THREAD_TIMESLICE);	//线程的时间片大小
	
	if(tid != RT_NULL)			//获得线程控制块,启动这个线程
	{
		rt_thread_startup(tid);
	}
	
	tid = rt_thread_create( "thrad2",						//线程名称
													semaphore_thread2_entry,		//线程入口函数
													RT_NULL,						//线程入口函数参数
													THREAD_STACK_SIZE,	//线程栈,单位字节
													THREAD_PRIORITY,		//线程的优先级
													THREAD_TIMESLICE);	//线程的时间片大小
	if(tid != RT_NULL)
	{
		rt_thread_startup(tid);	//获得线程控制块,启动这个线程
	}
	

}

MSH_CMD_EXPORT(thread_semaphore, thread semaphore);	//到处msh命令

 

效果

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值