那曲檬骨新材料有限公司

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

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

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

嵌入式系統(tǒng)中函數(shù)如何調(diào)用

jf_78858299 ? 來(lái)源:汽車控制與人工智能 ? 作者:Demu ? 2023-02-13 14:15 ? 次閱讀

1 程序的內(nèi)存分布

嵌入式系統(tǒng)中,一個(gè)函數(shù)調(diào)用時(shí),它的內(nèi)部機(jī)理是什么,執(zhí)行了哪些步驟?如圖1所示,先看 看 一個(gè)程序在運(yùn)行時(shí),它的內(nèi)存分布狀況。

圖片

*** 圖1 系統(tǒng)中的內(nèi)存分布***

當(dāng)程序運(yùn)行時(shí),它的代碼會(huì)被裝入內(nèi)存,保存在代碼區(qū),包括主函數(shù)和其他函數(shù)。主要有三塊內(nèi)存區(qū)域用來(lái)存放數(shù)據(jù):

第一塊是全局變量區(qū)域,存放了程序當(dāng)中的所有全局變量。由于全局變量的個(gè)數(shù)和大小是已知的,所以這一塊區(qū)域所占用的內(nèi)存大小在開(kāi)始就確定下來(lái),它們被稱為是靜態(tài)分配。位于此區(qū)域內(nèi)的變量,它們?cè)诔绦虻恼麄€(gè)運(yùn)行過(guò)程當(dāng)中,都一直存在,只有當(dāng)整個(gè)程序運(yùn)行結(jié)束了, 這一塊內(nèi)存區(qū)域才會(huì)被釋放。

第二塊區(qū)域是棧(stack)區(qū)域,它包含了所有的棧幀。所謂的棧幀( stack frame),就是在調(diào)用函數(shù)時(shí),系統(tǒng)自動(dòng)地為該函數(shù)分配一塊內(nèi)存區(qū)域,用來(lái)保存它的運(yùn)行上下文、形參和局部變量等信息,這樣的一塊內(nèi)存區(qū)域,就叫做一個(gè)棧幀。棧幀是在函數(shù)調(diào)用時(shí)分配,當(dāng)函數(shù)調(diào)用結(jié)束,相應(yīng)的棧幀則被釋放。所以,對(duì)于一個(gè)函數(shù)的局部變量來(lái)說(shuō),只有當(dāng)函數(shù)調(diào)用發(fā)生時(shí),系統(tǒng)才會(huì)給這個(gè)函數(shù)的形參和局部變量分配存儲(chǔ)空間;當(dāng)函數(shù)調(diào)用結(jié)束后,這些局部變量就被釋放掉了。另外,棧區(qū)是由系統(tǒng)自動(dòng)分配,用戶不需要關(guān)心,所以也稱為是自動(dòng)分配。

第三塊區(qū)域是堆(heap) 區(qū)域,它主要是用作動(dòng)態(tài)分配的內(nèi)存。

舉個(gè)例子對(duì)應(yīng)起來(lái)看,直觀一些。

圖片

*** 圖2 內(nèi)存分布示例***

如圖2所示,程序開(kāi)始運(yùn)行,demudashu()這個(gè)函數(shù)會(huì)被裝入到內(nèi)存。它的代碼存放在內(nèi)存的代碼區(qū)域。由于在這段程序中定義了一個(gè)全局變量z,所以內(nèi)存的全局變量區(qū)域分配了一個(gè)存儲(chǔ)單元給它。

接下來(lái),系統(tǒng)調(diào)用函數(shù)運(yùn)行,當(dāng)這個(gè)函數(shù)調(diào)用發(fā)生,系統(tǒng)就會(huì)在棧中給它分配一塊內(nèi)存空間,即一個(gè)棧幀,用來(lái)存放函數(shù)當(dāng)中所定義的局部變量,即x和y。

