在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > RTOS的基本概念與線程基礎知識

            RTOS的基本概念與線程基礎知識

            作者: 時間:2022-10-17 來源:CSDN 收藏

            1 概念及線程的引入

            本文引用地址:http://www.biyoush.com/article/202210/439154.htm

            1.1 的概念

            用人來類比單片機程序和

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

            對于單線條的人,不能分心,不能同時做事,她只能這樣做:

            1. 給小孩喂一口飯

            2. 瞄一眼電腦,有信息就去回復

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

            4. 如果小孩吃這口飯?zhí)?,他回復同事的信息也就慢了,被同事催,你半天都不回復?

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

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

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

            2. 右手敲鍵盤,恢復同事

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

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

            5. 只是她反應快,上一秒鐘在考慮夾哪個菜給小孩,下一秒鐘考慮給同事回復什么信息

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

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

            1.2 程序簡單示例:

            //經典單片機程序

            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)

                {

                    回一個消息();

             

             

             

                }

             

            }

             

            void main()

            {

                create_task(喂飯);

                create_task(回信息);

                start_scheduler();

                while(1)

                {

                    sleep();

             

                }

             

            }


             1.2 提出問題

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

            • 線程是函數嗎?函數需要保存嗎?函數在Flash上,不會被破壞,無需保存

            • 函數里用到的全局變量,全局變量需要保存嗎?全局變量在內存上,還能保存到哪里去?全局變量無需保存

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

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

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

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

            2.1 ARM架構及匯編

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

            1、對內存只有讀、寫指令

            2、 對于數據的運算是在CPU內部實現

            3、 使用RISC指令的CPU復雜度小一點,易于設計

            對于比如a= a+b這樣的算式,需要經過下面四個步驟才可以實現:

            細看這幾個步驟,有些疑問:

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

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

            3、a+b的結果又保存在哪里?

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

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

            1)把內存a的值讀入CPU寄存器R0

            2)把內存b的值讀入CPU寄存器R1

            3)把R0和R1累計存入R0

            4)把R0的值寫入內存a

            CPU內部寄存器分類

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

            1、數據緩沖寄存器

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

            2、棧指針類寄存器

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

            3、程序指針類寄存器

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

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

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

            5、其他功能寄存器

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

            ARM Cortex-M中的寄存器

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

            幾條匯編指令

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

            1. 讀內存指令:LDR,即Load之意

            2. 寫內存指令:STR,即Store之意

            3. 加減指令:ADD與SUB

            4. 跳轉:BL,即Branch And Link 

            5. 出棧指令:POP

            6. 入棧指令:PUSH

            匯編并不復雜:

            加載/存儲指令

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

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

            加法運算指令ADD:ADD r0,r1,r2意思為:r0=r1+r2

            減法運算指令SUB:SUB r0,r1,r2意思為:r0=r1-r2

            寄存器入棧/出棧指令

            函數運行的本質

            如下是一個簡單的程序,主函數里調用函數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;

            }

             其中調用add_val函數的匯編代碼如下:

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

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

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



            評論


            相關推薦

            技術專區(qū)

            關閉