會員登陸
帳號:

密碼:

記住我



忘記密碼?

現在註冊!
網站導航
最新下載
訪問統計 (自2012/5/3)


正在流覽:   1 名訪客





Dspic30f4011 Saturation 問題。
新會員
註冊日期:
2018/08/30 18:33
所屬群組:
註冊會員
文章: 19
等級: 3; EXP: 9
HP : 0 / 52
MP : 6 / 184
離線
各位先進好,

最近想把控制器的運算時間壓縮,
在判斷Saturation上一直沒有想法。

因為想要讓控制器有較小的問態誤差,Gain通常都會有點大,
用 Fractonal 的方法會把Gain壓得很低(不希望越乘越小)。

因此在判斷Saturation上,現階段是以
long(datatype) = int(datatype) * int(datatype)
然後對 long 最前面 16Bit作判斷決定saturation與否,
但是這樣計算時間就會大大提升,

初步測試(Simulator):
long = long * long 需要 16個cycle
long = int   * int    需要  5個cycle
int   = int   * int    需要  3個cycle

若是再加入 Saturation 的判斷 總會需要較多的時間
測試 OV flag,Z flag 與 C flag 在乘法時,基本上是無效。

想請教各位先進前輩,有沒有使用
int   = int   * int   
直接判斷的方法,或是 可以直接設定某個Config讓他自動Saturation (我有找過,但找不到)

感謝各位幫忙解答,

謝謝。

3月16日 17:49:20
轉換PDF檔 列印


Re: Dspic30f4011 Saturation 問題。
資深會員
註冊日期:
2007/06/05 21:45
所屬群組:
註冊會員
文章: 1031
等級: 28; EXP: 35
HP : 0 / 683
MP : 343 / 24869
在線上
不是很懂,你在說什麼...

查了 Saturation是飽和,又看了內容...
大概猜了一下,你應該要問的,可能是...
應該是溢位問題(overflow)...

0. 基本上...
long = int * int 需要 5個cycle
int = int * int 需要 3個cycle
才差2個cycle,再加判斷,也省不了什麼時間...

1. 溢位
加法溢位有快速檢查方法...
乘法效果可能有限...
C = A * B
C是否超過int最大值,只討論正整數
用int_max代表(16bits為32767)
if( B > int_max / A )
  C = int_max; // over flow
else
  C = A * B;
註: 因為html排版問題,加了中文空白...
註: A或B其中有一個固定(不變)的話...
int_max/A可以先算好

3月17日 14:57:59
轉換PDF檔 列印


Re: Dspic30f4011 Saturation 問題。
新會員
註冊日期:
2018/08/30 18:33
所屬群組:
註冊會員
文章: 19
等級: 3; EXP: 9
HP : 0 / 52
MP : 6 / 184
離線
感謝 jason680 大的回覆,

雖然乘法上沒差多少,但是後面的判斷差蠻多的,

現在我使用的
long = int   * int    「加上判斷式」需要 26 個cycle,
long = long * long 更高

不過 如果是 固定變數 int_max/A 先算好是個非常聰明的方法。

至於為甚麼要省那兩個 cycle,
生為一個 辦使然的電路設計者 的 極限挑戰。

非常感謝。

3月17日 15:18:35
轉換PDF檔 列印


Re: Dspic30f4011 Saturation 問題。
資深會員
註冊日期:
2007/06/05 21:45
所屬群組:
註冊會員
文章: 1031
等級: 28; EXP: 35
HP : 0 / 683
MP : 343 / 24869
在線上
>> long = int * int 「加上判斷式」需要26個cycle,...

long = int * int 才5個cycle
「加上判斷式」卻要 21個cycle(26-5)

也許你要說說實際(全部)狀況,才能找出可否省更多時間...

3月18日 19:59:45
轉換PDF檔 列印


