2013-03-12 50 views
1

我有一個大型的ASM項目,用於PIC24芯片。 (具體的芯片是PIC24FJ256GB210)MpLab,ASM,C,Building爲了同時兼容

我現在有一些其他的例程C.

我想這些整合到我的項目。

C例程位於5個左右文件的項目中,其中一個包含int main(void)語句作爲起點。這是爲了測試它們並給予我們工作的信心。我們現在準備移動這些代碼並將其整合到更大的現有系統中。

彙編語言的東西從__reset:指令開始。

如何安排項目和構建選項,以便我可以做這三件事?

  • 保持先從我__reset指令
  • (或者至少確保我現有__resetint main(void)至少相互配合)
  • 從ASM代碼
  • 使用呼叫他的套路與C代碼設置相同的數據緩衝區

有趣的是,Microchip的用戶論壇和示例代碼部分似乎錯過了這個想法(或者,很可能,我還沒有想出如何找到它們)。

我認爲這個問題已經被問了很多,我希望我沒有複製上一個問題,但是我沒有在這裏看到它,也沒有在MicroChip的網站上看到它。歡迎有關此主題的有用網站鏈接。

如果我只是需要學習如何更好地搜索此網站和其他網站,那麼這將是一個有用且可行的答案。再次,希望我不要問一個重複的問題。

回答

2

我建議您閱讀DS51284H(「用於PIC24 MCU和dsPIC®DSC的MPLAB®C編譯器用戶指南」)(PDF)。

特別參見第4.4節啓動和初始化

「二C運行時啓動模塊被包括在libpic30.a歸檔/庫。該 入口點都啓動模塊是__reset。鏈接器腳本在程序存儲器中,其在 設備復位將控制轉移構建GOTO __reset指令在位置0
....
5.功能主要被稱爲不帶參數。」。

您的__reset標籤和CRT中的一個(C運行時)似乎會發生衝突。如果您有CRT的來源,您可以通過將CRT中的__reset標籤重命名爲其他內容,以便始終首先調用您自己的__reset
另一點是,它聽起來像你想要一個獨立的程序,並從你自己的程序中使用它作爲圖書館。由於獨立程序通常被設計爲執行一個或多個特定任務,並且一旦該任務完成就退出,因此您可能需要重構一下C代碼,以使其更加靈活(比如擺脫main()函數並可能替換它具有某種init()函數)。


和第4.11節功能呼叫約定

「前八個工作寄存器(W0-W7)用於函數參數。參數】 分配到寄存器中左到右的順序,且參數被分配給第一個 可用寄存器中
....
函數返回值在W0中爲8位或16位標量返回,W1:W0爲32位 標量,W3:W2:W1:W0爲64位標量「。

+0

謝謝。這是指向正確的方向。你能編輯你的迴應來擴大縮寫「CRT」嗎?我剛剛搜索了您指定的縮寫「CRT」的PDF手冊(謝謝),並沒有立即以我對此明顯的方式進行解釋。如果我可以弄清楚,我可以重寫C程序來讓'int main(void)'成爲「nothing」例程(即'{}'或其他),然後使用其他C函數作爲「庫「? (因爲我認爲它們通常被命名爲) – 2013-03-12 18:19:09

+1

CRT == C運行時。補充說明了答案。 – Michael 2013-03-12 18:22:10

+0

謝謝。尋找這一點,無法弄清楚什麼時候或在哪裏完成。我可以編寫一個沒有函數'int main(void)'的C程序嗎?我認爲這是一個要求;或曾經在一次。 – 2013-03-12 18:25:11

0

邁克爾給了你一個很好的答案。我想補充的唯一的事情就是你應該用C語言編寫項目,並在其中刪除彙編函數。

這樣你就可以保持速度和功能的asm代碼,並且可以在C中保存項目,這很容易。

將C代碼轉換爲彙編代碼並使用較大的彙編代碼進行彙編代碼是不符合您的興趣的,反之亦然。

一旦你閱讀文檔,你會看到它是不是很難使用C中的裝配功能,但讓你開始,你可以看看這個:

C:\ ... BLA BLA ... \ Microchip的\ MPLAB C30 \ SRC \ DSP \包括\ dsp.h

包含C函數聲明位於此文件夾中的實際裝配功能:

C:\ ...喇嘛喇嘛... \ Microchip \ MPLAB C30 \ src \ dsp \ asm

您可以從函數_VectorAdd開始:矢量相加,文件「vadd.s」

注意,組件功能_VectorAdd在頭文件被定義爲VectorAdd函數

本示例文件適用於DSPIC中的DSP引擎,這是PIC24不具備的功能。但它仍然足以提取原理。