導航:首頁 > 源碼編譯 > DSP反編譯到c語言

DSP反編譯到c語言

發布時間:2022-04-28 07:18:52

Ⅰ DSP實驗 讓我用C語言編寫程序完成計算sin(2.3π)+cos(1.7π)的值

編程語言是難學的,真正的工作中有時候學習一個新語法只有不到一周的時間,語法而言都一樣,如果還停留在語法層學習的上面,編寫程序的道路你就連門都沒有入.
但是後續的 數據結構和演算法 稍微要看下書了,開始接觸演算法了,著和語法沒有關系,之所以要先學好語法是為了能看懂用語法描敘的演算法,學通了用任何語言來描敘都一樣,到了這個階段的就相當於抬起一條腿准備跨到起跑線一樣,但還是沒有入門.
編譯原理 和 圖靈機 再到 自己編寫微型的操作系統 就需要有個老師來引導了
我學軟體開發就是從C開始一路由 ->國家資料庫3級-> 程序員->高級程序員->系統分析師考上去然後通過近9年的工作,體會是如果你能夠在市面上或者學校里精確買到或者學到的一門知識往往就表示你的層次還是不能讓你得興應手的在行業中創造你能想像的東西,真正的解決問題需要很多本書再加上80%以上的自己創造和理解才能做出來的時候才算真正懂得了你的工作.
一個程序員需要這樣的經歷
樓上的估計最高學歷不過是理工科的一個大學生,應該還沒畢業,沒有在計算機行業呆過,在做晶元處理的工作中比如DSP晶元設計需要你天天接觸演算法,但是這和C語言本身有關系嗎?傅立葉演算法是數學家傅立葉設計出來的數學模型但是不適合做在計算機軟體裡面(運算量太大了比如離散的傅立葉變換等同於用序列Y(n×1列矢量)乘以n×n矩陣Fn,需要n×n次乘法。若n=1024,則是104,8576次乘法運算。什麼概念呢?如果你選用的CPU單周期指令為25ns, 單周期也可以完成一次乘法運算,那麼要計算1024點的傅立葉變換則需要26.2144ms,這還不包括加法或其它運算),我給出C演算法如下:
void kkfft(double pr[], double pi[], int n, int k, double fr[], double fi[], int l, int il)
{
int it,m,is,i,j,nv,l0;
double p,q,s,vr,vi,poddr,poddi;

for (it=0; it<=n-1; it++)
{
m = it;
is = 0;
for(i=0; i<=k-1; i++)
{
j = m/2;
is = 2*is+(m-2*j);
m = j;
}
fr[it] = pr[is];
fi[it] = pi[is];
}
//----------------------------
pr[0] = 1.0;
pi[0] = 0.0;
p = 6.283185306/(1.0*n);
pr[1] = cos(p);
pi[1] = -sin(p);

if (l!=0)
pi[1]=-pi[1];

for (i=2; i<=n-1; i++)
{
p = pr[i-1]*pr[1];
q = pi[i-1]*pi[1];
s = (pr[i-1]+pi[i-1])*(pr[1]+pi[1]);
pr[i] = p-q;
pi[i] = s-p-q;
}

for (it=0; it<=n-2; it=it+2)
{
vr = fr[it];
vi = fi[it];
fr[it] = vr+fr[it+1];
fi[it] = vi+fi[it+1];
fr[it+1] = vr-fr[it+1];
fi[it+1] = vi-fi[it+1];
}
m = n/2;
nv = 2;

for (l0=k-2; l0>=0; l0--)
{
m = m/2;
nv = 2*nv;
for(it=0; it<=(m-1)*nv; it=it+nv)
for (j=0; j<=(nv/2)-1; j++)
{
p = pr[m*j]*fr[it+j+nv/2];
q = pi[m*j]*fi[it+j+nv/2];
s = pr[m*j]+pi[m*j];
s = s*(fr[it+j+nv/2]+fi[it+j+nv/2]);
poddr = p-q;
poddi = s-p-q;
fr[it+j+nv/2] = fr[it+j]-poddr;
fi[it+j+nv/2] = fi[it+j]-poddi;
fr[it+j] = fr[it+j]+poddr;
fi[it+j] = fi[it+j]+poddi;
}
}

if(l!=0)
for(i=0; i<=n-1; i++)
{
fr[i] = fr[i]/(1.0*n);
fi[i] = fi[i]/(1.0*n);
}

if(il!=0)
for(i=0; i<=n-1; i++)
{
pr[i] = sqrt(fr[i]*fr[i]+fi[i]*fi[i]);
if(fabs(fr[i])<0.000001*fabs(fi[i]))
{
if ((fi[i]*fr[i])>0)
pi[i] = 90.0;
else
pi[i] = -90.0;
}
else
pi[i] = atan(fi[i]/fr[i])*360.0/6.283185306;
}

return;
}
另外,虛機團上產品團購,超級便宜

