91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀(guān)看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

線(xiàn)程的基本知識(shí)

黃工的嵌入式技術(shù)圈 ? 來(lái)源:黃工的嵌入式技術(shù)圈 ? 作者:黃工的嵌入式技術(shù) ? 2020-02-04 15:42 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

今天給大家分享一點(diǎn)RT-Thread的基礎(chǔ)知識(shí)。

什么是線(xiàn)程?

人們?cè)谏钪刑幚韽?fù)雜問(wèn)題時(shí),慣用的方法就是分而治之,即把一個(gè)大問(wèn)題分解成多個(gè)相對(duì)簡(jiǎn)單、比較容易解決的小問(wèn)題,小問(wèn)題逐個(gè)被解決了,大問(wèn)題也就隨之解決了。同樣,在設(shè)計(jì)一個(gè)較為復(fù)雜的應(yīng)用程序時(shí),也通常把一個(gè)大型任務(wù)分解成多個(gè)小任務(wù),然后通過(guò)運(yùn)行這些小任務(wù),最終達(dá)到完成大任務(wù)的目的。

在裸機(jī)系統(tǒng)中, 系統(tǒng)的主體就是 main 函數(shù)里面順序執(zhí)行的無(wú)限循環(huán),這個(gè)無(wú)限循環(huán)里面 CPU 按照順序完成各種事情。在多線(xiàn)程系統(tǒng)中,我們根據(jù)功能的不同,把整個(gè)系統(tǒng)分割成一個(gè)個(gè)獨(dú)立的且無(wú)法返回的函數(shù),這個(gè)函數(shù)我們稱(chēng)為線(xiàn)程。

線(xiàn)程由哪些部分組成?

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

線(xiàn)程棧

在一個(gè)裸機(jī)系統(tǒng)中, 如果有全局變量,有子函數(shù)調(diào)用,有中斷發(fā)生。那么系統(tǒng)在運(yùn)行的時(shí)候,全局變量放在哪里,子函數(shù)調(diào)用時(shí),局部變量放在哪里, 中斷發(fā)生時(shí),函數(shù)返回地址發(fā)哪里。

如果只是單純的裸機(jī)編程,它們放哪里我們不用管,但是如果要寫(xiě)一個(gè) RTOS,這些種種環(huán)境參數(shù),我們必須弄清楚他們是如何存儲(chǔ)的。

在裸機(jī)系統(tǒng)中,他們統(tǒng)統(tǒng)放在一個(gè)叫棧的地方,棧是單片機(jī) RAM 里面一段連續(xù)的內(nèi)存空間,棧的大小一般在啟動(dòng)文件或者鏈接腳本里面指定, 最后由 C 庫(kù)函數(shù)_main 進(jìn)行初始化。

但是, 在多線(xiàn)程系統(tǒng)中,每個(gè)線(xiàn)程都是獨(dú)立的,互不干擾的,所以要為每個(gè)線(xiàn)程都分配獨(dú)立的棧空間,這個(gè)棧空間通常是一個(gè)預(yù)先定義好的全局?jǐn)?shù)組, 也可以是動(dòng)態(tài)分配的一段內(nèi)存空間,但它們都存在于 RAM 中。如:

staticrt_uint8_tled_stack[512];

線(xiàn)程棧其實(shí)就是一個(gè)預(yù)先定義好的全局?jǐn)?shù)據(jù),數(shù)據(jù)類(lèi)型為rt_uint8_t,大小我們?cè)O(shè)置為 512。在 RT-Thread 中,凡是涉及到數(shù)據(jù)類(lèi)型的地方, RTThread 都會(huì)將標(biāo)準(zhǔn)的 C 數(shù)據(jù)類(lèi)型用 typedef 重新取一個(gè)類(lèi)型名, 以“rt”前綴開(kāi)頭。這些經(jīng)過(guò)重定義的數(shù)據(jù)類(lèi)型放在 rtdef.h ,如:

線(xiàn)程控制塊

在 RT-Thread 中,線(xiàn)程控制塊由結(jié)構(gòu)體 struct rt_thread 表示,線(xiàn)程控制塊是操作系統(tǒng)用于管理線(xiàn)程的一個(gè)數(shù)據(jù)結(jié)構(gòu),它會(huì)存放線(xiàn)程的一些信息,例如優(yōu)先級(jí)、線(xiàn)程名稱(chēng)、線(xiàn)程狀態(tài)等,也包含線(xiàn)程與線(xiàn)程之間連接用的鏈表結(jié)構(gòu),線(xiàn)程等待事件集合等,詳細(xì)定義如下(在rtdef.h中定義):

