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

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

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

3天內不再提示

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

電子設計 ? 來源:電子設計 ? 作者:電子設計 ? 2022-01-19 16:17 ? 次閱讀

Other Parts Discussed in Post:C2000WARE

作者: Sheldon He

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

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

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

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

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

一、使用TI提供的XML文件處理腳本生成函數調用圖并進行靜態分析

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

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

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

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

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

cd C:\ti\cgxml\utils

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

ofd2000 -xg gpio_toggle_cpu01.out | call_graph --stack_max

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

poYBAGGKTnCAYnNDAAA3E1jUL4M189.png

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

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

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

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

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

pYYBAGGKTnKAY-b6AAGZDsPWlL0924.png

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

void entry_hook(){

SP_current = getStackPointer();

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

}

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

_getStackPointer:

.asmfunc

MOV AL, SP

SUB AL, #2

LRETR

.endasmfunc

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

extern int getStackPointer(void);

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

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

三、在棧空間填充標識數據以檢測棧空間使用情況

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

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

四、使用ERAD外設模塊進行堆棧監測

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

關于如何使用ERAD模塊進行堆棧監控可以直接參考TI C2000ware軟件包自帶的范例程序,其參考位置為:C:\ti\c2000\C2000Ware_2_00_00_03\driverlib\f28004x\examples\erad\stack_overflow

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

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

審核編輯:金巧

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

    關注

    146

    文章

    17133

    瀏覽量

    351013
  • 控制器
    +關注

    關注

    112

    文章

    16336

    瀏覽量

    177829
  • 嵌入式處理
    +關注

    關注

    0

    文章

    341

    瀏覽量

    10012
  • XML
    XML
    +關注

    關注

    0

    文章

    188

    瀏覽量

    33078