Ⅱ 關於c語言和dsp編程的問題

這個問題太常見了呀,原因是路徑設置錯了。
進入界面後,選擇OPTIONS--選擇Directories
然後設置路徑,(以下是我的設置,你參考)
1:INCLUDE文件夾所在路徑,Include directories: E:\TC2\INCLUDE
2:Library文件夾所在路徑,Library directories: E:\TC2\LIB
3:OuPut文件夾即文件編譯輸出到哪個目錄下
4:TurbroC程序所在的目錄

最後選擇 OPTIONS下的SAVE OPTIONS即可。一定要SAVE呀。

Ⅲ 如何將匯編語言與C語言整合至DSP

隨著DSP處理器性能的提升以及編譯器最佳化技術的進步,曾經紅極一時、僅用匯編語言編寫DSP應用程序的作法已逐漸被淘汰。今天,幾乎每個DSP應用程序都使用C語言程序代碼和匯編程序碼混合的方式。對於一些性能需求極高的關鍵功能,DSP工程師會繼續使用高度最佳化的匯編程序碼;而一些次要的功能現在也使用C語言編寫,使程序代碼更容易維護和移植。對於C語言和匯編程序碼的結合,每位DSP工程師都需要掌握特殊的工具和方法。 眾所皆知,匯編語言編碼具有更高的性能優勢,而用C語言編碼則較容易且速度也更快。為了解其中原因,以下我們進一步比較匯編語言編碼與C語言編碼的優缺點: 匯編語言編碼的優點: 匯編語言編碼可以充分利用處理器的獨特指令以及各種專門的硬體資源。而C語言程序代碼是通用型程序代碼,必須支持各種硬體平台,因此很難支持特殊平台程序代碼。 匯編程序設計人員通常對應用程序非常熟悉,可以作出編譯器無法作出的假設。 匯編程序設計人員可以發揮人類的創造性;而再先進的編譯器也只是一個自動化的程序。 匯編語言編碼的缺點: 匯編程序設計人員必須解決耗時的機器級問題,如緩存器分配和指令排程。若使用C語言程序代碼,這些問題可以由編譯器解決。 使用匯編語言編碼的程序設計人員必須了解DSP架構及其指令集的專業知識;而C語言編碼只需要掌握相當普及的C語言知識。 若使用匯編語言,將應用程序從一個平台移植到另一個平台非常困難也相當耗時;而C語言應用程序的移植相對而言非常容易。 圖1顯示了如何利用專用硬體機制來獲得高度最佳化的匯編程序碼。左邊的C語言編碼利用模塊演算法設計出一個循環緩沖區P1;右邊高度最佳化的匯編程序碼中,等效的緩沖區是利用CEVA-TeakLite-III DSP核心的模塊運算機制(Molo Mechanism)設計產生的。只要緩沖區指標(本例中的r0)有更新,模塊運算機制便會自動執行模塊運算。這種運算與指針更新在同一個周期發生,因此匯編程序碼比C語言程序代碼更加高效,可為模塊運算產生獨立的指令。 點擊看原圖圖1:右邊的CEVA-TeakLite-III匯編程序碼可以建置成左邊的C語言程序代碼。 為DSP應用選擇C/匯編程序碼 混合使用的問題就在於該如何劃分C語言程序代碼和匯編程序碼的界限,而答案取決於剖析器提供的性能分析結果。然而在使用剖析器之前,DSP工程師需要為應用程序定義清晰的對象,一些典型的對象包括循環數、程序代碼大小和數據大小。一旦這些對象確定後,所有應用程序都應該先以C語言編寫和製作,隨後使用剖析器來分析性能。 在一些極端情況下,如控制應用,用C語言層級的編碼就足夠了;但大多數情況下,原始C語言層級應用程序版本不會遵從一個或多個對象,這也意味著需要使用一些匯編程序碼來完成。在求助於匯編語言編碼之前,C語言編碼可提供許多方法來提高性能,但這些方法不屬於本文討論的范疇。假設所有C語言級的方法全用完了,並且准備使用匯編語言編碼,這時強烈建議將原始C語言程序代碼保存起來。這樣不僅方便除錯,而且一旦條件許可(比如轉移到更強大的平台)還可以回復原始的C語言。 程序代碼中的匯編語言部份應盡可能維持在最少,這樣便能分析從剖析器得到的性能結果,並定義應用程序中的關鍵函數。關鍵函數會佔用大部份執行時間,必須用匯編語言重寫才能滿足性能對象。當兩到三個最關鍵的函數重寫後,需要重新進行性能測量,若應用程序仍然不能滿足對象需求,那麼必須使用匯編語言定義並重寫額外的關鍵函數,這個過程需要不斷地重復直到滿足性能對象需求為止。 匯編語言設計師的編譯器考慮 在編寫會與C語言程序代碼結合的匯編程序碼時,匯編程序設計人員必須了解編譯器的慣例和假設。其中有個重要的編譯器慣例是函數呼叫慣例,也稱為函數參數傳遞慣例。這個慣例描述了編譯器如何在一個函數呼叫另一個函數時傳遞參數。為了使匯編語言函數能被C語言函數成功呼叫;反之亦然;匯編語言函數必須截取參數,然後將參數發送到由函數呼叫慣例定義的硬體資源上,通常為緩存器或堆棧內存。 匯編程序設計人員還必須了解編譯器的緩存器使用慣例。這些慣例將硬體緩存器分成被呼叫者保存(callee-saved;或呼叫者使用,caller-used);以及被呼叫者使用(callee-used;或呼叫者保存,caller-saved)緩存器。編譯器假設被呼叫者保存緩存器在函數呼叫過程中保持不變的值,若匯編程序設計人員希望使用這種緩存器,他們必須先將緩存器的值備份,然後在返回到C語言程序代碼之前恢復這些緩存器的內容;相反的,被呼叫者使用緩存器被認為在函式呼叫過程中不會保持一定的值。這意味著匯編程序設計人員使用這些緩存器之前無需進行備份,不過他們必須記住,當匯編語言函數呼叫C語言函數時,被呼叫者可以對這些緩存器進行覆寫。 圖2為一個從CEVA-X1641 DSP核心FFT實作中截取的匯編程序碼案例。其中以黃色標示的add指令遵循CEVA-X1641編譯器的呼叫慣例,在r0地址緩存器中傳遞指針參數。標為藍色的pushd指令用於備份,隨後函數會使用的被呼叫者保存緩存器。

