IAR編譯常見錯誤。
首先,申明這下面是轉的。
Error[Cp001]: Copy protection check, No valid license found for this prod t [20]
原因:安裝的時候沒有把註冊機的0x.....字串的小寫字母改為大寫字母。
Warning[Pe001]: last line of file ends without a newline F:\emoTion\IAR\PK 升級\CC1110-8\main.c
原因:在使用IAR時常常會彈出類似這樣一個警告,其實只要在最後一行多加一個回車就不會再有這個警告了.
Error[e72]: Segment BANK_RELAYS must be defined in a segment definition option (-Z, -b or -P)
原因:這是用730B編譯的錯誤,可能是由於相對於目標工程版本過高的,後改用720H,沒有發生錯誤。
Error[Pe005]: could not open source file "stdio.h"
原因:標頭檔案路徑不對造成,改正的方法是在設定選項卡的C/C++ Compiler -> Preprocessor選項裡,將$TOOLKIT_DIR$\INC\CLIB\添到Incl? paths中。
Error[Pe005]:
could not open source file "hal.h" C:\Users\user\Desktop\例子程式\無線通訊綜合測試\Library\cc2430\HAL\source\setTimer34Period.c
原因:先檢查C:\Users\user\Desktop\例子程式\無線通訊綜合測試\Library\cc2430\HAL\source\有無setTimer34Period.c這個檔案,若有,則是因為IAR對中文路徑支援不好的緣故,把這個工程複製到英文路徑下編譯就不會發生錯誤。
Error[e16]: Segment CODE_C (size: 0x1869 align: 0) is too long for segment definition. At least 0x1259 more bytes needed.
原因:CODE不夠了,在xcl檔案中修改其大小,0x28FF+0x1259=0x3B58
Error[e16]: Segment XDATA_Z (size: 0x1ea7 align: 0) is too long for segment definition. At least 0x2a7 more bytes
原因:在xcl檔案裡修改段大小,-D_IXDATA_END=0xFD53 // Revison D (this setting is safe for all revisions)還有可能是定義的大陣列太多了,有時候某些函式中定義的陣列有點大,在主函式中單獨測試這個函式時不會報錯
Error[e16]: Segment CSTACK (size: 0x50 align: 0x1) is too long for segment definition. At least 0x50 more bytes needed. The problem occurred while processing the segment placement command "-Z(DATA)CSTACK+_STACK_SIZE#",
原因:此錯誤是所定義的全域性變數和陣列緩衝區等所佔的RAM超出硬體支援所致,size: 0x50 為超出的大小。只要減少不要的全域性變數和儘量縮小陣列緩衝區就可以了!
Error[e46]: Undefined external "OnBoard_SendPhoto::?relay" referred in hal_key ( C:\Texas Instruments\ZStack-1.4.3-1.2.1\Projects\zstack\Samples\SimpleApp\CC2430DB\SimpleControllerEB\Obj\hal_key.r51 )
原因:只有沒有找到該函式的定義OnBoard_SendPhoto(),只有宣告和使用。一般在連結時發生此錯誤。
Error[e89]:Too m h object code prod ed(more than 0x1000 bytes)for this package
原因:4K限制版,請使用非限制版的。
IAR常見錯誤請先從以下幾個方面入手:
1、 序列號是否正確。
2、 使用版本是否正確,應該使用7.30B開啟的工程檔案不能用7.20H開啟。
3、 儘量不要使用中文路徑。
4、 Zigbee協議棧資料夾需要放在IAR安裝盤根目錄下。
5、 請確定當前編譯資料夾是否有讀寫許可權。
6、 使用的版本是否為限制版。
下面是我自己的補充(不斷更新哦)
1. Error[e16]: Segment CODE (size: 0xffe align: 0x1) is too long for segment definition. At least 0x4a more bytes needed. The problem occurred while processing the segment placement command "-Z(CODE)CODE=_..X_FLASH_BASE-_..X_FLASH_END", where at the moment of placement the available memory ranges were "CODE:4b-fff"
Reserved ranges relevant to this placement:
CODE:34-44 NEAR_F
CODE:45-4a INITTAB
CODE:4b-fff CODE
這個我的修改是 project options---->C/C++ Compiler----->Optimizations(最優化)----->size----->High(maximum optimization)
也就是,將程式碼最大限度的優化,以節省空間。
2. configuration is up-to-data.
在新建工程時,新增程式檔案,需注意,必須新增有效的.c或者彙編檔案。
嘿嘿,筆者新建工程時,儲存的.c檔案經常忘記加字尾,新增進入工程時,系統無法識別,這種低階錯誤寫出來是自己提醒自己的。
3. Warning[Pe069]: integer conversion resulted in truncation 程式如下:
#define SEG_A ~0x04
#define SEG_B ~0x01
#define SEG_C ~0x40
#define SEG_D ~0x10
#define SEG_E ~0x08
#define SEG_F ~0x02
#define SEG_G ~0x80
#define SEG_H ~0x20
SEG_A&SEG_B&SEG_G&SEG_D&SEG_E, //2
原因:後來將SEG_A到SEG_H的值求出來之後,eg,~0x04改為0xFB.問題就解決,因該是以陣列中計算量過複雜。