rt-thread學習筆記——8、建立訊號量

Drive World發表於2020-11-06

官網連結: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命令

 

效果

 

相關文章