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

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

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

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

淺談如何評估TI C2000系列微控制器程序的堆棧使用情況

星星科技指導(dǎo)員 ? 來源:TI ? 作者:Sheldon He ? 2023-03-24 09:36 ? 次閱讀

實時控制器往往擁有十分有限的存儲器資源特別是片內(nèi)的隨機(jī)存儲器(RAM)資源。能否合理、高效的運用這些資源不僅關(guān)乎到整個嵌入式系統(tǒng)的實現(xiàn)成本與性能,更涉及到系統(tǒng)在運行時是否會出現(xiàn)致命且不易被發(fā)現(xiàn)的錯誤。本文將對C2000系列微控制器的棧 (亦習(xí)慣性的被稱為堆棧,這里請注意堆與棧之間的區(qū)別)做簡單的介紹,并提出四種方法來對應(yīng)用程序運行所需的棧空間大小進(jìn)行追蹤或評估,以幫助開發(fā)者在開發(fā)過程中(尤其是使用C/C++高級語言進(jìn)行開發(fā)時)優(yōu)化內(nèi)存資源的使用并避免嵌入式程序可能存在的風(fēng)險。

在計算機(jī)中,棧作為一種數(shù)據(jù)結(jié)構(gòu)可以存放一系列的成員并且通過“入棧”和“出棧”操作來從棧定加入新的數(shù)據(jù)或從棧頂拿走數(shù)據(jù)。從類別上來看堆棧通常又可以分為軟件堆棧和硬件堆棧兩類,前者時常經(jīng)由數(shù)組和鏈表在程序中實現(xiàn)而后者則與計算機(jī)架構(gòu)相關(guān)并被用于實現(xiàn)內(nèi)存的分配及訪問。

本文要討論的是C2000系列微控制器C28x內(nèi)核中的硬件堆。該棧的典型特點為有一個固定的起始地址,或者說是寄存器復(fù)位值,和一個由編譯器指定的可變的棧空間大小。C28x內(nèi)核的堆棧指針(stack point)寄存器SP是16位寄存器,且在使用時高16位保持為0,故可以訪問64K大小的內(nèi)存空間。在芯片復(fù)位時,SP的內(nèi)容變?yōu)?x00000400,且在使用時棧由低地址向高地址生長。堆棧的合法使用空間通常由編譯器命令--stack_size= size來設(shè)定,其中size是一個常數(shù),指定了棧空間的大小(以16位字為單位),棧的空間不得超過實際非初始化物理內(nèi)存區(qū)域.stack大小也不得超出0xFFFF范圍,否則將產(chǎn)生溢出。

一個嵌入式系統(tǒng)軟件常常會因為多種原因而需要使用堆棧,這些原因包括:存儲數(shù)學(xué)表達(dá)式的中間計算結(jié)果、在函數(shù)遞歸時存儲每一次調(diào)用的函數(shù)返回地址、存放函數(shù)內(nèi)的局部變量、存放傳遞進(jìn)函數(shù)的參數(shù)等。隨著軟件流程變得越來越龐大復(fù)雜,如何正確的評估所需的堆棧空間就顯得十分重要。分配過多的堆棧空間會“浪費”內(nèi)存,堆棧溢出則可能造成堆棧信息丟失或者修改到鄰近內(nèi)存區(qū)域的數(shù)據(jù)并最終導(dǎo)致系統(tǒng)出錯。

本文總結(jié)了四種適用于TI C2000系列MCU的堆棧使用評估方法,同時建議讀者在有條件的情況下使用多種方法交叉驗證以彌補單一方法使用過程中的局限性。這些方法通常情況下也適用于TI的其他部分嵌入式產(chǎn)品,對于其他各類嵌入式系統(tǒng)的堆棧測試、評估也有一定的借鑒意義。

一、使用TI提供的XML文件處理腳本生成函數(shù)調(diào)用圖并進(jìn)行靜態(tài)分析

