日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

RTthread-线程的创建

發布時間:2024/3/26 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 RTthread-线程的创建 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、RTthread線程

RT-Thread名為實時線程RTOS, 那么什么叫線程?

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

在RT-Thread中,與上述小任務對應的程序實體就叫做“線程”(或任務),RT-Thread就是一個能對這些小“線程”進行管理和調度的多“線程”操作系統。線程是實現任務的載體,它是RT-Thread中最基本的調度單位,它描述了一個任務執行的運行環境,也描述了這個任務所處的優先等級。

線程的組成:
RTthread中,線程由三部分組成:線程代碼(入口函數)、線程控制塊、線程堆棧
線程代碼:(線程的代碼,我們也常稱為,入口函數)

線程控制塊
線程控制塊是操作系統用于管理線程的一個數據結構,他會存放線程的一些信息,例如優先級、線程名稱、線程狀態等,也包線程與線程之間連接用的鏈表結構,線程等待事件的集合等。

struct rt_thread struct rt_thread *rt_thread

在RTthread參考例程中,是這么一個結構體

我們點進入看一下,內部定義的線程控制塊:

線程棧:
RT-Thread每個線程都具有獨立的棧空間,當進行線程切換時,系統 會將當前線程的上下文保存在線程棧中,當線程 要恢復運行時,再從線程棧中讀取上下文信息,恢復線程的運行。

線程上下文是指線程執行時的環境,具體來說就是各個變量和數據包括所有寄存器變量、堆棧信息、內存信息等。

線程棧在形式上是-段連續的內存空間 ,我們可以通過定 義個數組或者申請 段動態內存來作為線程的棧。

二、線程的創建


在我們創建線程的時候,我們有兩個API函數可以用:
rt_err_t rt_thread_init : 這個API函數,創建一個靜態線程。
rt_err_t rt_thread_creat: 這個API函數,創建動態的線程。

通常我們使用的一個啟動線程API函數為:
rt_err_t rt_thread_startup(rt_thread_t thread),調用此函數后創建的線程會被加入到線程的就緒隊列中,執行調度。

rt_err_t rt_thread_init,在這里,我們講解一下,在這個API函數中,

  • 首先需要一個線程控制塊:struct rt_thread *thread的地址,
  • 為線程起一個響當當的名字;
  • 第三個變量為該線程的入口代碼;
  • parameter,指傳入函數的變量,沒有的話,變量可以為0;
  • 第五個參數,為傳入函數的棧;
  • 第六個參數,為棧的大小;
  • 第七個參數,線程執行的優先順序;
  • 第八個參數,tick的一個時間片;
  • rt_err_t rt_thread_creat:這個API函數:

  • 創建一個線程的名字;
  • 第二個變量為該線程的入口代碼;
  • 第三個為傳入函數的變量,沒有的話,變量可以為0;
  • 第四個參數,為棧的大小;
  • 第五個參數,線程執行的優先順序;
  • 第六個參數,tick的一個時間片;
  • 三、線程的基礎例程介紹:


    在這個樣例中,我們看到,
    第一個使用的是動態創建線程,如果創建不成功,就不能啟動此線程;可以從這里點進去看所有關于該線程的所有參數,了解線程的構造,并且這里我們可以得到線程1中,如果初始化成功,則返回的是一個指針;

    第二個線程使用的靜態創建線程,分配內存空間,并創建線程,同動態內存分配差不多;

    下面是線程1的線程入口:

    這里使用的是一個無線循環的計數器,每等待500ms,計數器+1;

    四、運行程序


    之后就會創建線程;

    創建之后,在這里運行此程序,將會看到

    線程2,先打印!!!

    這是為什么呢?
    如果我們仔細去找程序的話,會發現,線程2的優先級設置的時候比線程1的優先級高且沒有讓出線程時間片的動作(代碼),所以先打印了線程2,才打印線程1;

    五、靜態與動態線程的區別

    使用靜態定義方式時,必須先定義靜態的線程控制塊,并且定義好堆棧空間,然后調用rt_thread_init來完成線程的初始化工作。采用這種方式,線程控制塊和堆棧占用的內存會放在RAM段,這段空間在編譯時就已經確定,它不是可以動態分配的,所以不能被釋放。而只能使用rt_thread_detach函數將該線程控制塊從對象管理器中脫離。

    使用動態定義方式rt_thread_create時,RT-Thread會動態申請線程控制塊和堆棧空間。在編譯時,編譯器是不會感知到這段空間的,只有在程序運行時,RT-Thread才會從系統堆中申請分配這段內存空間,當不需要使用該線程時,調用rt_thread_delete函數就會將這段申請的內存空間重新釋放到內存堆中。

    這兩種方式各有利弊,
    靜態定義方式會占用RAM空間,但是不需要動態分配內存,運行時效率高。
    動態方式不會占用額外的RAM空間,占用空間小,但是運行時需要動態分配內存,效率沒有靜態方式高。
    總的來說,這兩種方式就是空間和時間效率的平衡,可以根據實際環境需求選擇采用具體的分配方式。

    總結

    以上是生活随笔為你收集整理的RTthread-线程的创建的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。