A. 用iar新建工程編譯選項設置
主要是沒有把包含的路徑加進工程,可以這樣操作: 1.打開工程,在工程名上右鍵,選擇「Options。。。。」項; 2. 選擇「C/C++ Compiler」菜單; 3. 在右邊的選項中選擇「Preprocessor」; 4. 在「Additional include directories:」下面查看路徑。 把你...
B. IAR 編譯怎麼產生HEX文件,目前產生的是d51
打開工程,依次Project->Options->Output Converter,在這個界面勾選 Generate additional output,下拉框選擇Intel extended,勾選 Override default,再輸入你需要的hex文件名,點擊OK就好了。最後重新編譯一下工程,你就能在你工程文件(.eww)的\Debug\Exe中找到生成的hex文件了。
C. IAR中的問題解決方法求解
IAR中的問題解決方法求解
很顯然你沒有使能寄存器的位定義。方法如下:Project ——> Option ——> General Options ——> System(如下圖所示),勾選
Enable bit definitions in I/O-Include files即可
2.MCU型號選擇
如果和我一樣都次都是以空工程創建的話,不過忘了第一步先進Project ——> Option ——> General Options ——> Target選擇所使用的MCU型號,不然編譯免不了要報錯,如下圖所示。
3. 堆棧大小
今天下午編譯一個程序,0錯誤0警告,挺好,可一運行就跑飛,根本不能正常運行。
其實是我沒有正常設置堆棧大小導致的這種問題,尤其是在寫大工程時,這種錯誤出現的概率很高。GCC和IAR分配堆棧的方式不同,IAR先分配堆棧空間,相當於定義一個全局數組為堆棧空間,堆棧初始為堆棧空間最高地址;GCC不用先分配堆棧,自動把RAM剩餘空間作為堆棧空間,堆棧初始為RAM最高地址。
先編譯看看自己的程序用了多少ram,在看看總共有多少ram。
然後Project ——> Option ——> Linker ——> List選擇生成LIST文件,並包含stack選項,如下圖所示。
在./Debug/list目錄下,得到.map(可能是.lst等其他格式)文件,用記事本打開,找到以下內容:
****************************************
* *
* CALL GRAPH *
* *
****************************************
->Sub-tree of type: Interrupt function tree that does not make
: indirect calls
CSTACK
| Stack used (prev) : 00000000
01 int_T0_OV
| Stack used (prev) : 00000000
| + function block : 0000000C
......(省略N行)
01 main
| Stack used (prev) : 0000003A
| + function block : 00000000
<-Sub-tree of type: Function tree
| Stack used : 000000E2
找到最大的Stack used,我的就是000000E2,這就是用到的最大的堆棧空間,保守一點,我設置成0x100位元組,沒有超過剩餘RAM,再重新編譯,運行,模擬器沒有堆棧不足警告,程序也能正常運行了。
如下圖所示:
4. 查看匯編
相信一個優秀的單片機軟體工程師都多多少少會去看看編譯器的匯編代碼,看看有沒有什麼問題或者看看編譯器有沒有自作聰明的做些什麼
Project ——> Option ——> C/C++ complier ——> List,勾選output assembler files,編譯後則生成離線匯編代碼文件
此時在工程目錄下的Debug-->List即可看到所有參加編譯的C文件對應的匯編文件,後綴名為*.s90
5.內聯函數
inline函數傳統上只有C++支持,但IAR EW也支持在C代碼中使用inline.
#pragma inline:建議編譯器對緊隨其後的函數進行inline處理
#pragma inline = forced: 強制編譯器對緊隨其後的函數進行inline處理
復制代碼
/***************************** 錯誤描述 ******************************************/
// tft.c中定義內聯函數
#pragma inline = forced //強制inline
void TFT_Write_Colour(const RGB_COLOUR *rgb)
{
//...code....
}
// tft.h中聲明函數
void TFT_Write_Colour(const RGB_COLOUR *rgb);
// main.c中調用函數
// 編譯報錯:main中引用了未定義的外部函數TFT_Write_Colour。
/***************************** 解決辦法 ******************************************/
// tft.h中「定義函數」
#pragma inline = forced //在IAR EW430中,這里必須用強制inline;用inline可能導致編譯器忽略內聯,而定義成普通函數而出錯。
void TFT_Write_Colour(const RGB_COLOUR *rgb)
{
//...code....
}
// main.c中包含tft.h,並調用函數
// 結果:編譯正確
復制代碼
6. 如何把變數定義到flash空間
unsigned char __flash temptab[] = {1,2,3,4,5}; <br>__flash unsigned char a @ 0x8; // 定義變數存放在flash 空間0X08單元
7. 關於內存模型
AVR 微控制器的其中一個特點是它有一種存儲器訪問方法均衡了「cheap access limited to small memory areas」與「more expensive accessmethods that can access any location in memory」。
在AVR_IAR C/C++編譯器中,通過選擇某種存儲模式(memory model),可設置一些訪問方法為默認的存儲器訪問方法(default memory accessmethod)。共有三種可用的存儲模式——Tiny,Small 和Large。你的處理器選項決定了哪些模式可以使用。如果你不指定一種存儲模式,則編譯器自動設定-v0、-v1、-v2、-v3、-v5 選項下的默認方法為Tiny,-v4 和-v6 選項下的訪問方法為Small。
8. 關於生成文件格式的設置
如圖,在linker -> outpu ->other中可設置相應的輸出文件格式.
比如要生成bin格式,選擇raw-binary就可以了, 如果是要生成hex格式,那麼可以選intel-extern ,不過這個時候文件擴展名是*.a90,可以把"Override default " 打鉤,然後修改後綴名為hex就行了.
D. 求助!在IAR環境下編譯程序時總是編譯不對!
看看是不是開了另外一個窗口在debugging,如果有的話點擊stop debugging(紅色按鈕)
就好了
E. 怎樣在IAR中加入編譯所需庫的頭文件
1、首先打開電腦,然後在電腦桌面中,找到並雙擊IAR打開軟體,如圖。
F. 怎樣在IAR中加入編譯所需庫的頭文件
1、首先打開電腦,然後在電腦桌面中,找到並雙擊IAR打開軟體,如圖。
G. 關於IAR for MSP430的編譯問題,小女子先謝過了,在線等。。。
第一,連上模擬器,看設備管理器 io 里有沒有模擬器。在Workspace下面是一個帶下拉菜單的文本框,這里有系統的創建配置(build configurations),默認時系統有兩種創建(build)配置:Debug和Release。預設配置是Debug,在這種模式下,用戶可以進行模擬和調試;在Release模式下,是不能進入調試狀態的
都對看下一項
第二,打開iar,打開工作空間(工程),點左上project,打開options...,設置成下圖
第四,連接好板子供電,連接好模擬器與板子,模擬器與電腦,檢查設備管理器,io里是不是板子和模擬器都有。還有就是檢查板子上的跳帽,一般有兩個跳帽是接上就不能用模擬器,一般來講,斷開 TCK和 RTS跳線帽、RESET和 DTR跳線帽,取了才行。
H. 用iar新建工程編譯選項設置
error[cp001]:
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中。
I. IAR如何編譯生成文件
項目中有些功能需要用匯編編寫,所以想讓編譯器生成一個匯編框架,但是現在只能生成.r43和.lst文件,如何能生成.s43文件。
我的方法是這樣,寫一個同名的函數,在Project中選擇Option命令,在List頁中全選擇,但現在生不成s43文件
J. IAR編譯錯誤,請高手給看看是怎麼回事
這是說明你的代碼量超出了你預設的rom大小,一般iar編譯程序後會根據一個
xxx.xcl文件把你的代碼和數據鏈接到指定地址,iar的文件夾裡面搜搜就能搜到,"-z(code)code=romstart-romend"是說你所有的代碼都放置在以romstart為起始地址,romend為終止地址的一段連續的空間內,romstart為0x4000016c,romend為40003fff,貌似是個有16k
flash的arm。上面報錯是因為你編譯出來的code
size
是0x58b4,已經超過了這個空間,你能做的就是看看能不能縮減代碼量。