通過函數(shù)的調(diào)用關(guān)系可以靜態(tài)的分析堆棧的使用情況,TI提供了一套基于Perl的腳本工具可以用于分析工程build過程中產(chǎn)生的XML文件以提供程序空間使用相關(guān)的信息。這里筆者需要用到的是該工具包中的call_graph.pl腳本來生成函數(shù)調(diào)用圖(Call Graph)。

首先需要在wiki頁面中下載并安裝該工具包,可以在搜索引擎中檢索關(guān)鍵字“Code_Generation_Tools_XML_Processing_Scripts”

并找到對應(yīng)的ti.com頁面進(jìn)行下載安裝。對于不熟悉命令行操作的讀者可以按照以下三個步驟來使用該腳本。

1. 新建一個文件夾并以英文命名,并從CCS對應(yīng)的C2000編譯器目錄拷貝odf2000.exe到該新建的文件夾中。(ofd2000.exe在C:ticcs901ccstoolscompilerti-cgt-c2000_18.12.1.LTSbin,路徑隨CCS版本、CCS安裝路徑及編譯器版本不同會有差異)同時還需要從cgxml工具路徑C:ticgxmlbin中拷貝call_graph.exe,從工程目錄拷貝編譯生成的.out文件到該文件夾中。

2. 打開命令行工具(可在windows開始菜單搜索“CMD”找到),在其中輸入如下命令選取上一步中新建的文件夾為工作目錄

cd C:ticgxmlutils

3. 在命令行中運行如下腳本獲取輸出結(jié)果,用戶需要自行修改.out文件的文件名使其與第一步中復(fù)制到文件夾中的.out同名。

ofd2000 -xg gpio_toggle_cpu01.out | call_graph --stack_max

此時用戶可以在命令行的輸出中看到最惡劣情況下的堆棧占用情況,此處,函數(shù)c_int00是函數(shù)調(diào)用圖的根,其調(diào)用在最大情況下會占用48個16位字的堆棧空間。但是這樣的結(jié)果有兩點限制條件將在本節(jié)的末尾部分指出。

pYYBAGQc_riAXMpEAAA3E1jUL4M782.png

如果使用--stack_max參數(shù)則可以獲得更多的細(xì)節(jié)信息,具體的數(shù)據(jù)解讀方法請參閱安裝目錄下的文檔《call_graph.pdf》。

該方法簡單易用,但是對于非直接調(diào)用的函數(shù)以及相互嵌套的中斷服務(wù),該工具則無法直接將其在腳本輸出結(jié)果中表現(xiàn)出來。此時需要使用者結(jié)合call_graph輸出的詳細(xì)信息,借助自己對于程序流程的理解,分析得到最終的堆棧評估結(jié)果。

二、使用回調(diào)函數(shù)在運行時抓取棧指針(SP)最大值

C2000較新版本的編譯器支持在函數(shù)的進(jìn)入和退出過程中插入回調(diào)函數(shù)。開發(fā)者可以使--entry_hook選項為每個函數(shù)的開頭部分插入一段讀取堆棧指針(SP)的代碼并在一定周期的程序運行中對堆棧指針的最大值進(jìn)行抽取與比較從而獲取統(tǒng)計學(xué)的極限堆棧使用情況。

以TI v18.12.2LTS Coder generation tool為例做一個測試,首先右擊打開工程屬性,并在“Advanced Options”中找到--entry_hook設(shè)置欄目,在后方的空格處輸入回調(diào)函數(shù)的函數(shù)名稱(以名為“entry_hook”的函數(shù)為例)。

poYBAGQc_riAIBGAAAGZDsPWlL0996.png

之后可以在c文件中定義函數(shù)entry_hook,其中使用的SP_current及SP_max為事先聲明的int型全局變量。

void entry_hook(){

SP_current = getStackPointer();

SP_max = (SP_current > SP_max) ? SP_current : SP_max;

}

在該函數(shù)中使用了一小段匯編函數(shù)getStackPointer();用于獲取堆棧指針(SP)寄存器的值,該函數(shù)的定義為:

_getStackPointer:

.asmfunc

