注冊(cè)會(huì)員 登錄
機(jī)械社區(qū) 返回首頁(yè)

jili1986729的個(gè)人空間 http://www.mg7058.com/?88345 [收藏] [復(fù)制] [RSS]

日志

在IAR環(huán)境下調(diào)試CC2510二疑惑(王佰營(yíng) 王鐵虎)

已有 1164 次閱讀2010-2-13 16:35 |個(gè)人分類:無(wú)線單片機(jī)|

IAR是指瑞典IAR公司推出的IAR Embedded Workbench軟件;IAR EW是一個(gè)能夠支持多種微處理器開(kāi)發(fā)的集成開(kāi)發(fā)環(huán)境,針對(duì)用戶特定的目標(biāo)系統(tǒng),用創(chuàng)建項(xiàng)目的方式來(lái)進(jìn)行管理和開(kāi)發(fā),其項(xiàng)目管理功能強(qiáng)大,用戶只要?jiǎng)?chuàng)建一個(gè)工作區(qū)(Workspace),就可以在其中開(kāi)發(fā)一個(gè)或多個(gè)項(xiàng)目。

 

      在使用IAR調(diào)試CC2510過(guò)程中遇到了兩個(gè)問(wèn)題:

   

一、總出現(xiàn)無(wú)法編譯錯(cuò)誤

提示:Fatal Error[Pe005]: could not open source file "string.h"

提示有嚴(yán)重問(wèn)題:無(wú)法打開(kāi)string.h文件!

Windows搜索功能搜索到string.h文件,并且拷到項(xiàng)目文件夾內(nèi),還是不行。初步判斷IAR的編譯程序找不到string.h文件,說(shuō)明路徑是不對(duì)。按“ALT+F7”進(jìn)入“Options for node,點(diǎn)左邊的“C/C++ Compiler,再點(diǎn)右邊的標(biāo)簽“Preprocessor”如下圖:

問(wèn)題就出在這里:在Include paths框內(nèi)包含文件的路徑設(shè)置不對(duì):

$TOOLKIT_DIR$\INC\

該句話就是指定包含文件的路徑;

其中“$TOOLKIT_DIR$ ” 的意思是:包含文件的路徑在IAR安裝路徑的8051文件夾下,對(duì)于我的電腦IAR安裝在C盤(pán),那么具體就表示它就表示:

$TOOLKIT_DIR$相當(dāng)于:

C:\Program Files\IAR Systems\Embedded Workbench 4.05 Evaluation version\8051

$TOOLKIT_DIR$\INC\相當(dāng)于:

C:\Program Files\IAR Systems\Embedded Workbench 4.05 Evaluation version\8051\INC\

可是在INC目錄下找不到string.h文件,這就是問(wèn)題所在。在INC目錄下又有兩個(gè)文件夾:CLIBDLIB,而string.h文件在CLIB文件夾內(nèi);將Include paths框內(nèi)改為:$TOOLKIT_DIR$\INC\CLIB\;編譯又出現(xiàn)錯(cuò)誤提示:

Fatal Error[Pe005]: could not open source file "iocc2510.h"

Include paths框內(nèi)改為:

$TOOLKIT_DIR$\INC\

$TOOLKIT_DIR$\INC\CLIB\

              編譯正常!

另外,$PROJ_DIR$的意思是包含文件指向工程目錄的上一級(jí)目錄中,例如:我們的工程文件為:D: \DESIGN\WIRELESS\CC2510; 那么$PROJ_DIR$就表示:D: \DESIGN\WIRELESS\;了解這些,我們就可靈活配置。

 

二、指令總是判斷錯(cuò)誤

看以下程序:

#include <ioCC2510.h>

 

#define uint unsigned int

#define uchar unsigned char

 

#define led1   P1_0                  //控制紅LED

#define led2   P1_1                  //控制綠LED

 uint TempFlag;               //用來(lái)標(biāo)志是否要閃爍

 

/***************************

//主函數(shù)

***************************/

void main()

{

       // uint TempFlag;                        //AA

       while(1) 

       {

               TempFlag = 5;                   //A

               if(5 == TempFlag)              //B

              {

                     led1 = !led1;                 //C

                     TempFlag = 0;

                     Delay(600);

                }

                else

                {

                     Led2 = !led2;                //D

Delay(600);

   }

         }

  }

  

看以上程序,盡管有A句-- TempFlag = 5,但是B句--if(5 == TempFlag) 判斷總是不成立,C句總不執(zhí)行;將A句--TempFlag = 5改了好多數(shù)字都沒(méi)有改觀。若將變量TempFlag定義在AA句處,改為局部變量就正常了;但是其他地方也要用變量TempFlag,所以這樣改不行;查看匯編程序,發(fā)現(xiàn)if(5 == TempFlag)語(yǔ)句對(duì)應(yīng)的匯編指令用MOVX,也就是變量TempFlag被定義在了外部RAM;可線路板上并未擴(kuò)展外部RAM;那么TempFlag的數(shù)據(jù)很可能是0XFF,將A句改為:TempFlag = 0xff,C句就可執(zhí)行了?赡苁IAR設(shè)置不合適:按“ALT+F7”進(jìn)入“Options for node,點(diǎn)左邊的“General Options,再點(diǎn)右邊的標(biāo)簽“Target,如下圖:

              可見(jiàn):Data model欄設(shè)置不對(duì),改為:small就正常了。  wbymcs51.blog.bokee.net

  

       通過(guò)以上兩例,我們可以看出,IAR的環(huán)境設(shè)置比較重要。在使用IAR或KEIL C時(shí),不能僅僅按有些簡(jiǎn)單的說(shuō)明步驟去做,一定要清楚每個(gè)設(shè)置是在做什么,為什么要這樣做,才會(huì)心中有數(shù)。我們覺(jué)得徐愛(ài)鈞老師的兩本書(shū)講的比較詳細(xì):《單片機(jī)高級(jí)語(yǔ)言C51 Windows 環(huán)境編程與應(yīng)用 》和《IAR EWARM嵌入式系統(tǒng)編程與實(shí)踐 》,講到了編譯、匯編和連接的相關(guān)命令。其實(shí),以上界面的每個(gè)設(shè)置都對(duì)應(yīng)增減一條命令代碼或在某個(gè)命令中增減一個(gè)參數(shù)項(xiàng),通過(guò)界面設(shè)置和命令代碼對(duì)比,就會(huì)知其然,更知其所以然。


路過(guò)

雷人

握手

鮮花

雞蛋

評(píng)論 (0 個(gè)評(píng)論)

小黑屋|手機(jī)版|Archiver|機(jī)械社區(qū) ( 京ICP備10217105號(hào)-1,京ICP證050210號(hào),浙公網(wǎng)安備33038202004372號(hào) )

GMT+8, 2024-9-22 09:48 , Processed in 0.028390 second(s), 16 queries , Gzip On.

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

返回頂部