【RT-thread studio 下使用STM32F103-學習sem-信號量-初步使用-線程之間控制-基礎樣例】

1、前言

最近,在使用rt-thread的時候,想要用一個線程控制另一個線程的暫停與運行,
但看資料的時候,發現刪除線程和重啟線程的時候,好像不太理想,這么弄是容易出現問題的,但通過信號量的方式,比較好,所以這次咱們一起來學習下sem。

自己也從新手的角度,一點點學習。整個rt-thread 還是挺大的,不是深耕多年,很難面面聚到,不過用那學哪里。

2、環境

在這里插入圖片描述

3、事項了解

(1)了解sem概念-了解官網消息

大概看了一遍整個資料,還是挺多的,當你想要使用的時候,其實多少還是有些摸不到頭腦的。
但既然要使用Rt-thread的,官方的文檔還是要讀一下。

鏈接:https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/programming-manual/ipc1/ipc1?id=%e4%bf%a1%e5%8f%b7%e9%87%8f
在這里插入圖片描述

(2)根據自己理解,設計幾個使用方式

我們使用某種RT-thread帶有的功能,是為了解決我們自己出現的問題。

設計實驗1:
通過使用sem信號量,當一個線程先運行后,再運行另一個線程。這樣其實就是讓線程之間形成先后關系,適合一定是某個線程完成后,在運行另一個線程。

設計實驗2:
通過使用sem信號量,用一個線程,或者一個變量,控制或者暫停另一個線程。這樣其實就是有個主線程,或不一定是主線程,可以控制其他線程運行。

以上都是小的功能模塊,但是大的項目,都是小模塊一點點搭建起來,這算是其中一個磚塊,使用的時候,根據自己情況再調整下。

(3)不建議運行中,反復刪除,在運行線程。

在看網上資料是,看到有說到,其實不建議反復掛起或刪除創建線程,很容易出現問題。
當時看到了資料忘記去哪里,不過本片將有關sem信號量的。

4、實驗過程

實驗說明

1、第一部分實驗

萬事皆有要基礎,一步一個腳印,如果環境不能使用的話,后續代碼都是無用的,所以第一步是要搭建一個可以運行的程序。自己這塊沒注意,認為軟件裝好后,隨便創建一個工程,就可以運行,沒想到卡了一下。

(1)實驗說明-創建工程

在這里插入圖片描述

在這里插入圖片描述

(2)編寫代碼

以下內容,RT-Thread Studio工具會自動生成的。

int main(void)
{int count = 1;while (count++){LOG_D("Hello RT-Thread!");rt_thread_mdelay(1000);}return RT_EOK;
}
(3)驗證結果

這塊其實遇到一個內存相關報錯,更細節部分可以看細節說明部分。
在這里插入圖片描述

上述問題解決后,然后連接硬件代碼,進行下載驗證。
在這里插入圖片描述

2、第二部分實驗

(1)實驗說明

此部分,主要是讓一個線程先運行,運行完畢,再運行了另一個線程。在現實應用中,很多情況下,都是需要的,并且有實際意義的。

舉個例子,現實中,有很多測溫需求,溫度過高過低,都需要做些事情,相當觸發異常,這個時候,溫度異常,必須先出現,才做后面事情,可以用這樣邏輯解決。