MOV AL, SP

SUB AL, #2

LRETR

.endasmfunc

測試前還需要在頭文件中對其做如下形式的函數(shù)聲明:

extern int getStackPointer(void);

在完成設(shè)置后重新build工程,并點擊CCS中的“Debug”按鈕進(jìn)入在線調(diào)試狀態(tài),此后可以進(jìn)行全速運行。運行一段時間以后打開CCS的“View”,“Expressions”并點擊綠色加號“Add new expression”輸入變量名SP_max對最大堆棧占用情況進(jìn)行觀察。

通過回調(diào)函數(shù)做堆棧指針的采樣統(tǒng)計不一定可以抓取到最極限的堆棧使用情況,實際的堆棧消耗會比用這種方法測量到的略大,因此筆者也提出了第三種測試方法。

三、在棧空間填充標(biāo)識數(shù)據(jù)以檢測棧空間使用情況

方法三的思路是在堆棧空間的特定內(nèi)存區(qū)域中預(yù)先寫入標(biāo)志性數(shù)據(jù)如(0x5A)。經(jīng)由程序的執(zhí)行,使用過的堆棧空間內(nèi)的數(shù)據(jù)會被其他數(shù)據(jù)覆蓋掉,從棧尾開始向低地址走的標(biāo)志性數(shù)據(jù)則因其內(nèi)存空間未被使用而得以保留不變,當(dāng)然這一切的前提是堆棧不發(fā)生溢出。通過尋找被修改數(shù)組的最大地址即可以判斷出這一測試過程中程序?qū)嶋H所使用的最大堆棧規(guī)模。

該方法可以在連接仿真器的情況下進(jìn)行堆棧占用情況的觀察,也可以在芯片脫離仿真器運行之后再連接入仿真器(通過設(shè)置使目標(biāo)芯片在連接時不被復(fù)位)并通過“Memory Browser”進(jìn)行結(jié)果觀察。該方法的準(zhǔn)確性取決于軟件執(zhí)行的覆蓋程度。

四、使用ERAD外設(shè)模塊進(jìn)行堆棧監(jiān)測

ERAD(embedded real-time analysis and diagnostic)模塊是F28004x系列MCU新增的外設(shè),他獨立于C28x內(nèi)核之外,具有8個總線比較器和4個檢測計數(shù)器子功能模塊。由于該模塊既可以被應(yīng)用程序訪問也可以被仿真工具訪問因此能極大的增加調(diào)試的靈活性和便利性。

關(guān)于如何使用ERAD模塊進(jìn)行堆棧監(jiān)控可以直接參考TI C2000ware軟件包自帶的范例程序,其參考位置為:C:tic2000C2000Ware_2_00_00_03driverlibf28004xexampleseradstack_overflow

其基本工作方式是對地址總線進(jìn)行監(jiān)控并根據(jù)HWBP_CNTL寄存器的配置,將地址總線內(nèi)容與HWBP_REF寄存器中的參考值以指定方式進(jìn)行對比(大于、大于等于、小于、小于等于),最終在比較事件發(fā)生時觸發(fā)CPU的停止動作或生產(chǎn)RTOSINTn中斷。通過這種方式的多次運用可以把堆棧空間的實際需求鎖定在一個區(qū)間內(nèi)便于參考。

總結(jié):本文結(jié)合工程開發(fā)和調(diào)試的實際經(jīng)驗,對常用的四種C2000 MCU程序堆棧空間評估方法進(jìn)行了總結(jié),期待讀者在閱讀后能夠結(jié)合實際情況選擇一種或者多種方式確定出應(yīng)用程序的堆棧需求并在工程屬性中進(jìn)行合理的配置,以實現(xiàn)最大程度的優(yōu)化。

審核編輯:郭婷

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

    關(guān)注

    48

    文章

    7714

    瀏覽量

    152647
  • 控制器
    +關(guān)注

    關(guān)注

    113

    文章

    16573

    瀏覽量

    180414
  • 存儲器
    +關(guān)注

    關(guān)注

    38

    文章

    7553

    瀏覽量

    164907
