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筆記
- (RT-Thread學習筆記1)基於 CubeMX 移植 RT-Thread Nanothread筆記NaN
- CMake構建學習筆記8-OpenSceneGraph庫的構建筆記
- CCNA學習筆記8筆記
- uc/os-iii學習筆記-資源管理(中斷、訊號、訊號量、互斥訊號量)筆記
- perl學習筆記---標量筆記
- Android學習筆記(8)Android筆記
- G01學習筆記-8筆記
- Tensorflow學習筆記No.8筆記
- asio學習筆記8——stackfull coroutine筆記
- k8s學習筆記K8S筆記
- JDK8 新特性學習筆記JDK筆記
- oracle學習筆記8: 分析函式Oracle筆記函式
- angular學習筆記(三十)-指令(8)-scopeAngular筆記
- DG學習筆記(8)_Switchover and Failover筆記AI
- 強化學習-學習筆記8 | Q-learning強化學習筆記
- 學習筆記:勒讓德(Legendre)符號筆記符號
- 計量經濟學複習筆記(1)筆記
- c++學習筆記 -- 建構函式C++筆記函式
- [Erlang 學習筆記] Erlang開發建議筆記
- CMake構建學習筆記1-概述筆記
- Neo4j/cypher學習筆記與學習建議筆記
- Flutter學習筆記(8)--Dart物件導向Flutter筆記Dart物件
- Laravel8學習筆記-日誌元件Laravel筆記元件
- RT-Thread學習筆記1-啟動順序與執行緒建立thread筆記執行緒
- RT-Thread學習筆記3-執行緒間通訊 & 定時器thread筆記執行緒定時器
- numpy的學習筆記\pandas學習筆記筆記
- uc/os-iii學習筆記-任務同步(訊號量、時間標誌組)筆記
- JS語言精粹學習筆記--物件字面量JS筆記物件
- hive學習筆記之七:內建函式Hive筆記函式
- L01 學習筆記--構建頁面筆記
- Docker構建自己的容器(學習筆記二)Docker筆記
- 『應用機器學習的建議』的學習筆記機器學習筆記
- Pytest學習筆記8-引數化筆記
- Python學習筆記8——列表、字典、元組Python筆記
- Java學習筆記8-資料型別Java筆記資料型別
- CMake構建學習筆記10-OsgQt庫的構建筆記QT
- CMake構建學習筆記13-opencv庫的構建筆記OpenCV