<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > RTOS的基本概念與線(xiàn)程基礎知識

RTOS的基本概念與線(xiàn)程基礎知識

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

1 概念及線(xiàn)程的引入

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

1.1 的概念

用人來(lái)類(lèi)比單片機程序和

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

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

  1. 給小孩喂一口飯

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

  3. 再回來(lái)給小孩喂一口飯

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

  5. 如果回復同事的信息要寫(xiě)一大堆,小孩就餓的大哭起來(lái)

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

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

  2. 右手敲鍵盤(pán),恢復同事

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

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

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

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

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

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

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

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 提出問(wèn)題

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

  • 線(xiàn)程是函數嗎?函數需要保存嗎?函數在Flash上,不會(huì )被破壞,無(wú)需保存

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

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

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

  • 保存在哪里?保存在線(xiàn)程的棧里面

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

2.1 ARM架構及匯編

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

1、對內存只有讀、寫(xiě)指令

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

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

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

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

1、讀a,那么a的值讀出來(lái)后保存在CPU哪里?

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

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

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

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

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

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

3)把R0和R1累計存入R0

4)把R0的值寫(xiě)入內存a

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

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

1、數據緩沖寄存器

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

2、棧指針類(lèi)寄存器

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

3、程序指針類(lèi)寄存器

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

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

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

5、其他功能寄存器

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

ARM Cortex-M中的寄存器

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

幾條匯編指令

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

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

  2. 寫(xiě)內存指令: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

寄存器入棧/出棧指令

函數運行的本質(zhì)

如下是一個(gè)簡(jiǎn)單的程序,主函數里調用函數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



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

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>