使用freertos如何確定分配堆疊空間大小

2021-10-09 16:15:23 字數 1799 閱讀 2903

首先要配置freertos的堆(heap)空間,建立任務我們還需要為每個任務分配棧(stack)空間,那麼針對freertos的堆疊空間到底該如何確定?

freertos從v9版本以後同時支援靜態記憶體和動態記憶體分配方式。靜態記憶體分配在編譯時候就會對freertos的核心物件分配ram空間。動態分配都是在程式執行起來以後從堆空間上分配的。這裡我們也只討論動態記憶體分配,動態記憶體分配的好處是可以在刪除物件的時候釋放掉記憶體的空間。從而保證ram的可持續利用!

先看下圖弄清楚freertos的heap空間和任務棧空間的不同與聯絡。

假設在freertos的配置選項中已經配置使用動態記憶體分配方式。如上圖所示,其他比如任務或者佇列或者使用者使用 pvportmalloc() 分配的空間都從heap堆上面劃分。所以我相信你不會做把任務棧分配的比heap堆還大的傻事!

好了,這個關係搞清楚,那麼又該如何定heap的空間大小呢,可以先進行乙個粗略的計算,假設任務1分配2kbytes棧,任務2分配3kbytes棧,佇列大概佔1k,使用者malloc大概2k,這麼算一共就是8k。那麼在資源有限的情況下可以先把heap空間分個15k。

因為程式執行起來實際占用heap的空間不好計算那麼準,那麼我們可以借助freertos的api來準確的得出空閒的heap空間和用的最對時候的空閒值。這兩個api如下:

xportgetfreeheapsize()

這個函式可以獲取呼叫時堆中空閒記憶體的大小,以位元組為單位。使用它可以優化堆的大小。需要注意,當使用heap_3時是不能呼叫這個函式的。

xportgetminimumeverfreeheapsize()

此函式返回freertos應用程式開始執行之後曾經存在的最小的未被分配的儲存空間的位元組數。它的返回值指示了應用程式離將要耗盡堆空間的接近程度。需要注意xportgetminimumeverfreeheapsize()只在使用heap_4或者heap_5時生效。

在隨便乙個任務執行過程中,我們可以把這兩個函式的返回值列印出來,比如分別為4200和3000,那麼我們就清晰的知道了heap在分配出去最多的時候還剩餘3000bytes空閒的,那麼我們就可以把heap空間優化減小3000bytes。但是實際過程中請大方一點,不要算的那麼死,給freertos留下一點喘息的的機會。

運用上面兩個函式的例子:

printf(「xportgetfreeheapsize = %d\r\n」, xportgetfreeheapsize());

printf(「xportgetminimumeverfreeheapsize = %d\r\n」,xportgetminimumeverfreeheapsize());

堆空間的大小還容易估算一點,但是任務棧空間具體占用多少想計算出來可是複雜很多的。比如任務執行過程中函式呼叫的圧棧,區域性變數等都存在任務的棧空間上,所以我們一開始也只能盡量分配個大一點的值,之後再來調整。那麼得出任務棧空間具體還有多少剩餘也是有api可以呼叫的:

uxtaskgetstackhighwatermark()

但是該api使用是有配置開關的,在freertos.h中把 include_uxtaskgetstackhighwatermark 配置為1開啟開關

比如我們在乙個任務中如下呼叫:

printf(" the min free stack size is %d \r\n",(int32_t)uxtaskgetstackhighwatermark(null));

就可以列印出來該任務自啟動起來最小剩餘棧空間大小。然後我們就可以計算出最大使用的大小,一般可以再乘以1.5左右作為最終分配的值。需要注意的是該函式不像前面兩個返回的是bytes,而返回的以字為單位,真實的bytes需要乘以4.

所以總體的原則就是:先分大再調小最終把它確定好。

FreeRTOS佇列使用

佇列是任務間通訊的主要形式。常被用於任務與任務 中斷與任務之間的訊息傳遞,通常是fifo的形式。當乙個任務讀取空佇列時,這個任務將進入阻塞態 不消耗cpu,cpu會去執行其他任務 直到佇列不為空或者阻塞時長超過設定的阻塞時間,將進入就緒態。當乙個任務向滿佇列寫時,這個任務會進入阻塞態 不消耗cpu,...

如何確定精度

我們常看到 float 型別是4個位元組,7位有效數字。但是我總是在想為什麼float是7位有效數字,而不是8位,9位,10位?我在baidu,google上搜了一通,發現很多人把float的儲存方式寫的很明白很清楚,但是還是無法解釋為什麼只有7個有效數字,答非所問。7位有效數字,說明第8位是不確定...

如何確定度量目標?

一般的企業在度量中容易犯2個錯誤 1 度量的目標不明確 2 對資料分析不夠 目標不明確實際上就是不知道為什麼要度量某項資料,度量後會有什麼好處,能給管理帶來哪些改進?而不知道如何分析資料一方面是不清楚資料分析的方法,另一方面也是由於度量目標不明確而造成的,因此確定度量目標是在建立度量體系時最基本的活...