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命令
效果
相關文章
- RT-Thread學習筆記2-互斥量與訊號量thread筆記
- QT學習筆記1(安裝、建立和訊號與槽)QT筆記
- (RT-Thread學習筆記1)基於 CubeMX 移植 RT-Thread Nanothread筆記NaN
- RT-Thread學習筆記1-啟動順序與執行緒建立thread筆記執行緒
- RT-Thread學習筆記3-執行緒間通訊 & 定時器thread筆記執行緒定時器
- python學習之訊號量Python
- Tensorflow學習筆記No.8筆記
- k8s學習筆記K8S筆記
- G01學習筆記-8筆記
- 學習筆記(2):go輕量級分散式與微服務-實現程式的訊號通訊2筆記Go分散式微服務
- Laravel學習筆記七-建立部落格Laravel筆記
- MySQL學習筆記——建立與約束MySql筆記
- 強化學習-學習筆記8 | Q-learning強化學習筆記
- JDK8 新特性學習筆記JDK筆記
- 畫江湖之 Go 學習篇 【訊號量】Go
- 畫江湖之 Go 學習篇 [訊號量]Go
- 2.3.2 訊號量機制——作業系統筆記作業系統筆記
- Android學習筆記(建立Menu,Intent的使用)Android筆記Intent
- 學習筆記:勒讓德(Legendre)符號筆記符號
- Python學習筆記8——列表、字典、元組Python筆記
- Flutter學習筆記(8)--Dart物件導向Flutter筆記Dart物件
- Laravel8學習筆記-日誌元件Laravel筆記元件
- Pytest學習筆記8-引數化筆記
- (Django)18.3建立網頁:學習筆記主頁Django網頁筆記
- JavaScript中的物件學習筆記(概述和建立)JavaScript物件筆記
- Solidity語言學習筆記————32、建立合約Solid筆記
- 【學習筆記】OpenMV與arduino通訊筆記UI
- numpy的學習筆記\pandas學習筆記筆記
- python學習筆記:第8天 檔案操作Python筆記
- Java學習筆記8-資料型別Java筆記資料型別
- HexMap學習筆記(一)——建立六邊形網格筆記
- RxJava2.X 學習筆記 -- 建立操作符RxJava筆記
- Java學習筆記【1】陣列的宣告和建立Java筆記陣列
- 使用 seed 命令建立模擬資料(學習筆記)筆記
- GObject學習筆記(二)型別建立與註冊GoObject筆記型別
- Xilinx-Verilog-學習筆記(19):正弦波訊號發生器與DDS筆記
- 資訊理論理論學習筆記筆記
- 《通訊原理基礎》學習筆記(1)筆記