99精品伊人亚洲|最近国产中文炮友|九草在线视频支援|AV网站大全最新|美女黄片免费观看|国产精品资源视频|精彩无码视频一区|91大神在线后入|伊人终合在线播放|久草综合久久中文

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

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

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

如何設(shè)定RTOS中的任務(wù)棧(線程棧)大小呢?

冬至子 ? 來(lái)源:機(jī)器靈魂注入師 ? 作者:Eureka1024 ? 2023-12-01 16:40 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

概述

首先說(shuō)明的是,在 RT-Thread 中,將本文提及的 任務(wù) 稱之為 線程。在使用 RTOS 開(kāi)發(fā)項(xiàng)目時(shí),一個(gè)任務(wù)會(huì)擁有自己獨(dú)立的線程棧,用來(lái)在任務(wù)調(diào)度時(shí)保存該任務(wù)的當(dāng)前上下文內(nèi)容,比如當(dāng)前 CPU 寄存器的值、函數(shù)的局部變量等。

不同的任務(wù)復(fù)雜程度不同,需要的棧大小也不同,給多了浪費(fèi)(畢竟單片機(jī)中的 RAM 貴的一匹),給少了更嚴(yán)重,棧溢出造成的后果會(huì)讓整個(gè)系統(tǒng)崩潰。所以,一個(gè)合適的棧大小便十分重要,本文就來(lái)聊聊這個(gè)棧大小如何配置的問(wèn)題。

方法論

理論上來(lái)說(shuō),你是可以計(jì)算出任務(wù)所需要的大概的值,但是要考慮的因素比較多,比如寄存器的數(shù)量的不同等,不同類型的單片機(jī)亦有差別,所以這種方式比較費(fèi)腦,對(duì)底層知識(shí)的理解也要比較深刻,可能比較適合大佬吧(我不是大佬也不知道大佬們?cè)趺醋觯?/p>

比較普適的做法是,可以先設(shè)置較大的任務(wù)棧,比如 1KB2KB 的大小,確保不會(huì)出現(xiàn)棧溢出的情況,然后讓系統(tǒng)運(yùn)行一段比較長(zhǎng)的時(shí)間,同時(shí)要盡量觸發(fā)各種可能的工況,通過(guò)查看任務(wù)棧的被使用的最大深度值,一般將最終的任務(wù)棧大小設(shè)定為該值的 1.5~2 倍為比較合適的值。不斷地修改和檢查棧大小是否配置合適這個(gè)過(guò)程,是動(dòng)態(tài)調(diào)節(jié)的過(guò)程,最終會(huì)找到一個(gè)比較好的方案。

不同的 RTOS,如何檢測(cè)任務(wù)棧的使用情況呢?

RT-Thread

FinSH 中用 list_thread 命令查看線程運(yùn)行過(guò)程中線程所使用的棧的大小,這里的大小指的是從線程啟動(dòng)運(yùn)行時(shí)到當(dāng)前時(shí)刻點(diǎn),線程使用的最大棧深度,

FreeRTOS

使用 uxTaskGetStackHighWaterMark()``API 函數(shù)來(lái)查看實(shí)際使用了多少棧,如果分配的棧比需要的多,則可以減少棧大小,并且可以使用棧溢出檢測(cè)特性來(lái)確定棧是否太小。比如,在一個(gè)任務(wù)中使用如下調(diào)用:

printf(" the min free stack size is %d rn",(int32_t)uxTaskGetStackHighWaterMark(NULL));

ucos

ucos 提供了一個(gè)系統(tǒng)任務(wù):STATISTICS 任務(wù),可以統(tǒng)計(jì)各任務(wù)的CPU使用率,也就是任務(wù)棧使用情況,可以借用該統(tǒng)計(jì)任務(wù)的函數(shù)來(lái)統(tǒng)計(jì)各任務(wù)的棧使用情況。