收藏 人收藏

    評論

    相關(guān)推薦

    如何評估C2000系列微控制器程序堆棧使用情況

    行時是否會出現(xiàn)致命且不易被發(fā)現(xiàn)的錯誤。本文將對C2000系列微控制器的棧 (亦習(xí)慣性的被稱為堆棧,這里請注意堆與棧之間的區(qū)別)做簡單的介紹,并提出四種方法來對應(yīng)用
    發(fā)表于 11-08 07:52

    用于C2000?微控制器的EtherCAT從站堆棧解決方案

    C2000實時控制微控制器(MCU)的EtherCAT從站節(jié)點的硬件開發(fā)。該博文概述了EtherCAT技術(shù)非常適合工業(yè)自動化應(yīng)用中C2000 MCU的原因,以及為何
    發(fā)表于 11-09 07:01

    如何利用C2000 TMS320F28388D實時控制器自行開發(fā)EtherCAT從站控制器

    系列博客文章的第1部分介紹了用于C2000?微控制器(MCU)的EtherCAT從站堆棧解決方案的市場機(jī)遇,以及從站堆棧開發(fā)快速入門的三個
    發(fā)表于 11-09 07:30

    針對 C2000 微控制器的集成微控制器 (MCU) 電源解決方案

    針對 C2000 微控制器的集成微控制器 (MCU) 電源解決方案
    發(fā)表于 10-13 10:43 ?9次下載
    針對 <b class='flag-5'>C2000</b> <b class='flag-5'>微控制器</b>的集成<b class='flag-5'>微控制器</b> (MCU) 電源解決方案

    基于TI C2000? 微控制器的分析與應(yīng)用

    C2000? 微控制器 (MCU) 交錯式功率因素校正 (PFC) 套件提供業(yè)界最佳效率、功率因素 (PF) 及總諧波失真 (THD) 性能,支持高級電能計量功能與交流 (AC) 線路。
    的頭像 發(fā)表于 06-12 04:24 ?4150次閱讀

    C2000微控制器的架構(gòu)特點介紹

    C2000 微控制器培訓(xùn)課程(二)—架構(gòu)概述(下)
    的頭像 發(fā)表于 08-13 00:13 ?4149次閱讀

    C2000微控制器的特點及優(yōu)勢介紹

    C2000 微控制器培訓(xùn)課程(一)—簡介
    的頭像 發(fā)表于 08-20 02:10 ?4229次閱讀

    TI C2000的數(shù)字電源系統(tǒng)的微控制器架構(gòu)介紹

    TI C2000在電動車輛上的數(shù)字電源應(yīng)用系統(tǒng)微控制器架構(gòu)
    的頭像 發(fā)表于 04-26 06:17 ?4389次閱讀
    <b class='flag-5'>TI</b> <b class='flag-5'>C2000</b>的數(shù)字電源系統(tǒng)的<b class='flag-5'>微控制器</b>架構(gòu)介紹

    C2000微控制器的架構(gòu)介紹 (1)

    C2000 微控制器培訓(xùn)課程(二)架構(gòu)概述(上)
    的頭像 發(fā)表于 04-19 06:10 ?4560次閱讀
    <b class='flag-5'>C2000</b><b class='flag-5'>微控制器</b>的架構(gòu)介紹 (1)

    如何評估TI C2000系列微控制器程序堆棧使用情況

    行時是否會出現(xiàn)致命且不易被發(fā)現(xiàn)的錯誤。本文將對C2000系列微控制器的棧 (亦習(xí)慣性的被稱為堆棧,這里請注意堆與棧之間的區(qū)別)做簡單的介紹,并提出四種方法來對應(yīng)用
    的頭像 發(fā)表于 10-20 20:09 ?556次閱讀

    如何評估TI C2000系列微控制器程序堆棧使用情況

    合理、高效的運用這些資源不僅關(guān)乎到整個嵌入式系統(tǒng)的實現(xiàn)成本與性能,更涉及到系統(tǒng)在運行時是否會出現(xiàn)致命且不易被發(fā)現(xiàn)的錯誤。本文將對C2000系列微控制器的棧 (亦習(xí)慣性的被稱為堆棧,這里
    的頭像 發(fā)表于 01-19 16:17 ?2707次閱讀
    如何<b class='flag-5'>評估</b><b class='flag-5'>TI</b> <b class='flag-5'>C2000</b><b class='flag-5'>系列</b><b class='flag-5'>微控制器</b><b class='flag-5'>程序</b>的<b class='flag-5'>堆棧</b><b class='flag-5'>使用情況</b>

    淺談如何評估TI C2000系列微控制器程序堆棧使用情況

    淺談如何評估TI C2000系列微控制器程序
    發(fā)表于 10-31 08:23 ?0次下載
    <b class='flag-5'>淺談</b>如何<b class='flag-5'>評估</b><b class='flag-5'>TI</b> <b class='flag-5'>C2000</b><b class='flag-5'>系列</b><b class='flag-5'>微控制器</b><b class='flag-5'>程序</b>的<b class='flag-5'>堆棧</b><b class='flag-5'>使用情況</b>

    C2000?微控制器的串行閃存編程

    電子發(fā)燒友網(wǎng)站提供《C2000?微控制器的串行閃存編程.pdf》資料免費下載
    發(fā)表于 09-03 10:15 ?0次下載
    <b class='flag-5'>C2000</b>?<b class='flag-5'>微控制器</b>的串行閃存編程

    增強C2000?微控制器系列的計算性能

    電子發(fā)燒友網(wǎng)站提供《增強C2000?微控制器系列的計算性能.pdf》資料免費下載
    發(fā)表于 09-19 12:36 ?0次下載
    增強<b class='flag-5'>C2000</b>?<b class='flag-5'>微控制器</b><b class='flag-5'>系列</b>的計算性能

    C2000?微控制器的USB閃存編程

    電子發(fā)燒友網(wǎng)站提供《C2000?微控制器的USB閃存編程.pdf》資料免費下載
    發(fā)表于 09-26 11:30 ?0次下載
    <b class='flag-5'>C2000</b>?<b class='flag-5'>微控制器</b>的USB閃存編程
    主站蜘蛛池模板: 在线色av | 国产日韩高清一区二区三区 | 最新在线黄色网址 | 日本吃孕妇奶水免费观看 | 熟女人妻久久精品AV天堂 | 9966在线观看免费高清电影 | 亚洲欧美日韩另类精品一区二区三区 | 国精产品一区一区三区M | 国产成人精品免费青青草原app | 红尘影院手机在线观看 | 国产99久久久国产精品成人 | 国产AV无码一二三区视频 | 国产 日韩 欧美 高清 亚洲 | 日日AV夜夜添久久奶无码 | 欧美精品华人在线 | 国产女人与黑人在线播放 | 精品视频免费在线 | 国产精品成人啪精品视频免费观看 | 亚洲中文字幕无码一去台湾 | 俄罗斯孩交精品 | 久久精品午夜一区二区福利 | 中国老太性色xxxxxhd | 午夜福利在线观看6080 | 日日夜夜影院在线播放 | 免费观看高清黄页网址大全 | 视频一区国产在线第一页 | 亚洲 综合 欧美在线 热 | 91看片淫黄大片.在线天堂 | 国产不卡一卡2卡三卡4卡网站 | 好男人好资源在线播放 | 欧美最猛12teevideos欧美 欧美最猛12teevideos | 色偷偷超碰97人人澡人人 | 浴室里强摁做开腿呻吟的漫画 | 三级全黄的视频在线观看 | 无止侵犯高H1V3无止侵犯 | 精品久久久噜噜噜久久久app | 亚洲乱亚洲乱妇13p 亚洲乱色视频在线观看 | 99re6在线视频国产精品欧美 | 嫩草影院在线观看精品 | 永久精品视频无码一区 | 伊人久久大线蕉香港三级 |