一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

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

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

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

RTOS任務的堆棧大小與代碼量有啥關系嗎?

strongerHuang ? 來源:strongerHuang ? 作者:strongerHuang ? 2021-05-26 09:34 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

最近有小伙伴問了這樣一個問題:我有個任務中的代碼量很多,是不是這個任務的堆棧需要分配很大才行?

下面就圍繞任務代碼量,以及堆棧進行描述相關內(nèi)容。

1RTOS任務堆棧分配

市面上很多RTOS的任務都是需要提前分配堆棧大小,也就是在創(chuàng)建任務的時候分配好堆棧的大小。 比如uCOS創(chuàng)建一個檢測(Check)任務:

// 任務優(yōu)先級#define TASK_CHECK_PRIO 6 // 任務堆棧大小#define TASK_CHECK_STK_SIZE 128 // 堆棧OS_STK TaskCheckStk[TASK_CHECK_STK_SIZE]; // 創(chuàng)建任務 - 信號檢測OSTaskCreateExt((void (*)(void *)) AppTaskCheck, (void *) 0, (OS_STK *)&TaskCheckStk[TASK_CHECK_STK_SIZE-1],

(INT8U ) TASK_CHECK_PRIO, (INT16U ) TASK_CHECK_PRIO, (OS_STK *)&TaskCheckStk[0], (INT32U ) TASK_CHECK_STK_SIZE, (void *) 0, (INT16U )(OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR)); // 任務應用實現(xiàn)void AppTaskCheck(void *p_arg){ // 代碼··· (void)p_arg; for(;;) { // 代碼··· }} FreeRRTOS創(chuàng)建一個任務類似,也是在創(chuàng)建時分配堆棧大?。?/p>

#define TASK_CHECK_PRIO 6#define TASK_CHECK_STK_SIZE 128 BaseType_t xReturn; xReturn = xTaskCreate(AppTaskCheck, “AppTaskCheck”, TASK_CHECK_STK_SIZE, NULL, TASK_CHECK_PRIO, NULL); 除了堆棧,其實還有像消息隊列、消息郵箱等也是需要提前分配堆棧。 比如FreeRTOS創(chuàng)建CLI消息隊列:

#define CLI_QUEUE_NUM 256 //CLI接收隊列數(shù)#define CLI_PACKAGE_LEN 2 //CLI數(shù)據(jù)包長度 QueueHandle_t xCLIRcvQueue = NULL; /* 創(chuàng)建隊列 */if(xCLIRcvQueue == NULL){ xCLIRcvQueue = xQueueCreate(CLI_QUEUE_NUM, CLI_PACKAGE_LEN);}

這就是創(chuàng)建任務(或隊列)的分配堆棧,至于具體分配多少,與你實際情況有關,下面章節(jié)我會描述。

2任務代碼量

一個任務的代碼量,就是你任務中調(diào)用的那些代碼。 比如上面例子中的代碼:

// 任務應用實現(xiàn)void AppTaskCheck(void *p_arg){ // 代碼··· (void)p_arg; for(;;) { // 代碼··· }}

這里可能寫了幾千行代碼,或者調(diào)用了上百個函數(shù),每個函數(shù)里面都有不少代碼。

這樣下來,這一個任務的代碼量就很大了。

3任務代碼量和堆棧大小有關系嗎?

很多人就存在一個疑惑:任務掛起,要在堆棧中臨時保存任務,如果這個任務的代碼量很大,是不需要很大堆棧空間才行?

答案:不一定需要很大堆??臻g,任務代碼量和堆棧也沒有直接關系。

可能很多初學者存在這么一個誤區(qū):保存一個任務,就是把這個任務所有代碼都保存起來(在堆棧中)。

堆棧主要保存是這個任務自身的變量(控制塊),還有臨時變量等這些關鍵變量信息,而并非要保存所有代碼。

4堆棧分配多大才合適?

任務堆棧大小,主要取決于你任務中【臨時變量】的多少。 注意:臨時變量包含你代碼中所有嵌套函數(shù)中的臨時變量。 對于RAM資源相對較大的處理器,你可以盡量分配多一點堆棧資源。 但是,很多時候,我們的RAM資源都是相對比較緊張的。這個時候,就需要你綜合平衡。 比如靜態(tài)局部變量:

void AppTaskCheck(void *p_arg){ static uint8_t aaa; //靜態(tài)局部變量 (void)p_arg; for(;;) { // 代碼··· }} 這里的aaa變量就不會占用該任務的堆??臻g,但是它會占用全局變量(RAM)空間。 用靜態(tài)局部變量,還是臨時變量,要牽涉到你項目具體情況,比如:RAM資源、代碼運行效率等。(臨時變量還會有一個數(shù)據(jù)拷貝過程) 所以,該如何分配堆棧,該用靜態(tài)還是臨時變量,需要綜合考慮你項目的情況而定。

編輯:jq

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

    關注

    68

    文章

    19890

    瀏覽量

    235127
  • RAM
    RAM
    +關注

    關注

    8

    文章

    1392

    瀏覽量

    117491
  • 代碼
    +關注

    關注

    30

    文章

    4900

    瀏覽量

    70718

原文標題:RTOS任務的堆棧大小與代碼量有關嗎?

文章出處:【微信號:strongerHuang,微信公眾號:strongerHuang】歡迎添加關注!文章轉(zhuǎn)載請注明出處。

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    關于使用RTOS編程時藍牙無法正常啟動的問題求解

    我的電路板是 CYW20829 在編寫基于 RTOS 的 BLE 程序時,我創(chuàng)建了一些其他任務并運行了程序,這導致藍牙初始化失敗,也就是說藍牙無法啟動。 程序只打印了藍牙初始化前的內(nèi)容。 [i
    發(fā)表于 07-01 07:15

    【RA4L1-SENSOR】05 按鍵實現(xiàn)RTOS任務切換

    ; 配置任務、隊列和信號 開發(fā)板實體按鍵接在了P000和P001上 在Pins--P0--P000,設置Symbolic Name為KEY1,模式是輸入模式。P001(KEY2)同理。 現(xiàn)在
    發(fā)表于 06-16 22:38

    詳解RTOS中的Hook函數(shù)

    Hook函數(shù)是RTOS中的一個關鍵特性,通過該函數(shù),用戶可以增強對任務管理的控制,定義系統(tǒng)行為。
    的頭像 發(fā)表于 03-24 16:14 ?384次閱讀

    RTOS中的本地存儲指針使用

    本地存儲指針是RTOS中的一個重要特性,增強了任務管理和數(shù)據(jù)處理能力。在RTOS上下文中,本地存儲是指存儲在本地的特定任務或?qū)ο蟮臄?shù)據(jù)。通常與任務
    的頭像 發(fā)表于 02-28 16:33 ?915次閱讀
    <b class='flag-5'>RTOS</b>中的本地存儲指針使用

    使用任務通知提高RTOS應用的效率

    在實時嵌入式系統(tǒng)中,性能和資源效率是決定設計成敗的關鍵因素。傳統(tǒng)的實時操作系統(tǒng)(RTOS)提供了如隊列、信號和事件組機制,實現(xiàn)任務之間的同步和通信。FreeRTOS/SAFERTOS還提供一種方法可以使這些過程更快、更輕量化,
    的頭像 發(fā)表于 12-27 14:54 ?696次閱讀

    RTOS與Linux到底什么區(qū)別

    很多做嵌入式開發(fā)的小伙伴都存在這樣的疑惑:RTOS與Linux到底什么區(qū)別?
    的頭像 發(fā)表于 10-29 09:53 ?1280次閱讀

    C2000?MCU的運行時堆棧大小監(jiān)測

    電子發(fā)燒友網(wǎng)站提供《C2000?MCU的運行時堆棧大小監(jiān)測.pdf》資料免費下載
    發(fā)表于 09-11 09:30 ?0次下載
    C2000?MCU的運行時<b class='flag-5'>堆棧</b><b class='flag-5'>大小</b>監(jiān)測

    freertos最多支持多少個任務

    以下幾個因素: 系統(tǒng)資源 :FreeRTOS能夠支持的任務數(shù)量受到系統(tǒng)硬件資源的限制,特別是處理器的RAM大小和性能。RAM用于存儲任務的控制塊(TCB)和任務
    的頭像 發(fā)表于 09-02 14:21 ?2254次閱讀

    freertos和rtos區(qū)別是什么

    FreeRTOS 和 RTOS(實時操作系統(tǒng))是兩個不同的概念,但它們之間緊密的聯(lián)系。FreeRTOS 是一個特定的開源實時操作系統(tǒng),而 RTOS 是實時操作系統(tǒng)的一般概念。 概念定義 RT
    的頭像 發(fā)表于 09-02 14:18 ?3007次閱讀

    數(shù)字量與模擬關系如何算

    數(shù)字量與模擬之間的關系主要體現(xiàn)在它們之間的轉(zhuǎn)換上,這種轉(zhuǎn)換通常通過模數(shù)轉(zhuǎn)換器(ADC)和數(shù)模轉(zhuǎn)換器(DAC)來實現(xiàn)。以下是對兩者關系的介紹: 一、定義與基本關系 模擬
    的頭像 發(fā)表于 08-30 09:16 ?1849次閱讀

    堆棧和內(nèi)存的基本知識

    本文主要聊聊關于堆棧的內(nèi)容。包括堆棧和內(nèi)存的基本知識。常見和堆棧相關的 bug,如棧溢出,內(nèi)存泄漏,堆內(nèi)存分配失敗等。后面介紹軟件中堆棧統(tǒng)計的重要性,以及如何使用工具工具軟件中
    的頭像 發(fā)表于 08-29 14:10 ?1044次閱讀
    <b class='flag-5'>堆棧</b>和內(nèi)存的基本知識

    RTOS與Linux什么區(qū)別

    RTOS(Real-Time Operating System,實時操作系統(tǒng))與Linux是兩種在不同應用場景下發(fā)揮重要作用的操作系統(tǒng),它們在設計理念、功能特性、應用場景以及性能表現(xiàn)等方面存在顯著差異。以下是對RTOS與Linux區(qū)別的詳細分析。
    的頭像 發(fā)表于 08-20 16:05 ?6596次閱讀

    RTOS開發(fā)最佳實踐

    基于RTOS編寫應用程序時,一些要注意事項。在本節(jié)中,您將學習RTOS開發(fā)最佳實踐,例如POSIX合規(guī)性、安全性和功能安全認證。
    的頭像 發(fā)表于 08-20 11:24 ?846次閱讀

    電容大小與濾波頻率的關系是什么

    電容大小與濾波頻率的關系是一個非常重要的電子學問題,它涉及到電路設計、信號處理、電源管理等多個領域。 一、電容的基本特性 定義:電容是一種電子元件,能夠存儲電荷。它的單位是法拉(F),通常用微法
    的頭像 發(fā)表于 07-29 09:13 ?6834次閱讀

    xTaskCreate能否把堆棧上限調(diào)整為2K或者1k?

    RTOS SDK 的系統(tǒng)任務優(yōu)先級為 15 ,創(chuàng)建任務的接?口 xTaskCreate 為 freeRTOS ?自帶接?口,使 ?用 xTaskCreate 創(chuàng)建任務時,
    發(fā)表于 07-22 06:31