為led線(xiàn)程定義一個(gè)線(xiàn)程控制塊:

staticstructrt_threadled_thread;

線(xiàn)程函數(shù)

線(xiàn)程控制塊中的 entry 是線(xiàn)程的入口函數(shù),它是線(xiàn)程實(shí)現(xiàn)預(yù)期功能的函數(shù)。線(xiàn)程的入口函數(shù)由用戶(hù)設(shè)
計(jì)實(shí)現(xiàn),一般有以下兩種代碼形式:

無(wú)限循環(huán)模式:

在實(shí)時(shí)系統(tǒng)中,線(xiàn)程通常是被動(dòng)式的:這個(gè)是由實(shí)時(shí)系統(tǒng)的特性所決定的,實(shí)時(shí)系統(tǒng)通常總是等待外界事件的發(fā)生,而后進(jìn)行相應(yīng)的服務(wù):

順序執(zhí)行或有限次循環(huán)模式:

如簡(jiǎn)單的順序語(yǔ)句、 do whlie() 或 for() 循環(huán)等,此類(lèi)線(xiàn)程不會(huì)循環(huán)或不會(huì)永久循環(huán),可謂是 “一次性”線(xiàn)程,一定會(huì)被執(zhí)行完畢。在執(zhí)行完畢后,線(xiàn)程將被系統(tǒng)自動(dòng)刪除。

動(dòng)態(tài)線(xiàn)程與靜態(tài)線(xiàn)程

我們的用戶(hù)線(xiàn)程有兩種創(chuàng)建方式,一種是靜態(tài)線(xiàn)程,另一種是動(dòng)態(tài)線(xiàn)程。

創(chuàng)建靜態(tài)線(xiàn)程的函數(shù):

返回值為錯(cuò)誤代碼。

創(chuàng)建動(dòng)態(tài)線(xiàn)程的函數(shù):

返回值為線(xiàn)程控制塊 。

線(xiàn)程創(chuàng)建實(shí)例

創(chuàng)建一個(gè)靜態(tài)線(xiàn)程

1、確定線(xiàn)程棧

2、定義線(xiàn)程控制塊

3、創(chuàng)建線(xiàn)程函數(shù)。

#include #include #include /*靜態(tài)線(xiàn)程相關(guān)宏定義*/ #defineTHREAD_PRIORITY25/*優(yōu)先級(jí)*/ #defineSTACK_SIZE512/*棧大小*/ #defineTIMESLICE5/*時(shí)間片*/ /*線(xiàn)程三要素*/ staticrt_uint8_tstatic_thread_stack[STACK_SIZE];/*線(xiàn)程棧*/ staticstructrt_threadstatic_thread;/*線(xiàn)程控制塊*/ staticvoidstatic_thread_entry(void*parameter);/*線(xiàn)程入口函數(shù)*/ /*靜態(tài)線(xiàn)程入口函數(shù)*/ staticvoidstatic_thread_entry(void*parameter) { rt_uint32_ti=0; rt_kprintf("Thisisstaticthread!\n"); /*無(wú)限循環(huán)*/ while(1) { rt_kprintf("staticthreadcount:%d\r\n",++i); /*等待0.5s,讓出cpu權(quán)限,切換到其他線(xiàn)程*/ rt_thread_delay(500); } } /*主函數(shù)*/ intmain(void) { rt_err_tresult; /*創(chuàng)建靜態(tài)線(xiàn)程:優(yōu)先級(jí) 25 ,時(shí)間片 5個(gè)系統(tǒng)滴答,線(xiàn)程棧512字節(jié)*/ 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); /*創(chuàng)建成功則啟動(dòng)靜態(tài)線(xiàn)程*/ if(result==RT_EOK) { rt_thread_startup(&static_thread); } }

運(yùn)行結(jié)果為:

可見(jiàn),在T-Thread中創(chuàng)建一個(gè)線(xiàn)程需要線(xiàn)程棧、線(xiàn)程控制塊與線(xiàn)程函數(shù)這三要素。除此之外,需要設(shè)置一個(gè)線(xiàn)程優(yōu)先級(jí),因?yàn)镽T-Thread的調(diào)度器是基于優(yōu)先級(jí)的搶占式調(diào)度算法。還需要設(shè)置一個(gè)時(shí)間片參數(shù),這個(gè)用于多個(gè)線(xiàn)程具有同等優(yōu)先級(jí)的情況下,采用時(shí)間片的輪轉(zhuǎn)調(diào)度算法進(jìn)行調(diào)度,這個(gè)值與時(shí)間節(jié)拍有關(guān),每一秒的節(jié)拍數(shù)可在rtconfig.h里進(jìn)行設(shè)置:

