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

DSP編程技巧之21---在main函數(shù)運(yùn)行之前,你需要知道的

發(fā)布時(shí)間:2014-12-3 16:55    發(fā)布者:看門(mén)狗
關(guān)鍵詞: DSP編程
作者:paradoxfx 來(lái)源:電子產(chǎn)品世界

  在一個(gè)C/C++程序能正常運(yùn)行之前,相關(guān)的C/C++運(yùn)行時(shí)(run-time)環(huán)境首先要正確建立。在CCS軟件編程的情況下,C/C++的實(shí)時(shí)運(yùn)行庫(kù)RTS的源程序庫(kù)rts.src中包含了名為boot.c或者boot.asm的啟動(dòng)程序(在一些TI的例子里,則使用了CodeStartBranch.asm來(lái)完成啟動(dòng)工作,它會(huì)自動(dòng)調(diào)用庫(kù)文件中的boot.asm),用于在系統(tǒng)啟動(dòng)后調(diào)用c_int00函數(shù),并通過(guò)其中的操作來(lái)完成運(yùn)行時(shí)環(huán)境的建立。通常情況下,c_int00函數(shù)位于rts2800.lib庫(kù)函數(shù)中的boot.obj(即TI官方編譯boot.c或者boot.asm生成的目標(biāo)文件)下,這也就是為什么我們?cè)贑28x編程的情況下通常要把rts2800.lib庫(kù)函數(shù)加入工程中的原因(其它器件則根據(jù)型號(hào)、系列添加對(duì)應(yīng)的庫(kù)文件;否則就會(huì)出現(xiàn)初學(xué)者經(jīng)常遇到的找不到boot.c之類(lèi)的錯(cuò)誤)。

  注:小型內(nèi)存模型含義是已初始化的段被鏈接至低 64Kw(字)可尋址空間內(nèi)的非易失性?xún)?nèi)存,它使用rts2800.lib。對(duì)于定點(diǎn)器件,如果使用大內(nèi)存模型(超過(guò)64K字),則需要使用庫(kù) rts2800_ml.lib;對(duì)于含有FPU的器件,用于標(biāo)準(zhǔn) C 語(yǔ)言代碼的為 rts2800_fpu32.lib,或者用于 C++ 代碼的 rts2800_fpu32_eh.lib(沒(méi)有針對(duì)浮點(diǎn)器件的較小內(nèi)存模型庫(kù))。在 CCS v5/v6 中,有一個(gè)針對(duì)庫(kù)的“自動(dòng)”設(shè)置,此設(shè)置可據(jù)項(xiàng)目的設(shè)置(例如,浮點(diǎn)支持和內(nèi)存模型選擇)讓 CCS 自動(dòng)選擇正確的庫(kù)來(lái)使用。對(duì)于 DSP/BIOS 項(xiàng)目,DSP/BIOS 將負(fù)責(zé)將所需的庫(kù)包括在內(nèi),我們用戶(hù)不需要在項(xiàng)目中包含任何運(yùn)行支持庫(kù)。

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

  .def _Reset

  .ref _c_int00

  _Reset: .vec _c_int00, USE_RETA

  則在執(zhí)行CPU復(fù)位操作之后,系統(tǒng)自動(dòng)跳轉(zhuǎn)到_c_int00函數(shù)。

  在c_int00函數(shù)中完成的功能主要有:

  1. 設(shè)置/初始化CPU的狀態(tài)和配置寄存器。

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

  3. 從初始化表中,把數(shù)據(jù)復(fù)制到.bss段中,從而初始化全局變量。如果使用了—ram_model選項(xiàng)在加載程序時(shí)就初始化變量,則在程序運(yùn)行前,會(huì)首先運(yùn)行一個(gè)加載程序來(lái)完成變量的初始化。如果使用了--rom_model選項(xiàng),則使用.cinit中的運(yùn)行時(shí)初始化表來(lái)完成變量的初始化。

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

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

  ü 在目標(biāo)文件中檢測(cè).cinit段的存在;

  ü 在.cinit段的開(kāi)頭配置STYP_COPY位,使得該段不會(huì)被自動(dòng)復(fù)制到內(nèi)存中;

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

  這三個(gè)注意點(diǎn)貌似比較復(fù)雜,不過(guò)有讀者可能會(huì)問(wèn),我們?cè)谥苯影殉绦蛲ㄟ^(guò)JTAG下載到DSP的RAM中并運(yùn)行的時(shí)候,貌似并沒(méi)有配置這么麻煩的步驟啊?那是因?yàn)镃CS編程環(huán)境已經(jīng)幫我們承擔(dān)了這一重要任務(wù),在我們用仿真器來(lái)調(diào)試、運(yùn)行的時(shí)候經(jīng)常會(huì)使用到這個(gè)方式。

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

  而在C28x DSP的編程中,如果一個(gè)全局變量的初值并不會(huì)對(duì)程序的運(yùn)行結(jié)果產(chǎn)生任何影響,則我們一般不用考慮給它們賦初值,因?yàn)榫幾g器會(huì)使用.cinit段中的初始化表格來(lái)初始化變量,叫做自動(dòng)初始化autoinitialization,其示意圖為:



  在使用了--ram_model或者--rom_mode選項(xiàng)的情況下,鏈接器在把所有C/C++模塊中的相關(guān)變量初始化的內(nèi)容鏈接入.cinit段之后,會(huì)自動(dòng)在其末尾加入null關(guān)鍵字,來(lái)標(biāo)明初始化表格的末尾。

  4.調(diào)用.pinit中的所有的全局構(gòu)造函數(shù)。

  .pinit段中的內(nèi)容相對(duì)簡(jiǎn)單,它主要包含了構(gòu)造的地址列表。在.cinit初始化完成之后,構(gòu)造函數(shù)的地址就出現(xiàn)在構(gòu)造函數(shù)地址列表中了。

  在使用了--ram_model或者--rom_mode選項(xiàng)的情況下,鏈接器在把所有C/C++模塊中的構(gòu)造函數(shù)的地址鏈接入.pinit段之后,會(huì)自動(dòng)在其末尾加入null關(guān)鍵字,來(lái)標(biāo)明構(gòu)造函數(shù)地址的結(jié)束。

  與.cinit段不同的時(shí),不管使用--ram_model還是--rom_mode選項(xiàng),.pinit段都會(huì)在運(yùn)行時(shí)被加載和處理。

  5.調(diào)用main()函數(shù),執(zhí)行我們的程序。

  6.在main()函數(shù)返回時(shí),調(diào)用exit函數(shù)。

  根據(jù)需要,我們可以自定義啟動(dòng)函數(shù),但是一定要保證我們的自定義函數(shù)能夠正確完成以上的步驟以建立C/C++的實(shí)時(shí)運(yùn)行庫(kù)環(huán)境,否則我們的程序?qū)o(wú)法正常運(yùn)行,甚至根本無(wú)法運(yùn)行。
