国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

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

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

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

RTOS任務(wù)的堆棧大小與代碼量有啥關(guān)系嗎?

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

掃碼添加小助手

加入工程師交流群

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

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

1RTOS任務(wù)堆棧分配

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

// 任務(wù)優(yōu)先級(jí)#define TASK_CHECK_PRIO 6 // 任務(wù)堆棧大小#define TASK_CHECK_STK_SIZE 128 // 堆棧OS_STK TaskCheckStk[TASK_CHECK_STK_SIZE]; // 創(chuàng)建任務(wù) - 信號(hào)檢測(cè)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)); // 任務(wù)應(yīng)用實(shí)現(xiàn)void AppTaskCheck(void *p_arg){ // 代碼··· (void)p_arg; for(;;) { // 代碼··· }} FreeRRTOS創(chuàng)建一個(gè)任務(wù)類(lèi)似,也是在創(chuàng)建時(shí)分配堆棧大小:

#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); 除了堆棧,其實(shí)還有像消息隊(duì)列、消息郵箱等也是需要提前分配堆棧。 比如FreeRTOS創(chuàng)建CLI消息隊(duì)列:

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

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

2任務(wù)代碼量

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

// 任務(wù)應(yīng)用實(shí)現(xiàn)void AppTaskCheck(void *p_arg){ // 代碼··· (void)p_arg; for(;;) { // 代碼··· }}

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

這樣下來(lái),這一個(gè)任務(wù)的代碼量就很大了。

3任務(wù)代碼量和堆棧大小有關(guān)系嗎?

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

答案:不一定需要很大堆棧空間,任務(wù)代碼量和堆棧也沒(méi)有直接關(guān)系。

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

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

4堆棧分配多大才合適?

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

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

編輯:jq

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(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)投訴
  • 處理器
    +關(guān)注

    關(guān)注

    68

    文章

    20250

    瀏覽量

    252213
  • RAM
    RAM
    +關(guān)注

    關(guān)注

    8

    文章

    1399

    瀏覽量

    120548
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4967

    瀏覽量

    73960

原文標(biāo)題:RTOS任務(wù)的堆棧大小與代碼量有關(guān)嗎?

文章出處:【微信號(hào):strongerHuang,微信公眾號(hào):strongerHuang】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

    在學(xué)單片機(jī)時(shí)在堆棧遇到的問(wèn)題分享

    編譯器在生成代碼使用兩個(gè)堆棧:一個(gè)是用于子程序調(diào)用和中斷操作的硬件堆棧,一個(gè)是用于以堆棧結(jié)構(gòu)傳遞的參數(shù)臨時(shí)變量和局部變量的軟件堆棧。硬件
    發(fā)表于 01-23 07:47

    堆棧的原理揭秘

    成本的考慮,單片機(jī)的內(nèi)存容量一直都是非常有限的。而在單片機(jī)上電后,所有的變量又都需要被拷貝到內(nèi)存中運(yùn)行。為了解決這個(gè)矛盾,盡可能的節(jié)約代碼在運(yùn)行過(guò)程中變量所占用的內(nèi)存空間,“堆棧”和“局部變量”這兩個(gè)
    發(fā)表于 01-23 07:08

    RTOS在嵌入式開(kāi)發(fā)中的作用

    嵌入式系統(tǒng)中,很多方式實(shí)現(xiàn)任務(wù)調(diào)度。功能有限的小系統(tǒng)中,無(wú)限循環(huán)足夠?qū)崿F(xiàn)系統(tǒng)功能。當(dāng)軟件設(shè)計(jì)變得龐大且復(fù)雜時(shí),設(shè)計(jì)師應(yīng)該考慮使用RTOS(實(shí)時(shí)操作系統(tǒng))。 下面給大家分享使用RTOS
    發(fā)表于 12-26 07:53

    使用RTOS時(shí)需要注意的幾點(diǎn)內(nèi)容分享

    RTOS產(chǎn)品代碼少和速度快,現(xiàn)在RTOS還提升了一致性。RTOS除能很快完成任務(wù)外,還能保證很好地完成
    發(fā)表于 12-23 06:34

    選擇RTOS的要點(diǎn)

    選擇RTOS。大多數(shù)RTOS產(chǎn)品代碼少和速度快,現(xiàn)在RTOS還提升了一致性。RTOS除能很快完成任務(wù)
    發(fā)表于 12-12 08:00

    RTOS Crash 問(wèn)題全維度分析與解決指南

    )中查看LR(鏈接寄存器)、PC(程序計(jì)數(shù)器),回溯崩潰前的函數(shù)調(diào)用路徑,定位到具體代碼行; 內(nèi)存快照 :檢查崩潰任務(wù)的TCB(任務(wù)控制塊)、棧空間、堆內(nèi)存,確認(rèn)是否越界、重復(fù)釋放等
    發(fā)表于 12-08 03:56

    FreeRTOS 空閑任務(wù)

    ,空閑任務(wù)就開(kāi)始運(yùn)行了。這個(gè)空閑任務(wù)什么作用呢?首先一個(gè)RTOS每時(shí)每刻都需要有任務(wù)運(yùn)行,其次這個(gè)空閑
    發(fā)表于 12-04 07:35

    RTOS 必學(xué)概念:任務(wù)、信號(hào)、隊(duì)列一次搞懂

    如果你剛接觸RTOS(實(shí)時(shí)操作系統(tǒng)),很可能會(huì)有這樣的困惑:“RTOS和裸機(jī)程序到底什么區(qū)別?”“任務(wù)是線程嗎?為什么要分任務(wù)?”“信號(hào)
    的頭像 發(fā)表于 11-17 10:53 ?465次閱讀
    <b class='flag-5'>RTOS</b> 必學(xué)概念:<b class='flag-5'>任務(wù)</b>、信號(hào)<b class='flag-5'>量</b>、隊(duì)列一次搞懂

    可配置的數(shù)據(jù)閃存大小、地址和 APROM 之間什么關(guān)系

    可配置的數(shù)據(jù)閃存大小、地址和 APROM 之間什么關(guān)系
    發(fā)表于 08-26 06:58

    請(qǐng)問(wèn)可配置的數(shù)據(jù)閃存大小、地址和 APROM 之間什么關(guān)系

    可配置的數(shù)據(jù)閃存大小、地址和 APROM 之間什么關(guān)系
    發(fā)表于 08-21 07:10

    電磁干擾“江湖三兄弟”:EMC、EMI、EMS 到底區(qū)別?

    電磁干擾“江湖三兄弟”:EMC、EMI、EMS 到底區(qū)別?
    的頭像 發(fā)表于 08-20 15:16 ?2681次閱讀
    電磁干擾“江湖三兄弟”:EMC、EMI、EMS 到底<b class='flag-5'>有</b><b class='flag-5'>啥</b>區(qū)別?

    關(guān)于使用RTOS編程時(shí)藍(lán)牙無(wú)法正常啟動(dòng)的問(wèn)題求解

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

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

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

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

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

    嵌入式開(kāi)發(fā)避坑指南|FreeRTOS的5個(gè)\"反直覺(jué)\"小技巧

    同步分配堆棧內(nèi)存 關(guān)鍵代碼段用portENTER_CRITICAL()保護(hù),防止中斷搶占 案例:某工業(yè)控制系統(tǒng)因GPS任務(wù)搶占溫濕度任務(wù),導(dǎo)致數(shù)據(jù)丟失 技巧3:信號(hào)
    發(fā)表于 03-20 13:57