在這里我們只創(chuàng)建一個(gè)線(xiàn)程,所以時(shí)間片我們沒(méi)有用到,但也需要傳遞一個(gè)時(shí)間片的值給rt_thread_init函數(shù)。最后,在主函數(shù)里調(diào)用相關(guān)接口創(chuàng)建一個(gè)靜態(tài)線(xiàn)程,創(chuàng)建成功則啟動(dòng)該線(xiàn)程。

創(chuàng)建一個(gè)動(dòng)態(tài)線(xiàn)程

創(chuàng)建動(dòng)態(tài)線(xiàn)程與創(chuàng)建靜態(tài)線(xiàn)程類(lèi)似:

#include #include #include /*動(dòng)態(tài)線(xiàn)程相關(guān)宏定義*/ #defineTHREAD_PRIORITY25/*優(yōu)先級(jí)*/ #defineSTACK_SIZE512/*棧大小*/ #defineTIMESLICE5/*時(shí)間片*/ /*線(xiàn)程三要素*/ staticrt_uint8_tdynamic_thread_stack[STACK_SIZE];/*線(xiàn)程棧*/ staticstructrt_threaddynamic_thread;/*線(xiàn)程控制塊*/ staticvoiddynamic_thread_entry(void*parameter);/*線(xiàn)程入口函數(shù)*/ /*動(dòng)態(tài)線(xiàn)程入口函數(shù)*/ staticvoiddynamic_thread_entry(void*parameter) { rt_uint32_ti; /*無(wú)限循環(huán)*/ while(1) { for(i=0;i

運(yùn)行結(jié)果:

靜態(tài)線(xiàn)程VS動(dòng)態(tài)線(xiàn)程

上例中,從運(yùn)行結(jié)果上看,是沒(méi)有任何差別的!那么,我們?cè)趯?shí)際中如何抉擇?

使用靜態(tài)線(xiàn)程時(shí),必須先定義靜態(tài)的線(xiàn)程控制塊,并且定義好??臻g,然后調(diào)用rt_thread_init()函數(shù)來(lái)完成線(xiàn)程的初始化工作。采用這種方式,線(xiàn)程控制塊和堆棧占用的內(nèi)存會(huì)放在 RW/ZI 段,這段空間在編譯時(shí)就已經(jīng)確定,它不是可以動(dòng)態(tài)分配的,所以不能被釋放,而只能使用 rt_thread_detach()函數(shù)將該線(xiàn)程控制塊從對(duì)象管理器中脫離。
使用動(dòng)態(tài)定義方式 rt_thread_create()時(shí), RT-Thread 會(huì)動(dòng)態(tài)申請(qǐng)線(xiàn)程控制塊和堆??臻g。在編譯時(shí),編譯器是不會(huì)感知到這段空間的,只有在程序運(yùn)行時(shí), RT-Thread 才會(huì)從系統(tǒng)堆中申請(qǐng)分配這段內(nèi)存空間,當(dāng)不需要使用該線(xiàn)程時(shí),調(diào)用 rt_thread_delete()函數(shù)就會(huì)將這段申請(qǐng)的內(nèi)存空間重新釋放到內(nèi)存堆中。

這兩種方式各有利弊,靜態(tài)定義方式會(huì)占用 RW/ZI 空間,但是不需要?jiǎng)討B(tài)分配內(nèi)存,運(yùn)行時(shí)效率較高,實(shí)時(shí)性較好。動(dòng)態(tài)方式不會(huì)占用額外的 RW/ZI 空間,占用空間小,但是運(yùn)行時(shí)需要?jiǎng)討B(tài)分配內(nèi)存,效率沒(méi)有靜態(tài)方式高。

