① IAR的c文件窗口 f()不顯示函數怎麼解決
沒有顯示說明當前文件的函數並未在任何地方使用,編譯器優化後直接去掉了此部分代碼的編譯。而且這段沒有被編譯進去的代碼,在模擬的時候,連斷點都沒法打上去。
你檢查下代碼,結構,編譯條件等,想辦法去掉選擇方面的限制。
② 編譯已通過,為什麼無法找到函數定義
你把大括弧的位置放錯了,sushu函數被定義在了main函數裡面,但是按照C語言的規定,函數不允許嵌套定義,所以你的sushu相當於沒有定義(不知為何你的編譯器沒有報錯說不允許在函數內定義函數)。解決方法是把你最後面多出來的大括弧移到main函數最後面。
③ IAR7.2 怎麼不能跳轉到函數的定義
但你使用跳轉命令的時候橘段,在界面下方可能會彈出來讓你選腔伍信擇跳轉到哪裡去,因為軟體可能在幾個地方能找到同名函數,所以要你選擇。
要是沒有出現讓你選擇的信息,可能的原因:
函數太近,就在當前頁面,所以沒動。
函數沒在任何地方使用,編譯的時候編譯把這段代碼給優化去掉了,所以伍輪你找不到。
函數使用了指針的形勢,而非直接調用,或者使用的宏定義形勢。
④ IAR中如何設直接查找函數、變數的定義
你選中一個函數名在上面點右鍵發歷猛局現「Gotodefinitionof……」是灰色的,無法找到函數的定義處。但是,IAR是支持快速查找變數、類型、函數甚至是宏定義功能的。設置方法如下: 1、打開肢讓工程,在菜單欄的【TOOLS】項下,選擇【options...】 2、彈出的IDE options對話框中選擇Project選項卡,勾選「Generatebrowseinformation" 3、設置完點擊【確定】即可生效。 這時再來查找函數的定義,查找時先將鼠知數標在函數名上雙擊,定位游標到函數名字串,再右鍵彈出快捷菜單。發現原先灰色的「Gotodefinitionofuart0Send」選項已經可選了。
⑤ gcc編譯文件時找不到指定函數怎麼辦
通常找不到指定函數不是因為編譯參數問題。而是你 g.cpp 中在include f.h的時候沒有使用: extern "C" { #include"f.h" } 因為C語言和cpp的編譯過程中的函數名稱修飾規則是不一樣的。當cpp引用C庫的時候必須告訴編譯器,哪些函數是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就行了.
⑦ 如何解決IAR編譯錯誤,Error[Li005]: no definition for
在uart.h中定義了一個結構體類型。
struct SERIREC{
unsigned charflag;
unsigned charCrc8_Code;
unsignedCrc16_Code;
unsigned charusedmes[7];
unsigned chari;
};
extern struct SERIREC PC ; //然後再這里聲明它。
在uart.c中定義PC這個結構體的實體。。
struct SERIREC PC ; // 不定義這個,就會報 no definition
編譯鏈接錯誤(語法錯誤):編譯鏈接錯誤又分成編譯錯和鏈接錯。
編譯錯就是普通意義上的語法錯,編譯器進行語法檢查不通過,也就是程序違背了計算機語言的語法,例如:括弧不匹配、變數名拼寫錯誤、用保留字定義變數名等;
鏈接錯是指程序通過了語法檢查,但是無法生成可執行文件,最常見的是鏈接找不到lib庫。初學者有時寫了函數的聲明,但是缺少函數的定義,此時就會出現鏈接錯。