簡體   English   中英

如何從IAR EWARM中的內聯匯編程序調用另一個模塊中的C函數?

[英]How do I call a C function in another module from inline assembler in IAR EWARM?

我在一個硬故障處理程序中有一些程序集。 該程序集基本上是指將當前堆棧指針作為參數傳遞(在R0中)。 它看起來像......

__asm("    mov     r0, sp\n"
  "    bl      SavePC\n"
  "    bx      lr");

當SavePC在同一個c文件中時,這很好用。 但是,當SavePC放在另一個c文件中時,我沒有運氣。 我試過像這樣導入函數......

__asm("IMPORT SavePC\n"
" mov r0, sp\n"
" bl SavePC\n"
" bx lr");

......但我必須做錯事。 編譯器報告以下內容......

Error[Og005]: Unknown symbol in inline assembly: "IMPORT" 
Error[Og005]: Unknown symbol in inline assembly: "SavePC" 
Error[Og006]: Syntax error in inline assembly: "Error[54]: Expression can not be forward"
Error[Og005]: Unknown symbol in inline assembly: "SavePC" 
Error while running C/C++ Compiler 

包含程序集的c文件包含帶有SavePC原型的頭文件...

extern void SavePC(unsigned long);

建議?

即使呼叫正確,您的代碼也無法正常工作。

bl _SavePC
bx lr

您認為bx lr指令中LR寄存器的值是什么? 指令本身的地址! bl指令把它放在那里。 這實際上是一段while (1); 用bx指令。

嵌套函數調用看起來更像這樣:

push lr
bl _SavePC
pop pc

要獲得堆棧寄存器,請使用相應的CMSIS函數:

  • 主堆棧指針(MSP)的__get_MSP()
  • 進程堆棧指針(PSP)的__get_PSP()

使用extern是一個壞習慣,因為它容易出錯。 C-99標准為extern提供了一種安全的替代方案。 您應該在頭文件中編寫函數原型而不使用extern關鍵字。 然后在兩個C文件中包含頭文件。 然后,鏈接器負責鏈接不同文件中的函數。

例:

文件:custom_header.h

void SavePC(unsigned long);

文件:source_c_file.c

#include "custom_header.h"

void SavePC(unsigned long)
{
      ....
      ....

      ....

}

文件:user_c_file.c

#include "custom_header.h"

void someFunction(void)
{
.
.
.

__asm("    mov     r0, sp\n"
  "    bl      SavePC\n"
  "    bx      lr");

.
.
.
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM