色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
电子发烧友
开通电子发烧友VIP会员 尊享10大特权
海量资料免费下载
精品直播免费看
优质内容免费畅学
课程9折专享价
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

線程的基本知識

黃工的嵌入式技術圈 ? 來源:黃工的嵌入式技術圈 ? 作者:黃工的嵌入式技術 ? 2020-02-04 15:42 ? 次閱讀

今天給大家分享一點RT-Thread的基礎知識。

什么是線程?

人們在生活中處理復雜問題時,慣用的方法就是分而治之,即把一個大問題分解成多個相對簡單、比較容易解決的小問題,小問題逐個被解決了,大問題也就隨之解決了。同樣,在設計一個較為復雜的應用程序時,也通常把一個大型任務分解成多個小任務,然后通過運行這些小任務,最終達到完成大任務的目的。

在裸機系統中, 系統的主體就是 main 函數里面順序執行的無限循環,這個無限循環里面 CPU 按照順序完成各種事情。在多線程系統中,我們根據功能的不同,把整個系統分割成一個個獨立的且無法返回的函數,這個函數我們稱為線程。

線程由哪些部分組成?

RT-Thread 中的線程由三部分組成:線程代碼(函數)、線程控制塊、線程堆棧。

線程棧

在一個裸機系統中, 如果有全局變量,有子函數調用,有中斷發生。那么系統在運行的時候,全局變量放在哪里,子函數調用時,局部變量放在哪里, 中斷發生時,函數返回地址發哪里。

如果只是單純的裸機編程,它們放哪里我們不用管,但是如果要寫一個 RTOS,這些種種環境參數,我們必須弄清楚他們是如何存儲的。

在裸機系統中,他們統統放在一個叫棧的地方,棧是單片機 RAM 里面一段連續的內存空間,棧的大小一般在啟動文件或者鏈接腳本里面指定, 最后由 C 庫函數_main 進行初始化。

但是, 在多線程系統中,每個線程都是獨立的,互不干擾的,所以要為每個線程都分配獨立的棧空間,這個棧空間通常是一個預先定義好的全局數組, 也可以是動態分配的一段內存空間,但它們都存在于 RAM 中。如:

staticrt_uint8_tled_stack[512];

線程棧其實就是一個預先定義好的全局數據,數據類型為rt_uint8_t,大小我們設置為 512。在 RT-Thread 中,凡是涉及到數據類型的地方, RTThread 都會將標準的 C 數據類型用 typedef 重新取一個類型名, 以“rt”前綴開頭。這些經過重定義的數據類型放在 rtdef.h ,如:

線程控制塊

在 RT-Thread 中,線程控制塊由結構體 struct rt_thread 表示,線程控制塊是操作系統用于管理線程的一個數據結構,它會存放線程的一些信息,例如優先級、線程名稱、線程狀態等,也包含線程與線程之間連接用的鏈表結構,線程等待事件集合等,詳細定義如下(在rtdef.h中定義):

為led線程定義一個線程控制塊:

staticstructrt_threadled_thread;

線程函數

線程控制塊中的 entry 是線程的入口函數,它是線程實現預期功能的函數。線程的入口函數由用戶設
計實現,一般有以下兩種代碼形式:

無限循環模式:

在實時系統中,線程通常是被動式的:這個是由實時系統的特性所決定的,實時系統通常總是等待外界事件的發生,而后進行相應的服務:

順序執行或有限次循環模式:

如簡單的順序語句、 do whlie() 或 for() 循環等,此類線程不會循環或不會永久循環,可謂是 “一次性”線程,一定會被執行完畢。在執行完畢后,線程將被系統自動刪除。

動態線程與靜態線程

我們的用戶線程有兩種創建方式,一種是靜態線程,另一種是動態線程。

創建靜態線程的函數:

返回值為錯誤代碼。

創建動態線程的函數:

返回值為線程控制塊 。

線程創建實例

創建一個靜態線程

1、確定線程棧