收藏 人收藏

    評論

    相關推薦

    C2000微控制器用戶培訓手冊

    電子發燒友網站提供《C2000微控制器用戶培訓手冊.pdf》資料免費下載
    發表于 12-05 14:13 ?0次下載
    <b class='flag-5'>C2000</b><b class='flag-5'>微控制器</b>用戶培訓手冊

    C2000?實時控制微控制器(MCU)使用入門

    電子發燒友網站提供《C2000?實時控制微控制器(MCU)使用入門.pdf》資料免費下載
    發表于 11-07 09:08 ?0次下載
    <b class='flag-5'>C2000</b>?實時<b class='flag-5'>控制</b><b class='flag-5'>微控制器</b>(MCU)使用入門

    LED照明和DC-DC轉換控制集成在一個C2000微控制器

    電子發燒友網站提供《LED照明和DC-DC轉換控制集成在一個C2000微控制器上.pdf》資料免費下載
    發表于 10-12 11:07 ?0次下載
    LED照明和DC-DC轉換<b class='flag-5'>控制</b>集成在一個<b class='flag-5'>C2000</b><b class='flag-5'>微控制器</b>上

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

    電子發燒友網站提供《C2000?微控制器的USB閃存編程.pdf》資料免費下載
    發表于 09-26 11:30 ?0次下載
    <b class='flag-5'>C2000</b>?<b class='flag-5'>微控制器</b>的USB閃存編程

    如何將自定義邏輯從FPGA/CPLD遷移到C2000?微控制器

    電子發燒友網站提供《如何將自定義邏輯從FPGA/CPLD遷移到C2000?微控制器.pdf》資料免費下載
    發表于 09-23 12:36 ?0次下載
    如何將自定義邏輯從FPGA/CPLD遷移到<b class='flag-5'>C2000</b>?<b class='flag-5'>微控制器</b>

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

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

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

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

    C2000 MCU的ADC輸入電路評估(使用TINA-TI仿真工具)

    電子發燒友網站提供《C2000 MCU的ADC輸入電路評估(使用TINA-TI仿真工具).pdf》資料免費下載
    發表于 09-07 11:18 ?1次下載
    <b class='flag-5'>C2000</b> MCU的ADC輸入電路<b class='flag-5'>評估</b>(使用TINA-<b class='flag-5'>TI</b>仿真工具)

    使用C2000 EtherCAT從站控制器的SMI進行以太網PHY配置

    電子發燒友網站提供《使用C2000 EtherCAT從站控制器的SMI進行以太網PHY配置.pdf》資料免費下載
    發表于 09-07 10:37 ?0次下載
    使用<b class='flag-5'>C2000</b> EtherCAT從站<b class='flag-5'>控制器</b>的SMI進行以太網PHY配置

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

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

    C2000實時控制微控制器(MCU)使用入門

    本指南是重要的參考資料,其中包含著手使用 C2000? 實時微控制器 (MCU) 的所有必要信息。本指南涵蓋了用C2000 器件進行開發的各方面內容,從硬件到支持資源應有盡有。除了主要的參考文檔外,每個部分還提供了相關鏈接和資源
    發表于 08-28 15:09 ?1次下載

    使用C2000?實時微控制器的基本開發指南

    電子發燒友網站提供《使用C2000?實時微控制器的基本開發指南.pdf》資料免費下載
    發表于 08-27 10:08 ?0次下載
    使用<b class='flag-5'>C2000</b>?實時<b class='flag-5'>微控制器</b>的基本開發指南

    CUBEIDE運行完可以看RAM的使用情況,運行中可以實時查看RAM的使用情況嗎?

    CUBEIDE運行完可以看RAM的使用情況,運行中可以實時查看RAM的使用情況嗎?以及負載情況? 圖片是運行完可以看RAM使用情況,是否可以運行中實時查看?是不是cubemonito
    發表于 03-12 07:56

    rtthread編譯后如何查看堆棧空間使用情況

    rtthread編譯后如何查看堆棧空間使用情況,現在只能在編譯完成后看到總大小,有沒有辦法能看到詳細的使用情況。 由于RAM只有128K,除去內存池32k,想看看剩余的RAM在哪用了
    發表于 03-05 07:58

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

    電子發燒友網站提供《針對 C2000? 微控制器的集成微控制器 (MCU) 電源解決方案數據表.pdf》資料免費下載
    發表于 03-04 14:12 ?0次下載
    針對 <b class='flag-5'>C2000</b>? <b class='flag-5'>微控制器</b>的集成<b class='flag-5'>微控制器</b> (MCU) 電源解決方案數據表
    主站蜘蛛池模板: 久久久大香菇| 教室里的激情电影| 精品一区二区三区在线成人 | 达达兔欧美午夜国产亚洲| 国产精品久久婷婷五月色| 久久免费国产| 日本枯瘦娇小| 国产在线精品视频二区 | 久久这里只有热精品18| 日韩做A爰片久久毛片A片毛茸茸| 亚洲免费人成 久久| 阿v天堂2017在无码| 狠狠色在在线视频观看| 情欲.美女高潮| 一区二一二| 国产成人无码精品久久久影院| 久久久久综合| 天天夜夜草草久久亚洲香蕉| 最新毛片网| 国产午夜伦鲁鲁| 日本阿v直播在线| 最新高清无码专区| 国产人妻777人伦精品HD| 秋霞电影网午夜一级鲁丝片| 伊人久久大香线蕉观看| 国产精品爽黄69天堂A片| 男女夜晚在爽视频免费观看| 亚洲国产精品高清在线| 朝鲜美女bbwbbw撒尿| 久久久无码精品亚洲A片软件| 桃隐社区最新最快地址| 99视频久久精品久久| 好大好爽好深舒服死了| 日本特黄网站| 99国产这里只有精品视频| 国产在线精品视频免费观看| 日韩欧美一级| 99久久久无码国产精品免费人妻| 精品无码国产污污污免费网站2| 午夜神器18以下不能进免费| WWW国产色情在线观看APP|