ADI DSP程式設計時程式相互呼叫說明及例程

2021-06-04 01:06:44 字數 4718 閱讀 4580

* 下面所陳述的程式之間的呼叫是基於tigersharc101處理器,在visualdsp++3.0上除錯通過驗證,由於時間倉促,難免有錯誤。

* vdsp上程式設計可以使用標準c語言,也可以使用組合語言。所以,程式之間的呼叫共分為4種:

* c語言呼叫c語言子程式

* c語言呼叫組合語言子程式

* 組合語言呼叫組合語言子程式

* 組合語言呼叫c語言子程式

* 下面詳細說明4中呼叫方法

* 一:c語言呼叫c語言子程式

* 這種呼叫方法最簡單,和標準c語言呼叫一樣。宣告函式之後便可以呼叫

* 例程:func呼叫subcfunc

* * void subcfunc(int *buffaddr, int n);

* void func(void)

* *

* void subcfunc(int *buffaddr, int n)

* *

* * 二:c語言呼叫組合語言子程式

* 這種呼叫方法最常用。首先要在c語言程式中用extern宣告彙編子函式,在彙編子函式中要用

* .global _sunasmfunc;,這樣便可以呼叫彙編子程式了

* 2.1 宣告:

* c語言中宣告用 extern void subasmfunc(int *buffaddr, int n);

* 組合語言中宣告 .global _subasmfunc;

* 2.2 引數傳遞

* c語言的引數傳遞到組合語言中,

* 位址和整數依次分別用j4, j5, j6, j7傳遞

* 浮點數依次分別用xr4,xr5, xr6, xr7 傳遞

* 彙編函式的返回值:

* 浮點值放在xr8中

* 整型值放在j8中

* 多於4個引數的傳遞則要借助堆疊傳遞資料。

* 2.3 例程:

* c語言函式:

* extern int subasmfunc(int *buffaddr, float x, int n)

* void cfunc(void)

* *

* 彙編子程式

* .section program;

* .global _subasmfunc;

* _subasmfunc:

* //j4存放bufferaddr位址

* //xr5存放浮點數x

* //j6存放n

* //j8返回值存放位址,如果是浮點數則放在xr8中

* _sunasmfunc.end

* .align_code 4;

* cjmp(np)(abs);nop;nop;nop;;

* * 三: 匯程式設計序呼叫彙編子程式

* 匯程式設計序呼叫彙編子程式時,首先要進行堆疊保護,每進一層子函式都要進行堆疊保護

* 在實模式下,堆疊保護使用j26,j27, k26,k27暫存器,程式設計時不要使用j27:24, 和k27:24

* 暫存器,另外j31和k31暫存器也不可以使用,如果要使用必須把這些暫存器的值做保護。

* 3.1 函式呼叫宣告

* 彙編主程式中宣告: .extern _subasmfunc;

* 彙編子程式中宣告: .global _subasmfunc;

* 3.2 引數傳遞

* 引數傳遞遵循c語言呼叫組合語言規則,但是要在彙編主程式中手動給暫存器賦值

* 3.3 堆疊保護

* 進入乙個子程式就要進行堆疊保護,堆疊保護一般定義乙個巨集來實現,在例程中會

* 詳細介紹如何進行堆疊保護。

* 3.4 例程

* 組合語言呼叫組合語言例程,此例程具有通用性,可多層呼叫,例如可以用c語言呼叫

* 彙編主程式,再用彙編主程式呼叫彙編子程式,然後再逐層返回。

* 組合語言主程式

* #ifndef menter

* #define menter \

* j26 = j27 - 0x40; k26 = k27 - 0x40;; \

* [j27+=0xfffffff4] = cjmp; k27 = k27 - 0x4;;

* #define mretrun \

* cjmp = [j26+0x40];; \

* cjmp(np)(abs); j27:24 = q[j26+0x44]; k27:26 = q[k26+0x44];;

* #endif

* .extern _subasmfunc;

* .section program;

* .global _asmfunc;

* _asmfunc:

* menter;;

* //彙編主程式接收引數傳遞

* ..........

* ..........

* //彙編主程式呼叫彙編子程式

* .align_code 4;

* if true, call _subasmfunc; q[j27+4] = j27:24; q[k27+4] = k27:24;;