Ⅳ DSP怎樣用C語言寫程序啊

TI有C語言的常式的,是一個安裝文件,安裝之後才會出現那個文件夾。文件夾裡面是晶元上外設的使用方法的程序,很簡單,學過ANCIC的人能夠看懂。

Ⅳ 在DSP中實現FFT演算法,C語言編寫,編譯成功,但是鏈接失敗,報錯為重復定義宏變數,請高手指教。

遇到過相同的問題,是調用的函數在dsp的編譯環境中不支持。
比如ITOA()等,編譯是沒有問題的,但是鏈接的時候就會出錯。
檢查一下使用的函數是不是可以被使用吧。

Ⅵ 對DSP而言,CCS用C語言編程和匯編編程,二者的效率相差多少

我用的是28XX系列的,不知道經驗對你有沒有用,因為不同系列的晶元多少有些差別。
TI提供的庫已經相當可以了,兼顧易用與效率。我當時做過這樣的測試
1. 用IQMATH實現
2. 直接C語言實現
3. C語言優化實現
4. 原生匯編實現
IQMATH的運行周期在1000左右,比方案3快幾十個周期,比方案4慢幾個周期,方案2是10000多個周期。
另外,因為只是單獨測的演算法,匯編之所以快是快在寄存器的使用上,操作數可以直接入寄存器,但是考慮到程序其他部分是用C語言編寫的話,把操作棧的時間也加上,並不比方案1快。畢竟我對TI的匯編吃的也不透。
在編寫上,無疑是方案1提供了最接近C語言風格的實現,幾乎不用考慮ISA方面的問題。
另外對於執行效率,我覺得主要考慮三點:
1.分支的使用
CCS對C語言的優化我沒做過太多比對。其實單從反匯編的結果看,我接觸過的嵌入式開發環境的編譯器都能做出很好的優化。但是幾乎每個編譯器都會在邏輯的優化上有欠缺——它只能對一些顯而易見的判斷條件進行優化,而在寫程序的過程中,我們經常出於易讀性的考慮,或者穩定性的考慮,或者其他的考慮加入幾乎不會發生的分支,這樣的分支判斷會消耗一定比率的代碼段執行效率,視乎代碼段內有用功能的長度而定,越長這個比率越小,越短這個比率越高。
2.一般操作,就是各種賦值操作
在一般的操作上,編譯器的優化已經很令人滿意了,基本上可以作為編寫匯編的範本。我覺得所謂效率能達到90%就是針對這個部分說的。
3.特殊操作,比如對整塊內存的操作,或者是浮點運算上。
在一些特殊的操作上,就要看是否有現成的庫,或者看硬體是否支持。比如對整塊內存操作就別用循環一個位元組一個位元組的搬了。
以上三點都能考慮到的話,相信執行效率方面已經沒有太大的提升空間了。

