日本a√视频在线,久久青青亚洲国产,亚洲一区欧美二区,免费g片在线观看网站

        <style id="k3y6c"><u id="k3y6c"></u></style>
        <s id="k3y6c"></s>
        <mark id="k3y6c"></mark>
          
          

          <mark id="k3y6c"></mark>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > RTOS的基本概念與線程基礎(chǔ)知識(shí)

          RTOS的基本概念與線程基礎(chǔ)知識(shí)

          作者: 時(shí)間:2022-10-17 來源:CSDN 收藏

          1 概念及線程的引入

          本文引用地址:http://yuyingmama.com.cn/article/202210/439154.htm

          1.1 的概念

          用人來類比單片機(jī)程序和

          媽媽要一邊給小孩喂飯,一邊加班跟同事交流,怎么辦?

          對(duì)于單線條的人,不能分心,不能同時(shí)做事,她只能這樣做:

          1. 給小孩喂一口飯

          2. 瞄一眼電腦,有信息就去回復(fù)

          3. 再回來給小孩喂一口飯

          4. 如果小孩吃這口飯?zhí)貜?fù)同事的信息也就慢了,被同事催,你半天都不回復(fù)我?

          5. 如果回復(fù)同事的信息要寫一大堆,小孩就餓的大哭起來

          對(duì)于眼明手快的人,她可以一心多用,她這樣做:

          1. 左手拿勺子,給小孩喂飯

          2. 右手敲鍵盤,恢復(fù)同事

          3. 兩不耽誤,小孩“以為”媽媽在專心喂飯,同事以為“她在專心聊天”

          4. 但是腦子只有一個(gè)啊,雖然說一心多用,但是誰能夠同時(shí)考慮兩件事?

          5. 只是她反應(yīng)快,上一秒鐘在考慮夾哪個(gè)菜給小孩,下一秒鐘考慮給同事回復(fù)什么信息

          這種做法,在軟件開發(fā)上,就是使用操作, 在單片機(jī)里叫做使用RTOS

          RTOS的意思是:Real Time Operating System,即實(shí)時(shí)操作,但使用Windows,我們經(jīng)常碰到程序卡死、停頓的現(xiàn)象,日常生活中,這是可以忍受的,但是在電梯中,你按住開門鍵時(shí)如果沒有即刻反應(yīng),即使知識(shí)慢個(gè)一秒鐘,也會(huì)夾住人,在專用的電子設(shè)備中,實(shí)時(shí)性很重要

          1.2 程序簡(jiǎn)單示例:

          //經(jīng)典單片機(jī)程序

          void main()

          {

           

              while(1)

              {

           

                  喂一口飯();

                  回一條消息();

           

              }

           

           

          }

           

          //RTOS程序

          int a;

          喂飯() 棧A

          {

              int b=2;

              int c;

              c = a+b;==>1.b+2,2,c=new val

              --------------------------->切換

              while(1)

              {

                  喂一口飯();

              

           

              }

           

           

          }

           

          回信息() 棧B

          {

              int b;

              while(1)

              {

                  回一個(gè)消息();

           

           

           

              }

           

          }

           

          void main()

          {

              create_task(喂飯);

              create_task(回信息);

              start_scheduler();

              while(1)

              {

                  sleep();

           

              }

           

          }


           1.2 提出問題

          什么叫線程?回答這個(gè)問題之前,先想想怎么切換線程?怎么保存線程?

          • 線程是函數(shù)嗎?函數(shù)需要保存嗎?函數(shù)在Flash上,不會(huì)被破壞,無需保存

          • 函數(shù)里用到的全局變量,全局變量需要保存嗎?全局變量在內(nèi)存上,還能保存到哪里去?全局變量無需保存

          • 函數(shù)里用到了局部變量,局部變量需要保存嗎?局部變量在棧里面,也是在內(nèi)存里,只要避免棧被破壞即可,局部變量無需保存

          • 運(yùn)算的中間值需要保存嗎?中間值保存在哪里?在CPU寄存器里,另一個(gè)線程也要用到CPU寄存器,所以CPU寄存器需要保存

          • 保存在哪里?保存在線程的棧里面

          • 怎么理解CPU寄存器,怎么理解棧?

          2.1 ARM架構(gòu)及匯編

          ARM芯片屬于精簡(jiǎn)指令集計(jì)算機(jī)(RISC:Reduced Instruction Set Computor),它所用的指令比較簡(jiǎn)單,有如下特點(diǎn):

          1、對(duì)內(nèi)存只有讀、寫指令

          2、 對(duì)于數(shù)據(jù)的運(yùn)算是在CPU內(nèi)部實(shí)現(xiàn)

          3、 使用RISC指令的CPU復(fù)雜度小一點(diǎn),易于設(shè)計(jì)

          對(duì)于比如a= a+b這樣的算式,需要經(jīng)過下面四個(gè)步驟才可以實(shí)現(xiàn):

          細(xì)看這幾個(gè)步驟,有些疑問:

          1、讀a,那么a的值讀出來后保存在CPU哪里?

          2、讀b,那么b的值都出來之后保存在哪里?

          3、a+b的結(jié)果又保存在哪里?

          這些問題都涉及到ARM處理器的內(nèi)部,簡(jiǎn)單概括如下,我們先忽略各種CPU模式,用戶模式等。 

          CPU運(yùn)行時(shí),先去取指令,再執(zhí)行指令

          1)把內(nèi)存a的值讀入CPU寄存器R0

          2)把內(nèi)存b的值讀入CPU寄存器R1

          3)把R0和R1累計(jì)存入R0

          4)把R0的值寫入內(nèi)存a

          CPU內(nèi)部寄存器分類

          CPU內(nèi)至少應(yīng)該有數(shù)據(jù)緩沖寄存器,棧指針類寄存器、程序指針類寄存器、程序狀態(tài)類寄存器及其他功能寄存器

          1、數(shù)據(jù)緩沖寄存器

              CPU內(nèi)數(shù)量最多的寄存器是數(shù)據(jù)緩沖寄存器,名字用寄存器英文Register的首字母加數(shù)字組成,如R0、R1、R2等,不同的CPU其種類不同。

          2、棧指針類寄存器

              在計(jì)算機(jī)編程中有全局變量和局部變量的概念。從存儲(chǔ)器的角度來看,對(duì)一個(gè)具有獨(dú)立功能的完整程序來說,全局變量具有固定的地址,每次讀寫都是那個(gè)地址。而在一個(gè)子程序中開辟的局部變量則不同,用RAM中的哪個(gè)地址是不確定的,采用“后進(jìn)先出”的原則使用一段RAM區(qū)域,這段區(qū)域被稱為棧區(qū)。它有一個(gè)棧底的地址, 是一開始就確定的,當(dāng)有數(shù)據(jù)進(jìn)?;蛘叱鰲r(shí),地址就會(huì)連續(xù)變動(dòng),不然就放到同一個(gè)存儲(chǔ)地址中了,CPU需要有個(gè)地方保存這個(gè)不斷變化的地址,這就是棧指針(SP)寄存器。

          3、程序指針類寄存器

              計(jì)算機(jī)的程序存儲(chǔ)在存儲(chǔ)器中,CPU中有個(gè)寄存器指示將要執(zhí)行的指令在存儲(chǔ)器中的位置,這就是程序指針類寄存器。在許多CPU中,它的名字叫做程序計(jì)數(shù)器寄存器(PC),它負(fù)責(zé)告訴CPU將要執(zhí)行的指令在存儲(chǔ)器的什么地方。

          4、程序運(yùn)行狀態(tài)類寄存器

              CPU在進(jìn)行計(jì)算過程中,會(huì)出現(xiàn)諸如進(jìn)位、借位結(jié)果為0、溢出等情況,CPU內(nèi)需要有個(gè)地方把他們保存下來,以便下一條指令結(jié)合這些情況進(jìn)行處理,這類寄存器就是程序狀態(tài)類寄存器,不同的CPU其名稱不同,有的叫做標(biāo)志寄存器,有的叫做程序狀態(tài)字寄存器。

          5、其他功能寄存器

              不同的CPU中,除了具有數(shù)據(jù)緩沖,棧指針、程序指針、程序運(yùn)行狀態(tài)寄存器之外、還有表示浮點(diǎn)數(shù)運(yùn)算、中斷屏蔽等寄存器。

          ARM Cortex-M中的寄存器

          ARM Cortex-M處理器的寄存器主要有R0-R15及3個(gè)特殊功能寄存器,如上圖所示,其中R0-R12為通用寄存器,R13為堆棧指針寄存器(SP)、R14是連接寄存器,R15為程序計(jì)數(shù)器(PC),特殊功能寄存器有預(yù)定義的功能,而且必須通過專用的指令來訪問。

          幾條匯編指令

          需要掌握的匯編指令并不多,只有幾條。

          1. 讀內(nèi)存指令:LDR,即Load之意

          2. 寫內(nèi)存指令:STR,即Store之意

          3. 加減指令:ADD與SUB

          4. 跳轉(zhuǎn):BL,即Branch And Link 

          5. 出棧指令:POP

          6. 入棧指令:PUSH

          匯編并不復(fù)雜:

          加載/存儲(chǔ)指令

          加載指令LDR:LDR r0,[addrA]意思就是將地址addrA的內(nèi)容加載到R0中

          存儲(chǔ)指令STR:  STR r0,[addrA]意思就是將r0的值存儲(chǔ)到地址addrA上

          加法運(yùn)算指令A(yù)DD:ADD r0,r1,r2意思為:r0=r1+r2

          減法運(yùn)算指令SUB:SUB r0,r1,r2意思為:r0=r1-r2

          寄存器入棧/出棧指令

          函數(shù)運(yùn)行的本質(zhì)

          如下是一個(gè)簡(jiǎn)單的程序,主函數(shù)里調(diào)用函數(shù)add_val():

          void add_val(int *pa,int *pb)

          {

              volatile int tmp;

              

              tmp = *pa;

              tmp = tmp + *pb;

              *pa = tmp;

           

          }

           

          int main(void)

          {

           

              int a =1 ;    

              int b = 2;

              add_val(&a,&b);

           

              return 0;

          }

           其中調(diào)用add_val函數(shù)的匯編代碼如下:

          ————————————————

          版權(quán)聲明:本文為CSDN博主「~Old」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明。

          原文鏈接:https://blog.csdn.net/qq_43460068/article/details/126896489



          關(guān)鍵詞: 嵌入式 RTOS 系統(tǒng)

          評(píng)論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