隨后,程序計(jì)數(shù)器PC就跳轉(zhuǎn)到函數(shù)的第一條語(yǔ)句,開(kāi)始執(zhí)行。

當(dāng)函數(shù)執(zhí)行結(jié)束,首先要把它所占用的棧幀釋放掉。對(duì)于任何一次函數(shù)調(diào)用而言,在函數(shù)調(diào)用結(jié)束后,都要把相應(yīng)的棧幀釋放掉,所以x和y這兩個(gè)局部變量所占用的存儲(chǔ)空間就被釋放掉了。

當(dāng)一次函數(shù)調(diào)用發(fā)生時(shí),它的執(zhí)行過(guò)程可以歸納為以下5個(gè)步驟:

  1. 在內(nèi)存的棧空間當(dāng)中為其分配一個(gè)棧幀,用來(lái)存放該函數(shù)的形參變量和局部變量。
  2. 把實(shí)參變量的值復(fù)制到相應(yīng)的形參變量中。
  3. 控制流轉(zhuǎn)移到該函數(shù)的起始位置。
  4. 該函數(shù)開(kāi)始執(zhí)行。
  5. 當(dāng)這個(gè)函數(shù)執(zhí)行完以后,控制流和返回值返回到函數(shù)調(diào)用點(diǎn)。

下面用一個(gè)例子來(lái)總結(jié)下變量的存儲(chǔ)與作用域。

/* 全局變量,固定地址,其他源文件可見(jiàn)*/
int  demu_global_static;
/* 靜態(tài)全局變量,固定地址,但只在本文件可見(jiàn)*/
static int demu_static;
/* 函數(shù)參數(shù):位于棧幀中,動(dòng)態(tài)創(chuàng)建,動(dòng)態(tài)釋放*/
int foo(int auto_parameter)
{   
  /* 靜態(tài)局部變量 ,固定地址,只在本函數(shù)中可見(jiàn)*/   
  static int func_static;
  /* 普通局部變量,位于棧幀中,只在本函數(shù)中可見(jiàn)*/   
  int auto_i,auto_a[10];   
  /* 動(dòng)態(tài)申請(qǐng)的內(nèi)存空間,位于堆中*/   
  double *auto_d = malloc(sizeof (double)*2020);   
  return auto_i; 
}

2 函數(shù)的調(diào)用

有了上面的內(nèi)存分配理解再來(lái)看看函數(shù)的調(diào)用。

函數(shù)調(diào)用過(guò)程分五個(gè)步驟:

①程序先執(zhí)行函數(shù)調(diào)用之前的語(yǔ)句;

②流程的控制轉(zhuǎn)移到被調(diào)用函數(shù)入口處,同時(shí)進(jìn)行參數(shù)傳遞;

③執(zhí)行被調(diào)用函數(shù)中函數(shù)體的語(yǔ)句;

④流程返回調(diào)用函數(shù)的下一條指令處,將函數(shù)返回值帶回;

⑤接著執(zhí)行主調(diào)函數(shù)未執(zhí)行的語(yǔ)句。

圖片

*** 圖3 函數(shù)調(diào)用過(guò)程***

這樣就要求在轉(zhuǎn)到被調(diào)用函數(shù)之前,要記下當(dāng)時(shí)執(zhí)行的指令的地址,還要 “保護(hù)現(xiàn)場(chǎng)” (記下當(dāng)時(shí)有關(guān)的信息),方便在函數(shù)調(diào)用之后繼續(xù)執(zhí)行。在函數(shù)調(diào)用之后,流程返回到先前記下的地址處,并且根據(jù)記下的信息 “恢復(fù)現(xiàn)場(chǎng)” ,然后繼續(xù)執(zhí)行。這些過(guò)程都會(huì)花費(fèi)一定的時(shí)間。如果有的函數(shù)需要頻繁的使用,則所用時(shí)間會(huì)很長(zhǎng),從而降低程序的執(zhí)行效率。有些實(shí)用程序?qū)π适怯幸蟮模笙到y(tǒng)的響應(yīng)世間短,這就需要盡量壓縮調(diào)用過(guò)程的時(shí)間。