(2)編寫代碼
/** Copyright (c) 2006-2024, RT-Thread Development Team** SPDX-License-Identifier: Apache-2.0** Change Logs:* Date           Author       Notes* 2024-06-21     RT-Thread    first version*/#include <rtthread.h>#define DBG_TAG "main"
#define DBG_LVL DBG_LOG
#include <rtdbg.h>//第一步
//#include <rtthread.h>static rt_sem_t sem; // 信號量//第二步
void sem1_init(void)
{// 創建一個信號量,初始值為 0sem = rt_sem_create("sem", 0, RT_IPC_FLAG_FIFO);if (sem == RT_NULL){rt_kprintf("create semaphore failed.\n");}
}
//第三步
void thread1_entry(void *parameter)
{while (1){// 嘗試獲取信號量,如果信號量值為 0,則線程將被阻塞rt_sem_take(sem, RT_WAITING_FOREVER);rt_kprintf("Thread 1 is running.\n");rt_thread_mdelay(1000); // 模擬線程工作}
}
//第四步
void thread2_entry(void *parameter)
{while (1){rt_thread_mdelay(3000); // 等待 3 秒rt_kprintf("Thread 2 releases semaphore.\n");rt_sem_release(sem); // 釋放信號量}
}int main(void)
{int count = 1;//第五步 應用sem1_init();// 創建線程 1rt_thread_t tid1 = rt_thread_create("thread1",thread1_entry, RT_NULL,1024, 10, 10);if (tid1 != RT_NULL)rt_thread_startup(tid1);// 創建線程 2rt_thread_t tid2 = rt_thread_create("thread2",thread2_entry, RT_NULL,1024, 10, 10);if (tid2 != RT_NULL)rt_thread_startup(tid2);while (count++){//LOG_D("Hello RT-Thread!");rt_thread_mdelay(1000);}return RT_EOK;
}
(3)驗證結果

如下為具體實驗驗證,必須是線程2運行完,才會運行線程1,是按照順序運行。
在這里插入圖片描述

3、第三部分實驗

(1)實驗說明

這種情況,更為復雜些,需要一個線程控制另一個線程,雖然實現方式很多,不一定非要使用這種,但是工具給你準備好了,使不使用看自己,并且是實現比較簡單,實際項目,根據自己需求使用。

(2)編寫代碼

簡單講解下,本實驗中,主要是根據a的值,來決定是否運行線程1。

/** Copyright (c) 2006-2024, RT-Thread Development Team** SPDX-License-Identifier: Apache-2.0** Change Logs:* Date           Author       Notes* 2024-06-21     RT-Thread    first version*/#include <rtthread.h>#define DBG_TAG "main"
#define DBG_LVL DBG_LOG
#include <rtdbg.h>//第一步
static rt_sem_t sem; // 信號量
volatile int a = 0;  // 控制變量//第二步
void sem_init(void)
{// 創建一個信號量,初始值為 0sem = rt_sem_create("sem", 0, RT_IPC_FLAG_FIFO);if (sem == RT_NULL){rt_kprintf("create semaphore failed.\n");}
}
//第三步
void thread1_entry(void *parameter)
{while (1){// 嘗試獲取信號量,如果信號量值為 0,則線程將被阻塞rt_sem_take(sem, RT_WAITING_FOREVER);rt_kprintf("Thread 1 is running.\n");rt_thread_mdelay(1000); // 模擬線程工作}
}
//第四步
void thread2_entry(void *parameter)
{while (1){rt_thread_mdelay(1000); // 每秒檢查一次變量 a 的值if (a == 1){// 如果 a == 1,則釋放信號量,允許線程 1 運行if (rt_sem_release(sem) == RT_EOK){rt_kprintf("Thread 2 releases semaphore.\n");}}else{// 如果 a == 0,則確保信號量不會釋放,線程 1 將被暫停rt_kprintf("Thread 2: a is 0, thread 1 will pause.\n");}}
}void set_a(int value)
{a = value;rt_kprintf("Variable a set to %d\n", a);
}int main(void)
{int count = 1;// 初始化信號量sem_init();// 創建線程 1rt_thread_t tid1 = rt_thread_create("thread1",thread1_entry, RT_NULL,1024, 10, 10);if (tid1 != RT_NULL)rt_thread_startup(tid1);// 創建線程 2rt_thread_t tid2 = rt_thread_create("thread2",thread2_entry, RT_NULL,1024, 10, 10);if (tid2 != RT_NULL)rt_thread_startup(tid2);while (count++){set_a(0);rt_thread_mdelay(10000);set_a(1);//LOG_D("Hello RT-Thread!");rt_thread_mdelay(10000);}return RT_EOK;
}
(3)驗證結果

在這里插入圖片描述

5、代碼鏈接

代碼鏈接:https://download.csdn.net/download/qq_22146161/89466496

6、細節部分

1、dome 文件報錯

在這里插入圖片描述
在這里插入圖片描述

7、總結

一個磚一個磚,壘起來。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/40061.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/40061.shtml
英文地址,請注明出處:http://en.pswp.cn/web/40061.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

const char * 、char const *、 char * const 三者的區別

一.const char*&#xff08;常量指針&#xff09; 1.定義一個指向字符常量的指針&#xff0c;這里&#xff0c;ptr是一個指向 char* 類型的常量&#xff0c;所以不能用ptr來修改所指向的內容&#xff0c;換句話說&#xff0c;*ptr的值為const&#xff0c;不能修改。但是ptr的聲…

【Python機器學習】處理文本數據——停用詞

刪除沒有信息量的單詞有一種方法&#xff0c;就是舍棄那些出現次數太多以至于沒有信息量的單詞。 有兩種主要方法&#xff1a; 1、使用特定語言的停用詞&#xff08;stopword&#xff09;列表&#xff1b; 2、舍棄那些出現過于頻繁的單詞。 scikit-learn的feature_extracti…

達夢DM8使用管理工具自動commit設置

緣起 隨著國產化信創大勢崛起&#xff0c;越來越多的國產數據庫躍上潮頭。在用慣了國外數據庫軟件后&#xff0c;使用DM8的過程中前前后后遇到了不少“不習慣”&#xff0c;當然&#xff0c;用多了也就習慣了&#xff0c;要多給國產DB一些成長空間。 功能點探索 DM管理工具…

強烈建議!所有Python基礎差的同學,死磕這本64頁的背記手冊!

Python背記手冊是一份非常實用的學習資料&#xff0c;它涵蓋了Python語言的基礎知識、語法規則、常用函數和模塊等內容&#xff0c;對于初學者和有一定基礎的Python程序員來說都非常有用。通過背誦這份手冊&#xff0c;可以加深對Python語言的理解和記憶&#xff0c;提高編程能…

摸魚大數據——Spark Core——RDD綜合案例——搜狗搜索流

2.1 數據源介紹 訪問時間 用戶id []里面是用戶輸入搜索內容 url結果排名 用戶點擊頁面排序 用戶點擊URL 字段與字段之間的分隔符號為 \t和空格 (制表符號) 2.2 需求分析 需求一: 統計每個 關鍵詞 出現了多少次,最終展示top10數據關鍵詞示例: [.,,的,360, 安全衛士, 哄搶, 救災…

Zabbix觸發器

目錄 觸發器基礎概念 創建和管理觸發器 示例 定義一個觸發器 在 Zabbix 中&#xff0c;觸發器&#xff08;Trigger&#xff09;用于定義在監控數據滿足特定條件時觸發警報或動作。觸發器是實現監控告警和自動響應的核心組件之一。以下是關于 Zabbix 觸發器的詳細解釋和用法…

yaml格式轉換成json格式

yaml格式轉換成json格式 ①postman生成的結果是yaml格式 ps&#xff1a;postman輸出的格式是沒有自動換行的&#xff0c;需要將內容換行 ②復制到Python的腳本跑一趟&#xff1a;自動換行并去掉/n&#xff1b; str " "//(postman輸出的內容&#xff09; print(st…

唐僧說:分數限制下,選好專業還是選好學校?

貧僧自東土大唐而來&#xff0c;往西天取經&#xff0c;雖非塵世中人&#xff0c;卻也常聞世間煩惱。今見24年高考帷幕已落&#xff0c;萬千學子面臨新的人生抉擇&#xff0c;心中不禁生出幾分感慨。學校與專業&#xff0c;猶如修行路上的兩座山門&#xff0c;一者關乎環境氛圍…

HTTPS保證傳輸安全的關鍵點

哈嘍&#xff0c;大家好呀&#xff0c;淼淼又來和大家見面啦&#xff0c;在如今高度數字化的世界里&#xff0c;信息的安全傳輸成為了至關重要的議題。HTTPS&#xff08;超文本傳輸安全協議&#xff09;作為HTTP協議的安全升級版&#xff0c;為網絡數據的交換提供了強大的安全保…

LMT加仿真,十一屆大唐杯全國總決賽

這次省賽帶了太多個省一了&#xff0c;并且很多都進入了國賽總決賽&#xff0c;具體可看下面的圖片&#xff0c;只放了一部分。目前只有B組是只有一個商用設備賽也就是LMT&#xff0c;A組和高職組都是仿真實踐賽加上商用設備賽。 針對商用設備賽有對應的資料&#xff…

windows server2016搭建AD域服務器

文章目錄 一、背景二、搭建AD域服務器步驟三、生成可供java程序使用的keystore文件四、導出某用戶的keytab文件五、主機配置hosts文件六、主機確認是否能ping通本人其他相關文章鏈接 一、背景 親測可用,之前搜索了很多博客&#xff0c;啥樣的都有&#xff0c;就是不介紹報錯以…

FastDDS中的環境變量

目錄 FASTDDS_DEFAULT_PROFILES_FILESKIP_DEFAULT_XMLFASTDDS_BUILTIN_TRANSPORTSROS_DISCOVERY_SERVERROS_SUPER_CLIENTFASTDDS_STATISTICSFASTDDS_ENVIRONMENT_FILE 我們承擔ROS&#xff0c;FastDDS&#xff0c;C&#xff0c;cmake等技術的項目開發和專業指導和培訓&#xff…

深度學習算法bert

bert 屬于自監督學習的一種&#xff08;輸入x的部分作為label&#xff09; 1. bert是 transformer 中的 encoder &#xff0c;不同的bert在encoder層數、注意力頭數、隱藏單元數不同 2. 假設我們有一個模型 m &#xff0c;首先我們為某種任務使用大規模的語料庫預訓練模型 m …

中國1km高分辨率高質量逐年近地表CO數據集(2013-2022年)

該數據為中國高分辨率高質量逐年CO數據集&#xff0c;該數據集主要的空間范圍覆蓋整個中國&#xff0c;其中內容包括中國1km高分辨率高質量逐年CO數據集(2013-2022年)。時間分辨率為年&#xff0c;單位為mg/m3&#xff0c;數據以(.nc/.tif)格式進行存儲。

人工智能寫作對話系統源碼 自然語言的處理能力 前后端分離 帶完整的安裝代碼包以及搭建教程

系統概述 隨著互聯網信息爆炸式增長&#xff0c;用戶對于高質量、個性化內容的需求日益增長&#xff0c;而傳統的內容生成方式已難以滿足這一需求。另一方面&#xff0c;深度學習和自然語言處理技術的突破性進展&#xff0c;為人機交互提供了新的可能。本項目正是在此背景下應…

檢索增強生成RAG系列7--RAG提升之高級階段

系列5中講到會講解3個方面RAG的提升&#xff0c;它們可能與RAG的準確率有關系&#xff0c;但是更多的它們是有其它用途。本期來講解第三部分&#xff1a;高級階段。之所以說是高級階段&#xff0c;可能是不好歸一&#xff0c;而且實現起來相對于前面來說可能更為復雜。 目錄 1…

PyCharm中如何將某個文件設置為默認運行文件

之前在使用JetBrain公司的另一款軟件IDEA的時候&#xff0c;如果在選中static main函數后按鍵altenter可以默認以后運行Main類的main函數。最近在使用PyCharm學習Python&#xff0c;既然同為一家公司的產品而且二者的風格如此之像&#xff0c;所以我懷疑PyCharm中肯定也有類似的…

fastadmin 如何給頁面添加水印

偶然發現fastadmin框架有個水印插件&#xff0c;看起來漂亮&#xff0c;就想也實現這樣的功能&#xff0c;看到需要費用。但是現成的插件需要費用&#xff0c;自己動手豐衣足食。說干就干。 1. 找到watermark.js &#xff0c;放到assets/js/ 下面 2.具體頁面引入 <script…

【總線】AXI4第八課時:介紹AXI的 “原子訪問“ :獨占訪問(Exclusive Access)和鎖定訪問(Locked Access)

大家好,歡迎來到今天的總線學習時間!如果你對電子設計、特別是FPGA和SoC設計感興趣&#xff0c;那你絕對不能錯過我們今天的主角——AXI4總線。作為ARM公司AMBA總線家族中的佼佼者&#xff0c;AXI4以其高性能和高度可擴展性&#xff0c;成為了現代電子系統中不可或缺的通信橋梁…

ssm高校宿舍用電管理系統-計算機畢業設計源碼97859

摘要 隨著高校規模的擴大和學生數量的增加&#xff0c;高校宿舍的用電需求也日益龐大。為了提高用電效率、節約能源、確保用電安全和方便管理&#xff0c;開發一個高校宿舍用電管理系統具有重要意義。本系統將采用Java作為后端開發語言&#xff0c;具備跨平臺特性&#xff0c;能…