* //接收返回值

* ..........

* mreturn;;

* _asmfunc.end:

* * 組合語言子程式

* .section program;

* .global _subasmfunc;

* _subasmfunc:

* menter;;

* //引數傳遞

* ..........

* mreturn;;

* _subasmfunc.end:

* * 四:匯程式設計序呼叫c語言子程式

* 匯程式設計序呼叫c語言子程式前要把必要的積存器進行保護,經常保護的暫存器為

* j27:24, k27:24,

* j7:j4, xr7:xr4(如果在繼續執行的組合語言程式中不再使用此暫存器則可以不理會它)

* 組合語言呼叫c語言子程式有兩種形式

* 4.1 組合語言呼叫自定義c語言子程式

* 4.1.1 宣告

* 組合語言主程式宣告: .extern _subcfunc;

* c語言子程式宣告: 可以宣告,也可以不宣告,如果有別的c程式呼叫此函式

* 則在別的函式中宣告即可

* 4.1.2 引數傳遞

* 引數傳遞規則同 c語言呼叫彙編子程式

* j4,j5,j6,j7傳遞整型引數

* xr4,xr5,xr6,xr7傳遞浮點引數

* j8返回整型值,

* xr8返回浮點值

* 4.1.3 堆疊保護

* 呼叫子程式前要先保護 j27:24和k27:24

* 4.2 組合語言呼叫vdsp庫函式子程式

* 4.2.1 宣告

* 組合語言主程式宣告: .extern __cosf; //庫函式一般用雙下劃線 c

語言主控程式中要包含 math.h標頭檔案

* 4.2.2 引數傳遞

* 引數傳遞同上

* 4.3 例程

* 組合語言呼叫自定義c語言子程式和庫函式例程

* * 主控程式及c語言子程式

* #include

* extern int asmfunc(float a, float b, int n);

* * void main(void)

* * return;

* }* //c語言子程式,實現加法

* int subcfunc(float a, float b, int n)

* *

* //組合語言程式

* #ifndef menter

* * #define menter \

* j26 = j27 - 0x40; k26 = k27 - 0x40;; \

* [j27 += 0xfffffff4] = cjmp; k27 = k27 - 0x04;;

* #define mreturn \

* cjmp = [j26 + 0x40];; \

* cjmp(abs)(np); j27:24 = q[j26 + 0x44]; k27:24 = q[k26 + 0x44];;

* * #endif

* * .extern _subcfunc;

* .extern __cosf;

* .section program;

* .global _asmfunc;

* _asmfunc:

* menter;;

* //接收引數並處理

* ................

* //給呼叫subcfunc準備引數

* //xr4 = a;;

* //xr5 = b;;

* //j6 = n;;

* .align_code 4;

* if true, call _subcfunc; q[j27+4] = j27:24; q[k27+4] = k27:24;;

* //接收返回值 儲存j8

* * //給呼叫cosf準備引數

* //xr4 = 0.5;;

* .align_code 4;

* if true, call __cosf; q[j27+4] = j27:24; q[k27+4] = k27:24;;

* //接收返回值xr8

* * //匯程式設計序返回值處理

* ..................

* mreturn;;

* _asmfunc.end:

C Matlab 相互呼叫

visualstudio2013 net4.0 matlab2015b 高版本的matlab對外置其它語言做得很方便了,並不需要一堆的配置。其它語言與matlab的互動操作也類似。基本思路 將matlab函式打包成dll檔案,聯合matlab資料支援dll mwarray.dll 交付給其它語言程式...

C Matlab 相互呼叫

禾木junjie原文c matlab 相互呼叫 visualstudio2013 net4.0 matlab2015b 高版本的matlab對外置其它語言做得很方便了,並不需要一堆的配置。其它語言與matlab的互動操作也類似。基本思路 將matlab函式打包成dll檔案,聯合matlab資料支援d...

URL Scheme程式之間相互呼叫傳值

在ios程式間通訊,可以通過url scheme,判斷是否安裝了另外的應用,開啟特定 url 的方式來傳遞引數給 另乙個程式。例如 在程式a receiver 的info.plist中加入你需要註冊的url scheme,然後在你的應用程式b中 加入處理這類請求的 從而實現在b程式中呼叫a程式,判斷...