本文地址:http://m.qingdxww.cn/thread-134638-1-1.html     【打印本頁(yè)】

本站部分文章為轉(zhuǎn)載或網(wǎng)友發(fā)布,目的在于傳遞和分享信息,并不代表本網(wǎng)贊同其觀點(diǎn)和對(duì)其真實(shí)性負(fù)責(zé);文章版權(quán)歸原作者及原出處所有,如涉及作品內(nèi)容、版權(quán)和其它問(wèn)題,我們將根據(jù)著作權(quán)人的要求,第一時(shí)間更正或刪除。
您需要登錄后才可以發(fā)表評(píng)論 登錄 | 立即注冊(cè)

廠商推薦

  • Microchip視頻專(zhuān)區(qū)
  • 使用SAM-IoT Wx v2開(kāi)發(fā)板演示AWS IoT Core應(yīng)用程序
  • 使用Harmony3加速TCP/IP應(yīng)用的開(kāi)發(fā)培訓(xùn)教程
  • 集成高級(jí)模擬外設(shè)的PIC18F-Q71家族介紹培訓(xùn)教程
  • 探索PIC16F13145 MCU系列——快速概覽
  • 貿(mào)澤電子(Mouser)專(zhuān)區(qū)
關(guān)于我們  -  服務(wù)條款  -  使用指南  -  站點(diǎn)地圖  -  友情鏈接  -  聯(lián)系我們
電子工程網(wǎng) © 版權(quán)所有   京ICP備16069177號(hào) | 京公網(wǎng)安備11010502021702
快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 特及毛片| 日本色一区 | 久久精品免费一区二区视 | 亚洲动漫第一页 | 亚洲国产欧美国产第一区二区三区 | 黄色免费网站在线播放 | 99视频在线免费 | 国产欧美日韩不卡在线播放在线 | 99在线观看精品免费99 | 亚洲黄色高清视频 | 国产一级毛片免 | 欧美a在线观看 | 日产精品卡二卡三卡四卡乱码视频 | 成人黄色免费在线观看 | 精品香蕉视频 | 午夜精品久久久久久久四虎 | 正在播放亚洲一区 | 99在线视频精品费观看视 | 一级黄色毛片视频 | 久久99国产综合精品 | 亚洲国产三级在线观看 | 日本不卡一区 | 欧美一区二区在线播放 | 国产精选自拍 | 日本精品一区二区在线播放 | 国产欧美在线观看一区二区 | 欧美男女网站 | 国产中文字幕亚洲 | 非洲精品性hd | 日本高清不卡在线观看 | 欧美久久超级碰碰碰二区三区 | 国产欧美日韩综合精品无毒 | 亚洲毛片在线免费观看 | 亚洲精品播放 | 日本伊人精品一区二区三区 | 国产a不卡 | 欧美在线91 | 成人国产三级精品 | 2021国内精品久久久久久影院 | 91avav| 青青国产在线视频 |