2013-04-06 50 views
5

我正在開發一個嵌入式項目,我必須在某個微芯片的兩個字節寄存器中寫入超時值。將整數分解爲兩個字節

超時被定義爲:

timeout = REG_a * (REG_b +1) 

我想用在256的整數,以讓說,60000我尋找一種算法,對這些寄存器進行編程,給予timeout-值,計算REG_a和REG_b。

如果一個確切的解決方案是不可能的,我想獲得下一個可能的更大的超時值。

我有什麼迄今所做的:

我目前的解決辦法計算:

temp = integer_square_root (timeout) +1; 
    REG_a = temp; 
    REG_b = temp-1; 

這導致了在實際工作中也值。不過,我想看看你們是否可以想出更優化的解決方案。

哦,而且我的記憶受到限制,所以大表無法提供。運行時間也很重要,所以我不能簡單地暴力解決方案。

+0

你想最大限度地減少'timeout'和計算值之間的差異嗎?這是練習的目的嗎?否則你看起來很好。 – 2013-04-06 14:07:21

+0

最優化的一個版本是最小化一個寄存器並使其他寄存器最大化。這個寄存器接口可能存在問題,您不希望突然更改這兩個寄存器。由於無法同時進行兩次內存寫入,因此如果在定時器運行時寫入寄存器**,則可能會出現問題。通過最小化一個寄存器,當更小的超時時間可以保持不變,因爲最小值提供了更好的時間粒度。 – 2013-04-08 14:54:09

回答

2

您可以使用該答案中使用的代碼Algorithm to find the factors of a given Number.. Shortest Method?來查找超時因子。

n = timeout 
initial_n = n 
num_factors = 1; 
for (i = 2; i * i <= initial_n; ++i) // for each number i up until the square root of the given number 
{ 
    power = 0; // suppose the power i appears at is 0 
    while (n % i == 0) // while we can divide n by i 
    { 
     n = n/i // divide it, thus ensuring we'll only check prime factors 
     ++power // increase the power i appears at 
    } 
    num_factors = num_factors * (power + 1) // apply the formula 
} 

if (n > 1) // will happen for example for 14 = 2 * 7 
{ 
    num_factors = num_factors * 2 // n is prime, and its power can only be 1, so multiply the number of factors by 2 
} 
REG_A = num_factor 

第一個因素將是你REG_A,那麼你需要找到相乘等於超時另一個值。

for (i=2; i*num_factors != timeout;i++); 
REG_B = i-1 
1

有趣的問題,尼爾斯!

假設您通過修復其中一個值(例如Reg_a)開始,然後通過除法計算Reg_b:Reg_b = ((timeout + Reg_a-1)/Reg_a) -1

然後你知道你很近,但有多接近?那麼錯誤的上限是Reg_a,對吧?因爲錯誤是該部門的其餘部分。

如果您將因子設置得儘可能小,然後計算另一個因子,那麼您將使錯誤的上限盡可能小。

另一方面,通過使這兩個因子接近平方根,可以使除數儘可能大,並因此使得儘可能大的錯誤

So:

首先,Reg_a的最小值是多少? (timeout + 255)/256;

然後像上面那樣計算Reg_b。

這不會是所有情況下的絕對最小組合,但它應該比使用平方根更好,也更快。