定點處理器對浮點數的處理:
1> 定義變數為浮點型(float,double),用c語言抹平定點處理器和浮點處理器的區別,但是程式的**龐大,運算速度也慢。
2> 放大若干倍表示小數。比如要表示精度為0.01的變數,放大100倍去運算,運算完成後再轉化。但是這個做法比較僵硬,如要將上面的變數重新定義成0.001精度,又需要放大1000倍,且要重新編寫整個程式,考慮溢位等問題。
3> 定標法:q格式:通過假定小數點位於哪一位的右側,從而確定小數的精度。
q0:小數點在第0位的後面,即我們一般採用的方法
q15 小數點在第15位的後面,0~14位都是小數字。
轉化公式:q=(int)(f×pow(2,q))
f=(float)(q×pow(2,-q))
q格式的運算
1> 定點加減法:須轉換成相同的q格式才能加減
2> 定點乘法:不同q格式的資料相乘,相當於q值相加
3> 定點除法:不同q格式的資料相除,相當於q值相減
4> 定點左移:左移相當於q值增加
5> 定點右移:右移相當於q減少
q格式的應用格式
實際應用中,浮點運算大都時候都是既有整數部分,也有小數部分的。所以要選擇乙個適當的定標格式才能更好的處理運算。一般用如下兩種方法:
1> 使用時使用適中的定標,既可以表示一定的整數復位也可以表示小數復位,如對於2812的32位系統,使用q15格式,可表示-65536.0~65535.999969482區間內的資料。
2> 全部採用小數,這樣因為小數之間相乘永遠是小數,永遠不會溢位。取乙個極限最大值(最好使用2的n次冪),轉換成x/max的小數(如果max是取的2的n次冪,就可以使用移位代替除法)。
5. ti的qmath.lib庫說明:
見ti的文件c28x iqmath library (sprc087a).zip的詳細說明。
ti公司給出了乙個q格式的數學庫qmath.lib
注意q格式函式使用的時序和空間要求,盡量避重就輕。
來看個具體的例子吧
#define maxf 120; //整數預設的是q0;
f=50.01 //想表示的頻率
unsigned int f;
f=((unsigned long )5001<<15)/(maxf*100) //先移位擴大100倍,轉換格式之後移位15位後結果就是想要的
可以得到f=13656
dsp2812的啟動過程
a)程式硬體復位或者軟體復位
b)判斷mp/mc是否為0,微計算機模式(為1,當為微處理器模式時,2812內部的bootrom被禁止,通過zone7從外部調引導程式啟動。這個比較適合flash引導的啟動。)
c)為0則從boot rom啟動,否則從外部啟動(0x3f fc00)
d)到boot rom的0x3f fc00處取出復位向量,跳到boot函式:2812有一塊flash位址從0x3f f000-0x3f ffff在出廠時ti已經固化好了引導程式initboot:iniboot函式判斷幾個gpio引腳來判斷使用哪一種引導模式,比如flash boot模式,檢測spiclka,scitxa,gpio34的電平,當都為高電平時表明是片內flash boot模式,那麼initboot執行完後跳轉到0x3f 7ff6處,這個時候指令佔據兩個位元組,剛好在**模組之前。一定是是跳轉指令才行。。。)
e)採集io管腳狀態,確定啟動模式。2812提供幾種啟動模式:
scitxda(gpiof4) mdxa(gpiof12) spistea(gpiof3) spiclk(gpiof2)
1 x x x flash啟動
0 1 x x spi啟動
0 0 1 1 sci啟動
0 0 0 0 parallel啟動
f)根據io狀態選擇boot方式
g)如果是flash,程式退出boot函式,跳轉到0x3f 7ff6(codestart)
h)取出跳轉指令,跳轉到自己的指定位址或者c初始化的入口_c_int00(0x3f6000)處(dsp281x_codestartbranch.asm中)
i)在c初始化的入口_c_int00對一些變數,堆疊和暫存器進行必要的設定,該函式在c的庫函式內(rts library)
j)進入main函式(0x3f658e,這個位址不是固定的。但是在flash裡面。)
注:根據ti中文手冊總結如上。。。。。
3f8238
_c_int00: 這個位址是我一次程式執行觀測到的。這個位址會隨時的變化,但是總在3f8000到3fa 000 之間,也就是在h0 sram中間。
具體的可以參照tms320f2812的儲存器的空間。。
cmd檔案的編寫
首先簡要介紹:
鏈結命令檔案(.cmd檔案)通過段定位控制命令,分配程式**和資料執行儲存空間。
(1)、memory
指出目標系統中物理上存在的儲存空間的範圍,即可供程式使用的儲存空間範圍。在預設狀態下,page0代表程式空間,page1代表資料空間。
(2)、sections
1)、描述輸入段如何組合成輸出段。
2)、定義可執行程式的輸出段。
3)、指出輸出段存放在儲存空間中的位置。
4)、允許重新命名輸出段。
.cmd檔案編寫的目的 確定程式和數椐的裝載執行空間,校驗資料和程式**的長度,定義輸入/輸出檔案,安排系統中可用的儲存器,程式段、資料段、堆疊以及復位向量和中斷向量的位址空間。
鏈結命令檔案通過段定位控制命令,分配程式**空間、資料**空間、程式執行空間、堆疊空間。
.cmd檔案命令格式
ø memory:定義目標板物理儲存空間分配,預設狀態下,page0為程式空間, page1為資料空間。
① 給出輸入段組合成輸出段的方式;
② 定義可執行程式的輸出段;
③ 指出輸出段存放在儲存空間中的位置;
④ 允許重新命名輸出段。
下面分析乙個簡單的,helloword 經典的cmd
memory
sections
說明:.text: ;程式**在第0頁
.reset ;復位在第0頁
.cinit: ;初始化變數在第0頁
.pinit: ;初始化引數在第0頁
.vectors :一些向量在第0頁
.bss: ;非初始化變數在第1頁
.ebss ;初始化變數在第一頁。
.const: ;常數在第1頁
..sysmem: ;系統的東東,初始化一些東西,硬體的。
.cio: ;c語言i/o呼叫在第1頁
.stack: ;堆疊在第1頁
mysql啟動過程長 mysql啟動過程
mysql啟動過程經過以下順序 1.mysql讀取配置檔案的順序 讀取順序 etc my.cnf etc mysql my.cnf usr etc my.cnf my.cnf 2.mysql啟動方式 mysql啟動方式有三種 mysqld mysqld safe mysqld multi 主要用於多...
Linux啟動過程
1 開啟 pc電源 pc加電後,乙個特殊的硬體電路會觸發 cpu 的 reset 腳的邏輯值,然後一些 cpu 暫存器,如 cs eip 等被給定乙個值,接著 cpu 跳轉到乙個固定位址開始執行 bios 2 bios 自檢,按設定的裝置啟動 bios 對硬體進行一系列徹底的檢查,如 cpu 型別 ...
Flex 啟動過程
2008 11 16 11 58 然後才是 通常我們所說的flex應用程式,本質上來說是基於flex框架 採用actionscript 3.0編寫的flash應用程式,從這一點來說,它和普通的flash應用程式沒有任何差別。相對來說,傳統的使用flash ide 如flash cs3 建立flash...