2.1 內(nèi)置函數(shù)

C語(yǔ)言提供了一種提高函數(shù)調(diào)用效率的方法,即在編譯時(shí)將所調(diào)用的代碼直接嵌入到主調(diào)函數(shù)中,而不是將流程轉(zhuǎn)出去。這種嵌入到主調(diào)函數(shù)中的函數(shù)稱為 內(nèi)置函數(shù) (inline function),又稱內(nèi)嵌函數(shù)。有些人把它稱為內(nèi)聯(lián)函數(shù)。

用法:在函數(shù)首行的左端加一個(gè)關(guān)鍵字inline即可。

還是舉個(gè)例子來(lái)看,明晰一些。

int main()
{  int i = 3, j = 5, k =8, m;
  m = max(i, j, k);
  cout << "max=" << m = endl;
  return 0;
}
inline int max(int a, int b, int c);//定義max為內(nèi)置函數(shù)
{
  if (b > a)
  a = b;
  if (c > a)
  a = c;
  return a;
}

由于定義函數(shù)時(shí)指定它為內(nèi)置函數(shù),因此編譯系統(tǒng)在遇到函數(shù)調(diào)用“max(i,j,k)”時(shí),就用max函數(shù)體的代碼代替“max(i,j,k)”,同時(shí)將實(shí)參代替形參。在聲明函數(shù)和定義函數(shù)時(shí)可以同時(shí)寫inline,也可以只在其中一處聲明inline,效果相同,都能按內(nèi)置函數(shù)處理。

使用內(nèi)置函數(shù)可以節(jié)省運(yùn)行時(shí)間,但卻增加了目標(biāo)程序的長(zhǎng)度。假設(shè)要調(diào)用10次max函數(shù),則編譯時(shí)先后10次將max代碼復(fù)制并插入main函數(shù),這就增加了目標(biāo)文件main函數(shù)的長(zhǎng)度。因此一般只將規(guī)模很小而使用頻繁的函數(shù)(如定時(shí)采集數(shù)據(jù)的函數(shù)聲明為內(nèi)置函數(shù))。在函數(shù)規(guī)模很小的情況下,函數(shù)調(diào)用的時(shí)間可能相當(dāng)于甚至超過(guò)執(zhí)行函數(shù)本身的時(shí)間,把它定義為內(nèi)置函數(shù),可大大減少程序的運(yùn)行時(shí)間。

內(nèi)置函數(shù)中不能包括復(fù)雜的控制語(yǔ)句,如循環(huán)語(yǔ)句和switch語(yǔ)句。

對(duì)函數(shù)做inline聲明,只是程序設(shè)計(jì)者對(duì)編譯系統(tǒng)提出的一個(gè)建議,是建議性的,而不是指令性的。并非指定為inline,編譯系統(tǒng)必須這樣做。它是根據(jù)具體情況決定的。例如對(duì)前面提到的包含循環(huán)語(yǔ)句和switch語(yǔ)句的函數(shù)或一個(gè)遞歸函數(shù)是無(wú)法進(jìn)行代碼置換的,又如一個(gè)上萬(wàn)行的函數(shù),也不太可能在調(diào)用點(diǎn)展開(kāi)。此時(shí)編譯系統(tǒng)就會(huì)忽略inline聲明,而按普通函數(shù)處理。

所以,只有規(guī)模較小而又頻繁調(diào)用的簡(jiǎn)單函數(shù),才適合于聲明為inline函數(shù)。

2.2 函數(shù)調(diào)用過(guò)程