另外如果你的代碼發生在初始化部分,也就是只在系統運行開始的時候運行一次,那麼優化不優化其實沒有太大的必要,除非你對系統初始化的時間有嚴格的要求。但是如果你的代碼是作為任務要被反復運行的,那就有優化的必要了。

在CCS里有代碼消耗時鍾周期的統計,如果你覺得某段代碼效率低下的話,可以先分段進行消耗時鍾周期的計算,這樣優化比較有針對性。

Ⅶ 用DSP的CCS軟體編寫C語言程序,出現以下錯誤……

應該是工程配置問題,你可以上設置裡面找obj的路徑設置,把他設置為預設再重新編譯試試

Ⅷ 運用C語言對DSP編程的問題

不同的廠商提供了不同的庫文件包,比如TI給64x系列另外開發了圖像處理和數字信號處理庫文件,AD公司等都有自己的文件包,dsp的c語言先把基本的語法學好就可以了,包括文件操作部分,完了結合不同型號的DSP再學習。英文資料不少,中文資料有但是好多是騙人的,最好看看老外寫的東西。

Ⅸ 怎麼學好DSP 的c語言編程

匯編忽略它 做介面或病毒可以考慮下下
VB太低級,不過可以做實實在在的程序
C語言是中級語言,通過C可以掌握面向過程編程的精髓,前提是你得學得下去才行。
java面向對象,現在主流。入門不難。
個人建議:C --> C++ --> java

Ⅹ 新手學習DSP的C語言編程,請高手指點:

C6713沒用過,我用過TMS320F2812的晶元。建議你先熟悉一下CCS開發環境,然後再認真的看代碼。TI的DSP,封裝了很多的頭文件,沒有必要全部都要看看頭文件里是怎麼寫的。最好先把整個程序的運行流程看懂。然後結合晶元手冊,看看每一步怎麼做的,是如何通過配置寄存器、如何使用外設等等。關鍵還是看晶元手冊。等熟悉了之後,再深入看頭文件啥的。

閱讀全文

與DSP反編譯到c語言相關的資料

熱點內容
蘋果怎麼下載整理文字軟體app 瀏覽:130
怎麼刪除一個app下載任務 瀏覽:713
python執行bat命令 瀏覽:471
什麼吉他調音器app最好 瀏覽:33
php程序員招聘試題 瀏覽:14
程序員升職記第九關最優解 瀏覽:317
三星安卓11怎麼訪問data文件夾 瀏覽:817
華三伺服器怎麼設置開機自啟 瀏覽:711
釘郵登錄伺服器地址 瀏覽:644
起源編譯器適配第二款應用 瀏覽:433
cad弄斷線條命令 瀏覽:463
怎麼恢復手機app的安裝包 瀏覽:300
idea重啟項目不編譯 瀏覽:495
程序員那麼可愛演員表陸漓媽媽 瀏覽:127
linuxgadget驅動 瀏覽:594
華三調用acl的命令 瀏覽:9
資金流pdf 瀏覽:931
金融結演算法補充條款 瀏覽:291
什麼叫伺服器怎麼連接 瀏覽:521
空調壓縮機有製冷但室內不是很冷 瀏覽:839