Re: Dspic30f4011 Saturation 問題。
新會員
註冊日期:
2018/08/30 18:33
所屬群組:
註冊會員
文章: 19
等級: 3; EXP: 9
HP : 0 / 52
MP : 6 / 184
離線
感謝 jason680 大的回覆,

以下是我 現在的 測試code寫法
(這版是最快的版本,前幾天才寫出來)

for(i= 0x8000; i < 0x7FFF; i+=1){
mulitp.ByteAccess = __builtin_mulss(b , i);
if(mulit1 > 0x0000)
d = 0x7FFF;
else if(mulit1 < (signed int)0xFFFF)
d = 0x8000;
else
d = b * i;}

其中 mulitp.ByteAccess = 是為了 將 long分成前後 16Bit做判斷。
int * int則是 直接打 乘號 (看 asm 會合出一樣的東西)
mulit1 則是事先定義好的 判斷 位元,即為long的前 16Bit (扣掉Sign BIT)。

所以想問問看有沒有像加法器一樣的 C flag的類似方法判斷是否staturation 或是 Mix C nad asm 的寫法加速。

另外,想延伸問一下四個問題,
Q1:mix c and asm 寫法下,只能用call function寫嗎?(參考 "XC16 C Compiler User's Guide" Ch16 範例)
Q2:這樣不就要多一個call function cycle?
Q3:XC16有 類似verilog的 bit cascade作法嗎?(Asm 可以這樣做,move bit就可以了)
Ex. {long[31:16] , long[15:0]} << for verilog
想寫出 {sign.Bit , int[14:0]} 類似這類型的 運算。
Q4:Shift right 是 >> operator,那shift left 有operator嗎?
還是只能 直接 乘 2的次方?這樣合乘不會使用乘法器?


P.S.上次回的可能有點小錯誤,那時候有加進迴圈的 cycle ,所以應該還要 再減掉 3個cycle。


謝謝。

3月21日 12:27:21

W.W. 於 2019年03月21日 12:46:56
W.W. 於 2019年03月21日 12:52:23
轉換PDF檔 列印


Re: Dspic30f4011 Saturation 問題。
資深會員
註冊日期:
2007/06/05 21:45
所屬群組:
註冊會員
文章: 1031
等級: 28; EXP: 35
HP : 0 / 683
MP : 343 / 24869
在線上
先回應Q1-Q4

Q1, Q2 是同一個問題
在C中寫ASM,簡單的說加入asm關鍵字...
有能力寫ASM,請自己查相關文件...

Q3: 關鍵字
struct跟union
位元設定是用 : (冒號)

Q4: C語言中
>> 右移(無號)
<< 左移(無號)
一般CPU會有分"有號"左右移跟"無號"左右移
的ASM指令,但不是所有CPU都會分(兩種)...

以上,請自己查相關文件...


另外,測試code寫法,還可以深入探討...
你寫的測試,是拿所有情形討論,
但實務上,機率是否相等呢?...
(有需要再來挖深一點...)

3月22日 13:02:42
轉換PDF檔 列印


Re: Dspic30f4011 Saturation 問題。
新會員
註冊日期:
2018/08/30 18:33
所屬群組:
註冊會員
文章: 19
等級: 3; EXP: 9
HP : 0 / 52
MP : 6 / 184
離線
感謝 Jason680 前輩回覆,

好的,非常感謝您的回覆。

剩下的我會在研究研究。

謝謝。

3月26日 19:58:48
轉換PDF檔 列印






無法在此發表文章
可以在此觀看文章
無法回覆文章
無法編輯自己的文章
無法刪除自己的文章
無法發起投票調查
無法在此投票
無法上傳附加檔案
無法不經審核直接發表文章

[進階搜尋]


搜尋
Microchip連結
產品技術問題產品技術支援專線:0800-717718 台北02-25088600 新竹03-5778366 Ext. 8600 高雄07-2137830 MicrochipDIRECT 專線: 07-2137830
Powered by XOOPS © 2001-2012 The XOOPS Project