前文,如圖3,已經(jīng)描述到,當(dāng)執(zhí)行到某一個(gè)函數(shù)時(shí),系統(tǒng)就會(huì)跳轉(zhuǎn)過(guò)去執(zhí)行該函數(shù),執(zhí)行完畢后接著再去執(zhí)行下一條指令。在執(zhí)行調(diào)用函數(shù)的過(guò)程中,系統(tǒng)還要根據(jù)函數(shù)完成一些工作,這些操作通過(guò)形成一個(gè)棧幀來(lái)完成。棧幀是編譯器用來(lái)實(shí)現(xiàn)函數(shù)調(diào)用過(guò)程的一種數(shù)據(jù)結(jié)構(gòu)。C語(yǔ)言中,每個(gè)棧幀對(duì)應(yīng)著一個(gè)未運(yùn)行完的函數(shù)。

下面通過(guò)debug,看看Add()函數(shù)的執(zhí)行過(guò)程。

int Add(int a, int b)
{
  int z = 0;
  z = a + b;
  return z;
}
int main()
{
  int a = 10;
  int b = 20;
  int ret;
  ret = Add(a, b);
  printf("%d", ret);
  system("pause");
  return 0;
}

以下調(diào)試過(guò)程大家定性看一下調(diào)用過(guò)程,實(shí)際過(guò)程和嵌入式系統(tǒng)略有差異。

調(diào)用main函數(shù)之前在VC6.0編輯器可以看到main函數(shù)在_tmainCRTStartup 函數(shù)中調(diào)用的,而 _tmainCRTStartup 函數(shù)是在 mainCRTStartup 被調(diào)用的。這個(gè)過(guò)程要為函數(shù)開(kāi)辟棧空間, 這塊棧空間我們稱之為函數(shù)棧幀。

圖片

棧幀的需要ebp和esp兩個(gè)寄存器。在函數(shù)調(diào)用的過(guò)程中這兩個(gè)寄存器存放了維護(hù)這個(gè)棧的棧底和棧頂指針 。ebp指向當(dāng)前位于系統(tǒng)棧最上邊一個(gè)棧幀的底部,而不是系統(tǒng)棧的底部。嚴(yán)格說(shuō)來(lái),“棧幀底部”和“棧底”是不同的概念;ESP所指的棧幀頂部和系統(tǒng)棧的頂部是同一個(gè)位置。

開(kāi)始調(diào)用main函數(shù)

展開(kāi)main函數(shù)的調(diào)用就得為main函數(shù)創(chuàng)建棧幀,可以看到過(guò)程:

圖片

執(zhí)行上圖第一條指令:

圖片

1.壓棧,把ebp放入棧頂,而esp始終指向棧頂

2.將esp值傳給ebp,也就是讓esp,ebp移在一起

3.sub為減的意思,即將esp-0E4h賦給esp,且函數(shù)調(diào)用分配由高地址向低地址增長(zhǎng),因此esp向上移動(dòng),即開(kāi)辟了新空間,也就是為main函數(shù)開(kāi)辟空間

4.三個(gè)push壓榨分別將ebx,esi,edi按順序壓入棧頂,而esp也會(huì)指向棧頂

5.lea指令,加載有效地址;將ebp-0E4h的地址放入edi中,也就是edi指向ebp-0E4h,把39h放到ecx中,把0cccccccch放到eax中,從edi所指向的地址開(kāi)始向高地址進(jìn)行拷貝,拷貝的次數(shù)為ecx內(nèi)容,拷貝的內(nèi)容為eax內(nèi)。

圖片

6.創(chuàng)建變量a與b并初始化10和20.

圖片

Add函數(shù)的調(diào)用

1.把b放入eax中,然后對(duì)eax壓棧(形參a)

2.把a(bǔ)放入ecx中,然后對(duì)ecx壓棧(形參b)

3.call作用:將下一條指令地址壓棧,然后進(jìn)入add函數(shù)里面

圖片

注意:call語(yǔ)句push的是下一條指令的地址,為了函數(shù)返回時(shí)知道從哪兒接著執(zhí)行

