1. 程式人生 > >在keil中,彙編中呼叫c函式

在keil中,彙編中呼叫c函式

今天遇到個問題,以為是彙編中呼叫C函式的原因,其實不是這個原因,在這裡也溫習一下在ARM彙編呼叫C函式的方式。若在彙編中呼叫C檔案中的函式 void fun_c(void),只需要在呼叫之前,IMPORT fun_c ,其中 keil工具是不允許彙編語句頂格寫,不然會報錯。IMPORT 相當於C中的extern。

言歸正傳,今天遇到的問題是這樣的。

在nxp_lpcopen網站下載的例程,lwip_lpc-50a3c33.tar.gz,D:\nxp\lpcopen\lwip_lpc-1.1\lwip_lpc\nxpcommon\examples\lpc177x_8x\ea1788\ea1788_httpraw_sa\keil 執行此工程檔案,編譯無法通過,只是lwip部分程式碼,沒有lpc177x_8x的板級支援檔案,在http://www.pudn.com/downloads522/sourcecode/embedded/detail2164358.html
下載工程,在D:\nxp\lpcopen\lwip_lpc-1.1目錄下,新建資料夾LPC177X_8X,將其 BoardSupport 和 Core ,Drivers資料夾拷貝到LPC177X_8X,再一次編譯:

報錯如下:

.\__DRAM\example.axf: Error: L6218E: Undefined symbol SDRAMInit (referred from startup_ea1788.o).


終於找到原因,雖然工程中新增有了包含SDRAMInit的c檔案,但是沒有編譯,作如下修改,修改兩處程式碼即可,

#include "bsp.h"
#define _EMC  //modify by me
#ifdef __BUILD_WITH_EXAMPLE__
#include "lpc177x_8x_libcfg.h"
#else
#include "lpc177x_8x_libcfg_default.h"
#endif /* __BUILD_WITH_EXAMPLE__ */
#if 1 //(_CURR_USING_BRD == _EA_PA_BOARD)  //modify by me
#ifdef _EMC

發現在除錯過程中,#if 1  #endif 或者#if  0  #endif 很好用,在某些情況下起到註釋的作用。