DSP28335 28035程式燒入flash經驗

2021-10-02 21:30:22 字數 1626 閱讀 8665

在dsp程式燒入flash後,為了使得程式執行時間和ram中一樣,需要將程式搬運到ram裡面。網上通常教的方法是利用memcopy函式,將需要搬遷到ram的函式從flash搬運至ram中。

在main.c寫

#pragma code_section(adca1_interrupt_isr,"ramfuncs");

//指定某函式在ram裡執行

memcopy

(&ramfuncsloadstart,

&ramfuncsloadend,

&ramfuncsrunstart)

;initflash()

;

如果adca1_interrupt_isr包含了所有的程式,而且沒有程式呼叫的話,這樣確實是使得所有的演算法都執行到了ram裡面,但是如果adca1_interrupt_isr中有幾個函式a,b,c,d。它們寫在了另乙個檔案vector.c中,那麼這時候,a,b,c,d這幾個函式的**其實仍然是在flash中執行的。這樣,程式的執行時間會變得和ram中不同。也就是說,這種方法只能將指定的函式搬運至ram,這一函式呼叫的子函式並不會被搬運。

為了實現真正搬運所需的全部函式,需要對cmd檔案進行修改。

ramfuncs            : load = flashd, 

run = raml0,

load_start

(_ramfuncsloadstart)

,load_end

(_ramfuncsloadend)

,run_start

(_ramfuncsrunstart)

,load_size

(_ramfuncsloadsize)

, page =

0

以上修改中,將三角函式,開方,除法等函式所在檔案對應生成的obj檔案,鏈結到了ram裡面。將編譯生成的obj檔案用連線符l使得它們被分配到flash載入ram執行區域,使得對於時間要求較高的程式真正執行在ram當中,這樣整個程式就和ram裡面跑基本效率差不多。

總結下來,做法是針對需要移到ram執行的程式a,b,c,d,將這部分測序對應生成的obj檔案a.obj,b.obj,c.obj,d.obj鏈結過去。

ramfuncs            : load = flashd, 

run = raml0,

load_start(_ramfuncsloadstart),

load_end(_ramfuncsloadend),

run_start(_ramfuncsrunstart),

load_size(_ramfuncsloadsize),

page = 0

有的教程中,提到通過修改cmd檔案讓所有函式都直接在ram執行,這樣我覺得是不好的。因為有時候我們用的晶元要燒入flash可能就是因為ram空間不夠了,這時候把所有程式都搬運區ram執行,那麼就和直接ram執行沒區別了。像28335的ram比較大,影響不大,但是對28035這樣ram比較小的dsp,ram空間會不足。

有部分對時間要求不強的程式,在ram執行,屬於浪費了ram。

dsp程式理解

u表示該常數用無符號整型方式儲存,相當於 unsigned int l表示該常數用長整型方式儲存,相當於 long f表示該常數用浮點方式儲存,相當於 float 一 用於說明資料型別 數值後面加 l 和 l 小寫的l 的意義是該數值是long型。詳細說如下 5l的資料型別為long int。5.1...

DSP 實現模式識別小程式

花了兩個星期的時間,終於把乙個簡單的模式識別程式移植到開發板上了。程式是現成的,以前用 vc實現的。在移植過程中,中間走了一些彎路,花費了不少時間。程式很簡單,用模板匹配法實現數字5和非 5的識別,最終顯示出來。關於特徵值的選取,我一開始把影象分成了 5 5個區域,用每個區域的畫素值當做特徵值。原來...

編寫基於DSP程式的注意事項

使用c c 語言編寫基於dsp程式的注意事項 1 不影響執行速度的情況下,可以使用c或c c 語言提供的函式庫,也可以自己設計函式。2 要非常謹慎地使用區域性變數,根據自己專案開發的需要,應盡可能多地使用全域性變數和靜態變數。3 一定要非常重視中斷向量表的問題。中斷向量表中的中斷名是任意取定的,ds...