接下來(lái)進(jìn)入add函數(shù):

A. 先把main函數(shù)ebp壓棧,保存指向main()函數(shù)棧幀底部的ebp的地址,目的是當(dāng)返回時(shí)能找到main函數(shù)棧底,此時(shí)esp指向新的棧頂位置。將main函數(shù)的ebp壓棧,也是為了返回時(shí)找到main函數(shù)棧底。

B. 將esp的值賦給ebp,產(chǎn)生新的ebp,即Add()函數(shù)棧幀的ebp;

C. 給esp減去一個(gè)16進(jìn)制數(shù)0CCh(為Add()函數(shù)預(yù)開(kāi)辟空間);

D. push ebx、esi、edi;

E. lea指令,加載有效地址;

F. 初始化預(yù)開(kāi)辟的空間為0xcccccccc;

圖片

G. 創(chuàng)建變量z并為其賦值;

H. 把形參a放到eax,即把10,放入eax把形參b加到eax中,即把20加到eax中再把eax放到z的位置,即把兩數(shù)之和放到z中;

I. 把z的值放到寄存器eax中返回,因?yàn)閦為函數(shù)臨時(shí)開(kāi)辟的變量空間等函數(shù)執(zhí)行完會(huì)銷毀,因此放寄存器中返回;

K .接下來(lái)執(zhí)行pop出棧操作,edi esi ebx依次從上向下出棧,esp 會(huì)向下移動(dòng),棧的特點(diǎn):先進(jìn)后出,后進(jìn)先出;

L. 將ebp值賦給esp,也就是esp向下移動(dòng)指向ebp位置,此時(shí)add開(kāi)辟的棧空間已經(jīng)銷毀;

M. pop將棧頂?shù)脑貜棾龇诺絜bp中,也就是說(shuō)將main函數(shù)的ebp放入ebp中,即ebp現(xiàn)在指向main函數(shù)ebp;

圖片

N. 在執(zhí)行ret后,會(huì)把之前push的地址彈出去,這時(shí)就要返回main函數(shù),這也就是為什么之前要push這個(gè)地址,這樣call指令就完成了,接下來(lái)從那個(gè)call指令繼續(xù)執(zhí)行;

圖片

O. 把esp+8,即esp向下移,把形參銷毀;

最后就是對(duì)main函數(shù)棧幀的銷毀,方法類似。

棧幀的總結(jié):

1.堆棧是C語(yǔ)言程序運(yùn)行時(shí)必須的一個(gè)記錄調(diào)用路徑和參數(shù)的空間:

  • 函數(shù)調(diào)用框架;
  • 傳遞參數(shù);
  • 保存返回地址;
  • 提供局部變量空間;
  1. 堆棧寄存器和堆棧操作

堆棧相關(guān)的寄存器

  • esp,堆棧指針(stack pointer)
  • ebp,基址指針(base pointer)

堆棧操作

  • push 棧頂?shù)刂窚p少4個(gè)字節(jié)(32位)
  • pop 棧頂?shù)刂吩黾?個(gè)字節(jié)
  • ebp在C語(yǔ)言中用作記錄當(dāng)前函數(shù)調(diào)用基址

3 AUTOSAR中Runnable

Runnable(可運(yùn)行實(shí)體)就是SWC中的函數(shù),而在AUTOSAR架構(gòu)中,使用工具生成時(shí),Runnable是空函數(shù),需要手動(dòng)添加代碼來(lái)實(shí)現(xiàn)它的實(shí)際功能。Runnable可以被觸發(fā),比如被定時(shí)器觸發(fā)、被操作調(diào)用觸發(fā)或者被接受數(shù)據(jù)觸發(fā)等。

圖片