聲明:本文內(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)投訴
  • 單片機(jī)
    +關(guān)注

    關(guān)注

    6067

    文章

    44987

    瀏覽量

    650331
  • 寄存器
    +關(guān)注

    關(guān)注

    31

    文章

    5433

    瀏覽量

    124428
  • RTOS
    +關(guān)注

    關(guān)注

    24

    文章

    851

    瀏覽量

    121154
  • FreeRTOS
    +關(guān)注

    關(guān)注

    12

    文章

    493

    瀏覽量

    64309
  • RT-Thread
    +關(guān)注

    關(guān)注

    32

    文章

    1406

    瀏覽量

    41913
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    嵌入式RTOS任務(wù) 和 系統(tǒng)

    簡(jiǎn)介明了帶你了解嵌入式RTOS任務(wù) 和 系統(tǒng)
    的頭像 發(fā)表于 05-16 09:57 ?4013次閱讀
    嵌入式<b class='flag-5'>RTOS</b>的 <b class='flag-5'>任務(wù)</b><b class='flag-5'>棧</b> 和 系統(tǒng)<b class='flag-5'>棧</b>

    ucos_ii 每個(gè)任務(wù)具體定義大小

    在ucos_ii 系統(tǒng),針對(duì)每個(gè)任務(wù)怎么來(lái)分配其大小。我在程序對(duì)一個(gè)只是LED點(diǎn)亮的任務(wù)
    發(fā)表于 04-30 17:43

    轉(zhuǎn):第11章 FreeRTOS任務(wù)大小確定及其溢出檢測(cè)

    任務(wù)溢出檢測(cè)方式一)11.5 實(shí)驗(yàn)例程說(shuō)明(任務(wù)溢出檢測(cè)方式二)11.6總結(jié)11.1 任務(wù)
    發(fā)表于 08-28 15:21

    請(qǐng)問(wèn)uc/os任務(wù)優(yōu)先級(jí)和大小該怎樣設(shè)置?

    #defineTASK_LED2_STK_SIZE80#defineTASK_LED3_STK_SIZE80 #defineTASK_GUI_STK_SIZE500#defineTASK_GUI_Touch_STK_SIZE80 不知道怎樣設(shè)置大小
    發(fā)表于 04-08 08:35

    請(qǐng)問(wèn)在IAR如何直接查看任務(wù)使用多少空間?

    在使用IAR調(diào)試freertos任務(wù),IAR自帶了一個(gè)調(diào)試插件,啟用這個(gè)插件會(huì)得到任務(wù)名、優(yōu)先級(jí)、起始空間和頂位置,但是如何計(jì)算出每個(gè)
    發(fā)表于 06-10 09:25

    FreeRTOS任務(wù)與系統(tǒng)的關(guān)系?

    configTOTAL_HEAP_SIZE((size_t)(55*1024))的作用?三個(gè)設(shè)置大小的地方之間又有何種聯(lián)系?4、任務(wù)與系統(tǒng)
    發(fā)表于 07-15 00:17

    ThreadX任務(wù)大小的確定方法以及溢出檢測(cè)方法

    第10章 ThreadX任務(wù)大小確定及其溢出檢測(cè)本章節(jié)為大家講解ThreadX任務(wù)大小的確定
    發(fā)表于 08-04 08:59

    講解ThreadX任務(wù)大小的確定方法以及溢出檢測(cè)方法

    第10章 ThreadX任務(wù)大小確定及其溢出檢測(cè)本章節(jié)為大家講解ThreadX任務(wù)大小的確定
    發(fā)表于 08-09 06:30

    如何確定ThreadX任務(wù)大小

    如何確定ThreadX任務(wù)大小?什么是溢出?怎樣去檢測(cè)ThreadX的
    發(fā)表于 10-14 07:42

    什么是堆?什么是

    ,程序執(zhí)行過(guò)程溢出,極大可能的影響程序、系統(tǒng)的穩(wěn)定,嚴(yán)重時(shí)會(huì)造成程序、系統(tǒng)的崩潰,所以堆棧溢出檢測(cè)十分重要且必要。什么是堆,什么是堆和都是指預(yù)先分配的空間,有
    發(fā)表于 12-22 06:09

    基于STM32的虛擬多線程(TI_BLE協(xié)議_ZStack協(xié)議)

    基于STM32的虛擬多線程,可以很好的用于裸機(jī)程序,用于模擬小型操作系統(tǒng)的多線程概念。本實(shí)例參考了參考TI_BLE協(xié)議_ZStack協(xié)議
    發(fā)表于 06-14 10:42 ?7092次閱讀
    基于STM32的虛擬多<b class='flag-5'>線程</b>(TI_BLE協(xié)議<b class='flag-5'>棧</b>_ZStack協(xié)議<b class='flag-5'>棧</b>)

    LEDs狀態(tài)燈任務(wù)(線程)設(shè)計(jì) (基于RTOS

    LEDs狀態(tài)燈任務(wù)(線程)設(shè)計(jì)(基于RTOS
    的頭像 發(fā)表于 03-12 11:30 ?2666次閱讀

    修改空間的大小

    當(dāng)程序的局部變量太多時(shí),可能會(huì)造成空間不夠用導(dǎo)致程序出錯(cuò),這個(gè)時(shí)候就需要修改空間的大小默認(rèn)的空間
    發(fā)表于 12-20 18:53 ?1次下載
    修改<b class='flag-5'>棧</b>空間的<b class='flag-5'>大小</b>

    堆內(nèi)存和內(nèi)存的區(qū)別是什么

    內(nèi)存是為線程留出的臨時(shí)空間,每個(gè)線程都有一個(gè)固定大小空間,而且空間存儲(chǔ)的數(shù)據(jù)只能由當(dāng)前
    的頭像 發(fā)表于 02-21 13:54 ?1809次閱讀
    堆內(nèi)存和<b class='flag-5'>棧</b>內(nèi)存的區(qū)別是什么

    linux的進(jìn)程,線程,內(nèi)核的區(qū)別

    大多數(shù)的處理器架構(gòu),都有實(shí)現(xiàn)硬件。有專門的指針寄存器,以及特定的硬件指令來(lái)完成 入/出 的操作。例如在 ARM 架構(gòu)上,R13 (SP) 指針是堆棧指針寄存器,而 PUSH 是
    發(fā)表于 08-18 10:57 ?689次閱讀
    linux<b class='flag-5'>中</b>的進(jìn)程<b class='flag-5'>棧</b>,<b class='flag-5'>線程</b><b class='flag-5'>棧</b>,內(nèi)核<b class='flag-5'>棧</b>的區(qū)別