2013-04-06 87 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。

这不会是所有情况下的绝对最小组合,但它应该比使用平方根更好,也更快。