這里的函數(shù)就是Send接口,發(fā)送的數(shù)據(jù)由RTE進(jìn)行管理。然而,由于這個(gè)SWCn.c文件中并未包含BSW中的.h文件,通過(guò)這個(gè)方式將AppL和BSW隔離開(kāi)。所以如果假如必要的.h文件,其實(shí)也可以調(diào)用BSW中的函數(shù),但是不建議這么做,該過(guò)程 應(yīng)由RTE來(lái)完成觸發(fā)和調(diào)度。

圖片

RTE給runnables提供觸發(fā)條件,也就是runnable在設(shè)計(jì)的時(shí)候,需要有觸發(fā)條件,不然無(wú)法運(yùn)行,也就沒(méi)有意義了。觸發(fā)條件就是一些特定的事件,AUTOSAR中主要規(guī)定了以下一些觸發(fā)條件:

  • 初始化事件:初始化自動(dòng)觸發(fā)
  • 定時(shí)器事件:給一個(gè)周期定時(shí)器,時(shí)間到了就觸發(fā)
  • 接收數(shù)據(jù)事件(S/R):Receiver Port 一旦收到數(shù)據(jù)觸發(fā)
  • 接收數(shù)據(jù)錯(cuò)誤事件(S/R)
  • 數(shù)據(jù)發(fā)送完成事件(S/R):Send Port 發(fā)送完成觸發(fā)
  • 操作調(diào)用事件(C/S):當(dāng)調(diào)用到了該函數(shù)時(shí)觸發(fā)
  • 異步服務(wù)返回事件(C/S):C/S可以在異步下運(yùn)行,即當(dāng)異步調(diào)用一個(gè)Server函數(shù),那么該被調(diào)函數(shù)作為一個(gè)線程和當(dāng)前的運(yùn)行程序并行運(yùn)行,當(dāng)被調(diào)函數(shù)運(yùn)行結(jié)束返回(Return)時(shí),這時(shí)觸發(fā)異步服務(wù)返回事件。
  • 模式切換事件
  • 模式切換應(yīng)答事件