總的來(lái)說(shuō),這兩種方式就是空間和時(shí)間效率的平衡,可以根據(jù)實(shí)際環(huán)境需求選擇采用具體的分配方式。就像C編程中,何時(shí)使用動(dòng)態(tài)空間,何時(shí)使用靜態(tài)空間,也需要根據(jù)實(shí)際情況平衡選擇。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀(guān)點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 多線(xiàn)程
    +關(guān)注

    關(guān)注

    0

    文章

    279

    瀏覽量

    21033
  • 線(xiàn)程
    +關(guān)注

    關(guān)注

    0

    文章

    509

    瀏覽量

    20829
  • RT-Thread
    +關(guān)注

    關(guān)注

    32

    文章

    1614

    瀏覽量

    44889
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    摩爾線(xiàn)程正式開(kāi)源TileLang-MUSA項(xiàng)目

    近日,摩爾線(xiàn)程正式開(kāi)源TileLang-MUSA項(xiàng)目,實(shí)現(xiàn)對(duì)TileLang編程語(yǔ)言的完整支持。該項(xiàng)目已成功在摩爾線(xiàn)程多代全功能GPU上完成功能驗(yàn)證與特性開(kāi)發(fā),旨在通過(guò)高層抽象與編譯器優(yōu)化,大幅降低開(kāi)發(fā)門(mén)檻,為國(guó)產(chǎn)算力平臺(tái)提供更高效的AI與高性能計(jì)算開(kāi)發(fā)體驗(yàn)。
    的頭像 發(fā)表于 02-11 16:57 ?1261次閱讀

    解析Linux的進(jìn)程、線(xiàn)程和協(xié)程

    系統(tǒng)的穩(wěn)定性和安全性。 (3)創(chuàng)建與銷(xiāo)毀:Linux使用fork()系統(tǒng)調(diào)用來(lái)創(chuàng)建新進(jìn)程,通過(guò)exit()來(lái)終止進(jìn)程。 線(xiàn)程(Thread) 線(xiàn)程是進(jìn)程內(nèi)的執(zhí)行單元,多個(gè)線(xiàn)程共享相同的內(nèi)存空間
    發(fā)表于 12-22 11:00

    線(xiàn)程的系統(tǒng)

    線(xiàn)程系統(tǒng)的事件響應(yīng)也是在中斷中完成的,但事件的處理是在線(xiàn)程中完成的。在多線(xiàn)程系統(tǒng)中,線(xiàn)程跟中斷一樣,也具有優(yōu)先級(jí),優(yōu)先級(jí)高的線(xiàn)程會(huì)被優(yōu)先執(zhí)
    發(fā)表于 12-08 07:55

    Linux多線(xiàn)程對(duì)比單線(xiàn)程的優(yōu)勢(shì)

    在Linux系統(tǒng)中,線(xiàn)程是操作系統(tǒng)能夠進(jìn)行運(yùn)算調(diào)度的最小單位。線(xiàn)程被包含在進(jìn)程之中,是進(jìn)程中的實(shí)際運(yùn)行單位。一個(gè)進(jìn)程可以擁有多個(gè)線(xiàn)程,這些線(xiàn)程共享相同的內(nèi)存空間和系統(tǒng)資源。
    發(fā)表于 12-01 06:11

    舵機(jī)的基本知識(shí)

    舵機(jī)是一種能精確控制旋轉(zhuǎn)角度的驅(qū)動(dòng)裝置,核心作用是將電信號(hào)轉(zhuǎn)化為特定角度的機(jī)械運(yùn)動(dòng),廣泛用于需要精準(zhǔn)定位的場(chǎng)景。 一、舵機(jī)的核心構(gòu)成 舵機(jī)主要由四個(gè)關(guān)鍵部分組成,各部分協(xié)同工作實(shí)現(xiàn)角度控制。 直流電機(jī) :提供基礎(chǔ)動(dòng)力,是舵機(jī)運(yùn)動(dòng)的動(dòng)力源。 減速齒輪組 :降低電機(jī)轉(zhuǎn)速、提升扭矩,讓輸出軸能帶動(dòng)更重的負(fù)載。 電位器(位置傳感器) :實(shí)時(shí)檢測(cè)輸出軸的當(dāng)前角度,將角度信息反饋給控制電路。 控制電路 :接收外部控制信號(hào),對(duì)
    的頭像 發(fā)表于 10-28 09:57 ?488次閱讀

    國(guó)家信息中心與摩爾線(xiàn)程達(dá)成戰(zhàn)略合作

    10月21日上午,國(guó)家信息中心與摩爾線(xiàn)程在北京舉行戰(zhàn)略合作協(xié)議簽約儀式。國(guó)家信息中心主任徐強(qiáng),摩爾線(xiàn)程創(chuàng)始人、董事長(zhǎng)兼首席執(zhí)行官?gòu)埥ㄖ谐鱿灱s儀式。國(guó)家信息中心副主任周民與摩爾線(xiàn)程聯(lián)合創(chuàng)始人兼首席運(yùn)營(yíng)官周苑代表雙方簽署戰(zhàn)略合作協(xié)
    的頭像 發(fā)表于 10-23 15:52 ?552次閱讀

    rtt中建兩個(gè)線(xiàn)程a和b,怎么確保線(xiàn)程a執(zhí)行完立刻切到線(xiàn)程b?

    怎么獲取從線(xiàn)程開(kāi)始切換到切換完成用的總的CPU時(shí)鐘節(jié)拍數(shù)量?
    發(fā)表于 10-10 06:37

    tcpip線(xiàn)程被mu0鎖住導(dǎo)致網(wǎng)絡(luò)線(xiàn)程無(wú)法使用怎么解決?

    各位好,我使用rtthread開(kāi)發(fā)STM32F407VGT6芯片,程序有多個(gè)線(xiàn)程,每個(gè)線(xiàn)程都會(huì)創(chuàng)建一個(gè)socket,建立tcp連接或者udp連接,現(xiàn)在出現(xiàn)一個(gè)問(wèn)題,程序長(zhǎng)時(shí)間運(yùn)行有概率死機(jī),但是沒(méi)有
    發(fā)表于 09-29 06:41

    線(xiàn)程刪除時(shí)遇到斷言,是什么原因?qū)е碌模?/a>

    在一個(gè)線(xiàn)程中調(diào)用線(xiàn)程刪除函數(shù)刪除另外一個(gè)線(xiàn)程,這2個(gè)線(xiàn)程的優(yōu)先級(jí)是相等的,被刪除的線(xiàn)程也是動(dòng)態(tài)創(chuàng)建的,出現(xiàn)了下面的斷言?xún)?nèi)容,一般是什么情況導(dǎo)
    發(fā)表于 09-12 06:08

    rtth studio中nano 如何創(chuàng)建動(dòng)態(tài)線(xiàn)程

    有沒(méi)有大佬,可以說(shuō)一下為什么靜態(tài)線(xiàn)程可以正常使用,動(dòng)態(tài)線(xiàn)程怎么也使用不了。 具體需要什么配置才能使用動(dòng)態(tài)線(xiàn)程創(chuàng)建。謝謝!
    發(fā)表于 09-11 06:01

    A25:MCU系統(tǒng)器件知識(shí)與應(yīng)用專(zhuān)題--MCU、EEPROM/FLASH和晶體/晶振知識(shí)及應(yīng)用案例

    、晶振等),分別介紹器件的特點(diǎn)、用途、關(guān)鍵選型參數(shù)、供應(yīng)資源,給出具體的選型應(yīng)用案例。 主要內(nèi)容: 1、從人體模型、BMS單板架構(gòu),看MCU系統(tǒng)的位置及作用; 2、介紹MCU的基本知識(shí)(物料
    的頭像 發(fā)表于 09-09 10:24 ?636次閱讀
    A25:MCU系統(tǒng)器件<b class='flag-5'>知識(shí)</b>與應(yīng)用專(zhuān)題--MCU、EEPROM/FLASH和晶體/晶振<b class='flag-5'>知識(shí)</b>及應(yīng)用案例

    rtt studio中nano 如何創(chuàng)建動(dòng)態(tài)線(xiàn)程?

    有沒(méi)有大佬,可以說(shuō)一下為什么靜態(tài)線(xiàn)程可以正常使用,動(dòng)態(tài)線(xiàn)程怎么也使用不了。 具體需要什么配置才能使用動(dòng)態(tài)線(xiàn)程創(chuàng)建。謝謝!
    發(fā)表于 08-22 06:19

    UVC+MSC實(shí)現(xiàn)中MSC線(xiàn)程未運(yùn)行的原因?

    我正在嘗試使用 EZUSB 運(yùn)行 UVC + MSC。我有以下內(nèi)容。但看起來(lái)只有 UVC 線(xiàn)程在運(yùn)行,而 MSC 沒(méi)有運(yùn)行。fw 不響應(yīng) MSC 命令。我確保 LPM 已被禁用,只是為了檢查傳感器
    發(fā)表于 07-16 07:08

    深度剖析 RT-Thread 線(xiàn)程調(diào)度流程

    RT-Thread調(diào)度第一個(gè)線(xiàn)程的主要流程分如下:rtthread_startup:RTT的啟動(dòng)函數(shù),主要負(fù)責(zé)板級(jí)驅(qū)動(dòng),調(diào)度器,系統(tǒng)線(xiàn)程初始化,啟動(dòng)調(diào)度的工作
    的頭像 發(fā)表于 06-25 18:24 ?1775次閱讀
    深度剖析 RT-Thread <b class='flag-5'>線(xiàn)程</b>調(diào)度流程

    線(xiàn)程的安全注意事項(xiàng)

    線(xiàn)程安全是指多個(gè)線(xiàn)程同時(shí)訪(fǎng)問(wèn)或修改共享資源時(shí),能夠保證程序的正確性和可靠性。 開(kāi)發(fā)者選擇TaskPool或Worker進(jìn)行多線(xiàn)程開(kāi)發(fā)時(shí),在TaskPool和Worker的工作線(xiàn)程中導(dǎo)
    發(fā)表于 06-20 07:49