国产毛片a精品毛-国产毛片黄片-国产毛片久久国产-国产毛片久久精品-青娱乐极品在线-青娱乐精品

DSP編程技巧之21---在main函數運行之前,你需要知道的

發布時間:2014-12-3 16:55    發布者:看門狗
關鍵詞: DSP編程
作者:paradoxfx 來源:電子產品世界

  在一個C/C++程序能正常運行之前,相關的C/C++運行時(run-time)環境首先要正確建立。在CCS軟件編程的情況下,C/C++的實時運行庫RTS的源程序庫rts.src中包含了名為boot.c或者boot.asm的啟動程序(在一些TI的例子里,則使用了CodeStartBranch.asm來完成啟動工作,它會自動調用庫文件中的boot.asm),用于在系統啟動后調用c_int00函數,并通過其中的操作來完成運行時環境的建立。通常情況下,c_int00函數位于rts2800.lib庫函數中的boot.obj(即TI官方編譯boot.c或者boot.asm生成的目標文件)下,這也就是為什么我們在C28x編程的情況下通常要把rts2800.lib庫函數加入工程中的原因(其它器件則根據型號、系列添加對應的庫文件;否則就會出現初學者經常遇到的找不到boot.c之類的錯誤)。

  注:小型內存模型含義是已初始化的段被鏈接至低 64Kw(字)可尋址空間內的非易失性內存,它使用rts2800.lib。對于定點器件,如果使用大內存模型(超過64K字),則需要使用庫 rts2800_ml.lib;對于含有FPU的器件,用于標準 C 語言代碼的為 rts2800_fpu32.lib,或者用于 C++ 代碼的 rts2800_fpu32_eh.lib(沒有針對浮點器件的較小內存模型庫)。在 CCS v5/v6 中,有一個針對庫的“自動”設置,此設置可據項目的設置(例如,浮點支持和內存模型選擇)讓 CCS 自動選擇正確的庫來使用。對于 DSP/BIOS 項目,DSP/BIOS 將負責將所需的庫包括在內,我們用戶不需要在項目中包含任何運行支持庫。

  如果在鏈接器選項中我們使用了--ram_model或者--rom_mode,則_c_int00函數自動被配置為整個程序執行的入口點。此外,在CPU復位之后(相當于一個軟件或者硬件的復位中斷),我們也可以把整個程序的入口點指向_c_int00,例如:

  .def _Reset

  .ref _c_int00

  _Reset: .vec _c_int00, USE_RETA

  則在執行CPU復位操作之后,系統自動跳轉到_c_int00函數。

  在c_int00函數中完成的功能主要有:

  1. 設置/初始化CPU的狀態和配置寄存器。

  2. 為系統的棧定義一個.stack段,然后建立并初始化棧的指針。其中,棧需要被分配在單一的、連續的一段地址中,起始點為低地址,終點為高地址,棧指針SP的初始化值指向棧的頂端。

  3. 從初始化表中,把數據復制到.bss段中,從而初始化全局變量。如果使用了—ram_model選項在加載程序時就初始化變量,則在程序運行前,會首先運行一個加載程序來完成變量的初始化。如果使用了--rom_model選項,則使用.cinit中的運行時初始化表來完成變量的初始化。

  默認情況下,鏈接器使用--rom_model選項,在程序運行時完成變量的自動初始化。在程序運行時,.cinit段和其它初始化的段會被一起加載到內存中,從而使得C/C++的啟動程序可以自動把.cinit中的初始化表格復制到.bss段中,完成全局變量的自動初始化。這種方法的特點在于,初始化的表格可以被存放在更加便宜且大容量的ROM或者FLASH,而不是RAM中,并且可以在程序啟動時再自動加載到RAM中,這種方法在我們把程序燒寫到FLASH中再運行的時候是經常使用的。關于Flash運行的更多信息,可以參考TI的的一個應用報告:http://www.ti.com.cn/cn/lit/an/zhca550l/zhca550l.pdf,從 TMS320F28xxx 數字信號處理器 (DSP) 上的內部閃存存儲器上運行一個應用。

  如果使用—ram_model的鏈接器選項,則鏈接器會在.cinit段的開頭中配置STYP_COPY位(0010h),告訴加載器不要把.cinit段自動加載到內存中,并且把cinit這個符號設置為-1(默認情況下符號cinit指向初始化表格),從而向啟動程序表明,內存中沒有初始化表格,在啟動時不需要執行運行時的初始化工作。在這種情況下,需要我們自定義一個加載程序,從而在加載程序時就完成初始化,它的主要內容包括:

  ü 在目標文件中檢測.cinit段的存在;

  ü 在.cinit段的開頭配置STYP_COPY位,使得該段不會被自動復制到內存中;

  ü 需要我們理解并正確遵循初始化表格的格式。

  這三個注意點貌似比較復雜,不過有讀者可能會問,我們在直接把程序通過JTAG下載到DSP的RAM中并運行的時候,貌似并沒有配置這么麻煩的步驟啊?那是因為CCS編程環境已經幫我們承擔了這一重要任務,在我們用仿真器來調試、運行的時候經常會使用到這個方式。

  注意:在C/C++程序運行之前,一些全局變量必須被賦予初始值。在ANSI/ISO C中,未明確初始化的全局和靜態變量在程序執行前都需要被初始化為0,C/C++的編譯器并不會對它們進行自動初始化。在把程序加載到RAM而不是ROM中的情況下,比較方便的方法是直接把.bss段初始化為0。

  而在C28x DSP的編程中,如果一個全局變量的初值并不會對程序的運行結果產生任何影響,則我們一般不用考慮給它們賦初值,因為編譯器會使用.cinit段中的初始化表格來初始化變量,叫做自動初始化autoinitialization,其示意圖為:



  在使用了--ram_model或者--rom_mode選項的情況下,鏈接器在把所有C/C++模塊中的相關變量初始化的內容鏈接入.cinit段之后,會自動在其末尾加入null關鍵字,來標明初始化表格的末尾。

  4.調用.pinit中的所有的全局構造函數。

  .pinit段中的內容相對簡單,它主要包含了構造的地址列表。在.cinit初始化完成之后,構造函數的地址就出現在構造函數地址列表中了。

  在使用了--ram_model或者--rom_mode選項的情況下,鏈接器在把所有C/C++模塊中的構造函數的地址鏈接入.pinit段之后,會自動在其末尾加入null關鍵字,來標明構造函數地址的結束。

  與.cinit段不同的時,不管使用--ram_model還是--rom_mode選項,.pinit段都會在運行時被加載和處理。

  5.調用main()函數,執行我們的程序。

  6.在main()函數返回時,調用exit函數。

  根據需要,我們可以自定義啟動函數,但是一定要保證我們的自定義函數能夠正確完成以上的步驟以建立C/C++的實時運行庫環境,否則我們的程序將無法正常運行,甚至根本無法運行。