圖片

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

    關(guān)注

    41

    文章

    3625

    瀏覽量

    129763
  • 程序
    +關(guān)注

    關(guān)注

    117

    文章

    3796

    瀏覽量

    81419
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4346

    瀏覽量

    62978
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    嵌入式系統(tǒng)U盤實(shí)時(shí)啟動(dòng)技術(shù)

    。這為嵌入式實(shí)時(shí)系統(tǒng)的啟動(dòng)提供了一種嶄新的思路,即從優(yōu)盤啟動(dòng)。這種方法對(duì)嵌入式實(shí)時(shí)系統(tǒng)板上的程序存儲(chǔ)空間要求不高,只要在Flash存儲(chǔ)
    發(fā)表于 09-05 11:36

    嵌入式開(kāi)發(fā)的優(yōu)缺點(diǎn)是什么?

    一.嵌入式開(kāi)發(fā)概述:嵌入式:在已有硬件上移植操作系統(tǒng),解決軟硬件耦合度高導(dǎo)致的問(wèn)題。(打個(gè)比方:軟件的實(shí)現(xiàn)是為了調(diào)用open()函數(shù),那么
    發(fā)表于 11-08 07:42

    開(kāi)發(fā)基本的嵌入式應(yīng)用程序

    開(kāi)發(fā)基本的嵌入式應(yīng)用程序 一、 實(shí)驗(yàn)?zāi)康淖x懂main.c 文件調(diào)用函數(shù),了解uCOS-II 系統(tǒng)的啟動(dòng)過(guò)程。學(xué)習(xí)使用SourceIns
    發(fā)表于 12-25 23:17 ?1521次閱讀
    開(kāi)發(fā)基本的<b class='flag-5'>嵌入式</b>應(yīng)用程序

    汽車電子嵌入式軟件接口庫(kù)設(shè)計(jì)

    軟件平臺(tái)由微型系統(tǒng)內(nèi)核和應(yīng)用編程接口庫(kù)組成。嵌入式操作系統(tǒng)內(nèi)核負(fù)責(zé)任務(wù)調(diào)度及事件處理等,編程接口庫(kù)負(fù)責(zé)將開(kāi)發(fā)常用的算法和 MPC555 底層硬件的驅(qū)動(dòng)函數(shù)進(jìn)行控件級(jí)封裝,供用戶
    發(fā)表于 01-23 17:32 ?42次下載
    汽車電子<b class='flag-5'>嵌入式</b>軟件接口庫(kù)設(shè)計(jì)

    基于Chirp函數(shù)的Nios Ⅱ嵌入式實(shí)現(xiàn)

    分析Chirp函數(shù)在頻域上的一般特性,提出利用FPGA的嵌入式軟核NiosⅡ處理器在嵌入式操作系統(tǒng)μC/OS-Ⅱ上實(shí)現(xiàn)Chirp的方法
    發(fā)表于 06-15 11:02 ?1207次閱讀
    基于Chirp<b class='flag-5'>函數(shù)</b>的Nios Ⅱ<b class='flag-5'>嵌入式</b>實(shí)現(xiàn)

    如何在嵌入式FreeRTOS系統(tǒng)接口調(diào)用API?

    1.在最近的嵌入式工作很多都是學(xué)習(xí)FreeRTOS系統(tǒng),由于只是會(huì)對(duì)RTOS的接口進(jìn)行調(diào)用,但是很多時(shí)候都是知其然而不知其所以然,所以現(xiàn)在對(duì)API進(jìn)行總結(jié)。
    的頭像 發(fā)表于 08-04 10:39 ?5723次閱讀
    如何在<b class='flag-5'>嵌入式</b>FreeRTOS<b class='flag-5'>系統(tǒng)</b>接口<b class='flag-5'>調(diào)用</b>API?

    為什么中斷處理函數(shù)不能直接調(diào)用不可重入函數(shù)

    中斷丟失和系統(tǒng)位置錯(cuò)誤,這里直接導(dǎo)致嵌入式 linux 系統(tǒng)應(yīng)用進(jìn)程的所有線程停掉,進(jìn)而導(dǎo)致看門狗進(jìn)程得不到喂狗,設(shè)備重啟。 那什么是不可重入函數(shù)
    的頭像 發(fā)表于 02-17 09:33 ?6134次閱讀

    嵌入式系統(tǒng)

    在我們的日常生活,我們經(jīng)常使用許多使用嵌入式系統(tǒng)技術(shù)設(shè)計(jì)的電氣和電子電路和套件。計(jì)算機(jī),手機(jī),平板,筆記本電腦,數(shù)字電子系統(tǒng)以及其他電子和電子設(shè)備都是使用
    發(fā)表于 10-21 10:51 ?1次下載
    <b class='flag-5'>嵌入式</b><b class='flag-5'>系統(tǒng)</b>

    什么是嵌入式系統(tǒng)

    在我們的日常生活,我們經(jīng)常使用許多使用嵌入式系統(tǒng)技術(shù)設(shè)計(jì)的電氣和電子電路和套件。計(jì)算機(jī),手機(jī),平板,筆記本電腦,數(shù)字電子系統(tǒng)以及其他電子和電子設(shè)備都是使用
    發(fā)表于 10-21 11:36 ?3次下載
    什么是<b class='flag-5'>嵌入式</b><b class='flag-5'>系統(tǒng)</b>

    嵌入式開(kāi)發(fā)概述(20190325小結(jié))

    一.嵌入式開(kāi)發(fā)概述:嵌入式:在已有硬件上移植操作系統(tǒng),解決軟硬件耦合度高導(dǎo)致的問(wèn)題。(打個(gè)比方:軟件的實(shí)現(xiàn)是為了調(diào)用open()函數(shù),那么
    發(fā)表于 11-02 21:05 ?15次下載
    <b class='flag-5'>嵌入式</b>開(kāi)發(fā)概述(20190325小結(jié))

    嵌入式軟件的延時(shí)函數(shù)

    延時(shí)函數(shù)嵌入式軟件開(kāi)發(fā)必不可少的功能函數(shù),在每個(gè)工程里都能找到它的蹤影。雖然看起來(lái)不起眼,但在有些時(shí)序控制的場(chǎng)合,使用了一點(diǎn)點(diǎn)delay,往往能解決大問(wèn)題。下面描述一下delay
    發(fā)表于 11-24 19:21 ?19次下載
    <b class='flag-5'>嵌入式</b>軟件<b class='flag-5'>中</b>的延時(shí)<b class='flag-5'>函數(shù)</b>

    函數(shù)調(diào)在嵌入式應(yīng)用設(shè)計(jì)如何實(shí)現(xiàn)

      函數(shù)調(diào)用很好理解,即使剛學(xué)沒(méi)多久的朋友也知道函數(shù)調(diào)用是怎么實(shí)現(xiàn)的,即調(diào)用一個(gè)已經(jīng)封裝好的函數(shù)
    的頭像 發(fā)表于 11-28 09:16 ?660次閱讀

    嵌入式軟件架構(gòu)設(shè)計(jì)之函數(shù)調(diào)用

    函數(shù)調(diào)用很好理解,即使剛學(xué)沒(méi)多久的朋友也知道函數(shù)調(diào)用是怎么實(shí)現(xiàn)的,即調(diào)用一個(gè)已經(jīng)封裝好的函數(shù),實(shí)
    的頭像 發(fā)表于 02-15 14:48 ?1154次閱讀
    <b class='flag-5'>嵌入式</b>軟件架構(gòu)設(shè)計(jì)之<b class='flag-5'>函數(shù)</b><b class='flag-5'>調(diào)用</b>

    嵌入式open函數(shù)的使用

    嵌入式系統(tǒng)是指嵌入到其他設(shè)備或系統(tǒng),用于控制和管理硬件資源的計(jì)算機(jī)系統(tǒng)。在
    的頭像 發(fā)表于 01-04 15:51 ?744次閱讀

    嵌入式系統(tǒng)堆棧監(jiān)控的作用

    在微控制器或微處理器,堆棧是內(nèi)存的一個(gè)保留區(qū)域,用于存儲(chǔ)臨時(shí)數(shù)據(jù)和函數(shù)調(diào)用信息,管理函數(shù)的執(zhí)行,跟蹤返回地址、局部變量和函數(shù)參數(shù)。堆棧監(jiān)控
    的頭像 發(fā)表于 01-05 11:13 ?555次閱讀
    云博| 百家乐庄闲的分布| 大发888娱乐场网址| 百家乐官网桌游| 老k百家乐的玩法技巧和规则 | 老k百家乐游戏| 百家乐官网游戏分析| 百家乐桌蓝盾在线| 皇冠备用投注网| 玩百家乐新太阳城| 原平市| 百家乐牌具公司| 免费百家乐官网娱乐城| 网页百家乐的玩法技巧和规则 | bet365提款要多久| 阳宅24山流年吉凶方位| 球讯网| 圆梦城百家乐娱乐城| 欧博线上娱乐| 玩百家乐高手支招篇| 百家乐官网在发牌技巧| 爱拼百家乐的玩法技巧和规则| 百家乐官网五湖四海娱乐城| 大发888官网黄金版| 做生意仓库和办公桌在家里是不是讲风水| 优博网| 百家乐庄6点| 百盛百家乐官网软件| 大发888娱乐城 真钱| 百家乐教父方法| 梧州市| 太阳百家乐代理| 金字塔百家乐官网的玩法技巧和规则| 博狗娱乐城| 海王星百家乐技巧| 百家乐官网真人娱乐场开户注册 | 百家乐官网正反投注| 罗马百家乐的玩法技巧和规则 | 波音平台| 作弊百家乐赌具价格| 百家乐官网计划策略|