色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

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

3天內不再提示

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

strongerHuang ? 來源:strongerHuang ? 作者:strongerHuang ? 2021-05-26 09:34 ? 次閱讀

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

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

1RTOS任務堆棧分配

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

// 任務優先級#define TASK_CHECK_PRIO 6 // 任務堆棧大小#define TASK_CHECK_STK_SIZE 128 // 堆棧OS_STK TaskCheckStk[TASK_CHECK_STK_SIZE]; // 創建任務 - 信號檢測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)); // 任務應用實現void AppTaskCheck(void *p_arg){ // 代碼··· (void)p_arg; for(;;) { // 代碼··· }} FreeRRTOS創建一個任務類似,也是在創建時分配堆棧大小:

#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創建CLI消息隊列:

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

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

2任務代碼量

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

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

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

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

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

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

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

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

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

4堆棧分配多大才合適?

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

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

編輯:jq

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

    關注

    68

    文章

    19299

    瀏覽量

    230010
  • RAM
    RAM
    +關注

    關注

    8

    文章

    1368

    瀏覽量

    114746
  • 代碼
    +關注

    關注

    30

    文章

    4791

    瀏覽量

    68677

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

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

收藏 人收藏

    評論

    相關推薦

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

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

    RTOS與Linux到底什么區別

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

    C2000?MCU的運行時堆棧大小監測

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

    freertos最多支持多少個任務

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

    freertos和rtos區別是什么

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

    數字量與模擬關系如何算

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

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

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

    xTaskCreate能否把堆棧上限調整為2K或者1k?

    RTOS SDK 的系統任務優先級為 15 ,創建任務的接?口 xTaskCreate 為 freeRTOS ?自帶接?口,使 ?用 xTaskCreate 創建任務時,
    發表于 07-22 06:31

    請問est_printf為什么要使用堆棧空間?

    - 它應該只是減慢你的代碼,因為它在等待輸出調試消息時什么都不做 - 不會占用堆棧空間。 我用 ets_printf 儀器化了 malloc 和 free。 發生這種情況時,會生成一個異常,即在
    發表于 07-09 07:47

    esp32S2創建任務時,若任務堆棧大小配置超過 4096*6 ,該任務會創建失敗,如何解決?

    esp32S2創建任務時,若任務堆棧大小配置超過 4096*6 ,該任務會創建失敗, xTaskCreat 返回 xReturn = fff
    發表于 06-20 08:26

    請問CMSIS-RTOS RTX的任務調度鎖在哪里?

    請問一下,CMSIS-RTOS RTX的任務調度鎖在哪里?謝謝!
    發表于 05-13 08:28

    求助,關于stm32f1使用freeRTOS和Fatfs時任務堆棧大小問題求解

    哪位使用過freeRTOS和Fatfs時,使用Fatfs系統的函數如f_open()等等時,此任務堆棧大小大致需要多大,當前MAX_SS 定義為4096,我分配12K軟件都跑飛了,請哪位使用分享一下經驗,謝謝!~~?
    發表于 05-09 06:50

    IAR中調試freertos系統怎樣才能方便的獲得任務堆棧情況?

    在IAR中將freertos移植到STM32中,在進行任務堆棧分配時分配多大的堆棧時一個問題,如何比較方便的獲得任務堆棧呢?利用IAR這個平
    發表于 05-07 08:15

    使用STM32CubeIDE修改堆棧大小后,生成的BIN文件內容沒變化是怎么回事?

    大家好!我在使用STM32CubeIDE V1.6.1版本修改工程的堆棧后,在ld文件里已經看到堆棧對應的變量改變了,但是為什么生成出來的bin文件沒變化呢? 上傳了的兩個工程文件,希望大家可以
    發表于 04-07 06:11

    電阻大小與導體的什么有關系

    電阻大小與導體的幾個相關因素有密切的關系,其中包括材料的電阻率、尺寸、形狀、溫度以及其他外界條件。 首先,材料的電阻率是決定導體電阻大小的關鍵因素之一。電阻率是材料本身對電流流動的阻礙程度的度量
    的頭像 發表于 02-26 13:39 ?2272次閱讀
    主站蜘蛛池模板: 国产女人毛片| 亚洲字幕在线观看| 中文字幕亚洲第一页| 日本无码专区亚洲麻豆| 麻豆沈芯语| 青青久在线| 性春院| 真实国产乱子伦精品一区二区三区| 伊人影院综合网| 成年视频xxxxxx在线| 黑色丝袜美女被网站| 男女后进式猛烈xx00动态图片 | 嫩草影院永久在线一二三四| 欧美成人免费观看久久| 窝窝午夜色视频国产精品东北| 亚瑟天堂久久一区二区影院| 亚洲三级在线看| 亚洲高清毛片一区二区| 伊人青青久| 大学生第一次破女在线观看| 黄色三级图片| 玩高中女同桌肉色短丝袜脚文| 一边吃奶一边啪啪真舒服| 成人午夜精品无码区久久漫画日本 | 伊人久久综合影院| 成人免费肉动漫无遮网站| 久久6699精品国产人妻| 射死你天天日| jk制服喷水| 久久久精品久久久久久| 色老汉网址导航| TUBE19UP老师学生| 免费精品国偷自产在线| 一本色道久久88综合日韩精品| 国产精品野外AV久久久| 青青草原国产在线| jizz中国女人| 欧美牲交A欧美牲交| 97蜜桃123| 欧美激情视频一区二区| 真人做受120分钟免费看|