本文地址:http://m.qingdxww.cn/thread-134638-1-1.html     【打印本頁】

本站部分文章為轉載或網友發布,目的在于傳遞和分享信息,并不代表本網贊同其觀點和對其真實性負責;文章版權歸原作者及原出處所有,如涉及作品內容、版權和其它問題,我們將根據著作權人的要求,第一時間更正或刪除。
您需要登錄后才可以發表評論 登錄 | 立即注冊

廠商推薦

  • Microchip視頻專區
  • 利用SAM E54 Xplained Pro評估工具包演示CAN轉USB橋接器以及基于CAN的主機和自舉程序應用程序
  • 使用SAM-IoT Wx v2開發板演示AWS IoT Core應用程序
  • 使用Harmony3加速TCP/IP應用的開發培訓教程
  • 集成高級模擬外設的PIC18F-Q71家族介紹培訓教程
  • 貿澤電子(Mouser)專區
關于我們  -  服務條款  -  使用指南  -  站點地圖  -  友情鏈接  -  聯系我們
電子工程網 © 版權所有   京ICP備16069177號 | 京公網安備11010502021702
快速回復 返回頂部 返回列表
主站蜘蛛池模板: 男女污视频在线观看 | 久久亚洲国产午夜精品理论片 | 敢死队4完整版在线观看 | 国产日韩欧美亚洲 | 婷婷激情久久 | 日韩高清一区二区三区五区七区 | 岛国视频在线免费观看 | mm视频在线观看 | 国产香蕉久久精品综合网 | 伊人热热久久原色播放www | 亚洲欧美日韩在线一区二区三区 | 91精品国产高清久久久久久 | 亚洲男人的天堂网站 | 青青青视频蜜桃一区二区 | 一级播放| 欧美草逼视频 | 日本特黄在线观看免费 | 色花堂中文字幕98堂网址 | 第三人称复仇韩剧在线观看免费 | 久久国产精品ww | 国产欧美在线观看一区二区 | 国产99久久久国产精品小说 | 伊人骚| 欧美理论片手机在线观看片免费 | 国产一级特黄aaa大片 | 狼久久 | a级日韩乱理伦片在线观看 a级片免费在线播放 | 精品欧美高清不卡在线 | 青青在线观看视频 | 亚洲激情 | 青青草国产精品人人爱99 | 91免费看片 | 日本一区二区不卡在线 | 国产成人精品高清免费 | 国产a毛片清高视频 | 殴美aⅴ | 日日插天天干 | 久久国产精品免费 | 日韩成人免费视频播放 | 91免费国产高清观看 | 精品欧美一区二区三区免费观看 |