2、定義線程控制塊

3、創建線程函數。

#include #include #include /*靜態線程相關宏定義*/ #defineTHREAD_PRIORITY25/*優先級*/ #defineSTACK_SIZE512/*棧大小*/ #defineTIMESLICE5/*時間片*/ /*線程三要素*/ staticrt_uint8_tstatic_thread_stack[STACK_SIZE];/*線程棧*/ staticstructrt_threadstatic_thread;/*線程控制塊*/ staticvoidstatic_thread_entry(void*parameter);/*線程入口函數*/ /*靜態線程入口函數*/ staticvoidstatic_thread_entry(void*parameter) { rt_uint32_ti=0; rt_kprintf("Thisisstaticthread!\n"); /*無限循環*/ while(1) { rt_kprintf("staticthreadcount:%d\r\n",++i); /*等待0.5s,讓出cpu權限,切換到其他線程*/ rt_thread_delay(500); } } /*主函數*/ intmain(void) { rt_err_tresult; /*創建靜態線程:優先級 25 ,時間片 5個系統滴答,線程棧512字節*/ result=rt_thread_init(&static_thread, "static_thread", static_thread_entry, RT_NULL, (rt_uint8_t*)&static_thread_stack[0], STACK_SIZE, THREAD_PRIORITY, TIMESLICE); /*創建成功則啟動靜態線程*/ if(result==RT_EOK) { rt_thread_startup(&static_thread); } }

運行結果為:

可見,在T-Thread中創建一個線程需要線程棧、線程控制塊與線程函數這三要素。除此之外,需要設置一個線程優先級,因為RT-Thread的調度器是基于優先級的搶占式調度算法。還需要設置一個時間片參數,這個用于多個線程具有同等優先級的情況下,采用時間片的輪轉調度算法進行調度,這個值與時間節拍有關,每一秒的節拍數可在rtconfig.h里進行設置:

在這里我們只創建一個線程,所以時間片我們沒有用到,但也需要傳遞一個時間片的值給rt_thread_init函數。最后,在主函數里調用相關接口創建一個靜態線程,創建成功則啟動該線程。

創建一個動態線程

創建動態線程與創建靜態線程類似:

#include #include #include /*動態線程相關宏定義*/ #defineTHREAD_PRIORITY25/*優先級*/ #defineSTACK_SIZE512/*棧大小*/ #defineTIMESLICE5/*時間片*/ /*線程三要素*/ staticrt_uint8_tdynamic_thread_stack[STACK_SIZE];/*線程棧*/ staticstructrt_threaddynamic_thread;/*線程控制塊*/ staticvoiddynamic_thread_entry(void*parameter);/*線程入口函數*/ /*動態線程入口函數*/ staticvoiddynamic_thread_entry(void*parameter) { rt_uint32_ti; /*無限循環*/ while(1) { for(i=0;i

運行結果:

靜態線程VS動態線程

上例中,從運行結果上看,是沒有任何差別的!那么,我們在實際中如何抉擇?

使用靜態線程時,必須先定義靜態的線程控制塊,并且定義好棧空間,然后調用rt_thread_init()函數來完成線程的初始化工作。采用這種方式,線程控制塊和堆棧占用的內存會放在 RW/ZI 段,這段空間在編譯時就已經確定,它不是可以動態分配的,所以不能被釋放,而只能使用 rt_thread_detach()函數將該線程控制塊從對象管理器中脫離。
使用動態定義方式 rt_thread_create()時, RT-Thread 會動態申請線程控制塊和堆棧空間。在編譯時,編譯器是不會感知到這段空間的,只有在程序運行時, RT-Thread 才會從系統堆中申請分配這段內存空間,當不需要使用該線程時,調用 rt_thread_delete()函數就會將這段申請的內存空間重新釋放到內存堆中。

這兩種方式各有利弊,靜態定義方式會占用 RW/ZI 空間,但是不需要動態分配內存,運行時效率較高,實時性較好。動態方式不會占用額外的 RW/ZI 空間,占用空間小,但是運行時需要動態分配內存,效率沒有靜態方式高。

總的來說,這兩種方式就是空間和時間效率的平衡,可以根據實際環境需求選擇采用具體的分配方式。就像C編程中,何時使用動態空間,何時使用靜態空間,也需要根據實際情況平衡選擇。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 多線程
    +關注

    關注

    0

    文章

    279

    瀏覽量

    20193
  • 線程
    +關注

    關注

    0

    文章

    507

    瀏覽量

    19990
  • RT-Thread
    +關注

    關注

    31

    文章

    1337

    瀏覽量

    41305
收藏 0人收藏

    評論

    相關推薦

    直流電機基本知識彩色PDF來啦

    1 直流電機的工作原理、主要結構、額定值 2直流電機的電樞繞組 3直流電機的電樞反應 4電樞繞組感應電動勢和電磁轉矩 5直流電機換向 一文帶你了解直流電機基本知識,免費下載
    發表于 02-28 01:28

    socket 多線程編程實現方法

    在現代網絡編程中,多線程技術被廣泛應用于提高服務器的并發處理能力。Socket編程是網絡通信的基礎,而將多線程技術應用于Socket編程,可以顯著提升服務器的性能。 多線程編程的基本概念 多
    的頭像 發表于 11-12 14:16 ?724次閱讀

    摩爾線程完成股改,籌備上市

    近日,摩爾線程智能科技(北京)股份有限公司(簡稱“摩爾線程”)宣布已完成股改,并正積極籌備上市。據國家企業信用信息公示系統最新查詢結果顯示,摩爾線程的市場主體類型在10月28日已從其他有限責任公司
    的頭像 發表于 11-12 14:15 ?899次閱讀

    IGB基本知識匯總

    本文對IGBT領域的深入研究與綜合剖析成果,首先與您分享關于IGBT的基本原理及其構成元素,如芯片、單管及模塊等方面的知識。接下來將共同關注的是IGBT在各個行業中的廣泛應用。
    的頭像 發表于 10-29 10:15 ?811次閱讀
    IGB<b class='flag-5'>基本知識</b>匯總

    Python中多線程和多進程的區別

    Python作為一種高級編程語言,提供了多種并發編程的方式,其中多線程與多進程是最常見的兩種方式之一。在本文中,我們將探討Python中多線程與多進程的概念、區別以及如何使用線程池與進程池來提高并發執行效率。
    的頭像 發表于 10-23 11:48 ?766次閱讀
    Python中多<b class='flag-5'>線程</b>和多進程的區別

    CPU線程和程序線程的區別

    CPU的線程與程序的線程在概念、作用、實現方式以及性能影響等方面存在顯著差異。以下是對兩者區別的詳細闡述,旨在深入探討這一技術話題。
    的頭像 發表于 09-02 11:18 ?1684次閱讀

    堆棧和內存的基本知識

    本文主要聊聊關于堆棧的內容。包括堆棧和內存的基本知識。常見和堆棧相關的 bug,如棧溢出,內存泄漏,堆內存分配失敗等。后面介紹軟件中堆棧統計的重要性,以及如何使用工具工具軟件中堆棧使用的范圍,并給出在軟件開發中,如何降低堆棧問題,優化堆棧的一些實踐。
    的頭像 發表于 08-29 14:10 ?767次閱讀
    堆棧和內存的<b class='flag-5'>基本知識</b>

    光刻工藝的基本知識

    在萬物互聯,AI革命興起的今天,半導體芯片已成為推動現代社會進步的心臟。而光刻(Lithography)技術,作為先進制造中最為精細和關鍵的工藝,不管是半導體芯片、MEMS器件,還是微納光學元件都離不開光刻工藝的參與,其重要性不言而喻。本文將帶您一起認識光刻工藝的基本知識
    的頭像 發表于 08-26 10:10 ?1395次閱讀
    光刻工藝的<b class='flag-5'>基本知識</b>

    一文掌握Python多線程

    使用線程可以把占據長時間的程序中的任務放到后臺去處理。
    的頭像 發表于 08-05 15:46 ?1096次閱讀

    鴻蒙開發:線程模型

    FA模型下的線程主要有如下三類
    的頭像 發表于 06-24 17:27 ?585次閱讀
    鴻蒙開發:<b class='flag-5'>線程</b>模型

    探索虛擬線程:原理與實現

    虛擬線程的引入與優勢 在Loom項目之前,Java虛擬機(JVM)中的線程是通過java.lang.Thread類型來實現的,這些線程被稱為平臺線程。 然而,平臺
    的頭像 發表于 06-24 11:35 ?462次閱讀
    探索虛擬<b class='flag-5'>線程</b>:原理與實現

    摩爾線程與智譜AI完成大模型性能測試與適配

    近日,摩爾線程與智譜AI在人工智能領域開展了一輪深入的合作,共同對GPU大模型進行了適配及性能測試。此次測試不僅涵蓋了大模型的推理能力,還涉及了基于摩爾線程夸娥(KUAE)千卡智算集群的大模型預訓練,旨在全面評估摩爾線程GPU在
    的頭像 發表于 06-14 16:40 ?1302次閱讀

    鴻蒙開發:【線程模型】

    管理其他線程的ArkTS引擎實例,例如使用TaskPool(任務池)創建任務或取消任務、啟動和終止Worker線程
    的頭像 發表于 06-13 16:38 ?585次閱讀
    鴻蒙開發:【<b class='flag-5'>線程</b>模型】

    動態線程池思想學習及實踐

    相關文檔 美團線程池實踐:https://tech.meituan.com/2020/04/02/java-pooling-pratice-in-meituan.html 線程池思想解析:https
    的頭像 發表于 06-13 15:43 ?1361次閱讀
    動態<b class='flag-5'>線程</b>池思想學習及實踐

    熱釋電傳感器基本知識和使用中的常見問題

    電子發燒友網站提供《熱釋電傳感器基本知識和使用中的常見問題》資料免費下載
    發表于 06-11 09:06 ?2次下載
    主站蜘蛛池模板: 毛片免费观看视频 | 最近免费中文字幕MV免费高清 | 99re8久久热在线视频 | 欧美69xxx | 桃花在线观看播放 | 116美女写真午夜电影z | 国产精品99久久久久久AV下载 | 91久久偷偷做嫩草影院免费看 | 九九精品视频在线播放 | 欧洲馒头大肥p | 我把寡妇日出水好爽 | 亚洲精品免费视频 | 久久五月综合婷婷中文云霸高清 | 人人爽久久久噜噜噜丁香AV | 国产精品亚洲精品影院 | 99这里有精品视频视频 | 亚洲看片网站 | 无码观看AAAAAAAA片 | 哪灬你的鸣巴好大 | 俄罗斯性孕妇孕交 | 亚洲AVAV天堂AV在线网爱情 | 有码 亚洲 制服 国产 在线 | 东北足疗店妓女在线观看 | 三级黄色小视频 | 色拍拍噜噜噜啦啦新网站 | 日日摸夜添夜夜夜添高潮 | FREECHINESE东北群交 | 91视频3p| 国产在线播放不卡 | 亚洲欧美中文字幕网站大全 | 一进一出抽搐gif免费60秒 | 亚洲AV一宅男色影视 | 欧美区 bt | 又粗又大又爽又黄的免费视频 | 三级叫床震大尺度视频 | 永久免费在线观看视频 | 中文字幕按摩 | 精品无码日本蜜桃麻豆 | 视频成人永久免费视频 | 亚洲精品一区二区在线看片 | 无码99久热只有精品视频在线 |

    電子發燒友

    中國電子工程師最喜歡的網站

    • 2931785位工程師會員交流學習
    • 獲取您個性化的科技前沿技術信息
    • 參加活動獲取豐厚的禮品