固定点数学将100MHz计数器转换为毫秒

时间:2017-01-06 04:41:56

标签: c microcontroller

我正在使用没有FPU的小端32位微控制器。我需要一种方法将100MHz计数器转换为适当的毫秒。

我想创建一个以毫秒为单位返回当前时间的函数。

static uint32_t prev_time;
static uint32_t time;
uint32_t get_current_time()
{
   curr_time = get_100MHz_counter_value();
   uint32_t elapsed_time = curr_time - prev_time;

   prev_time = curr_time;   
   time = /* DONT KNOW HOW TO CONVERT THE TIME USING FIXED POINT MATH */
   return  time;
}

1 个答案:

答案 0 :(得分:0)

假设处理器可以乘以两个32位无符号整数,得到一个64位乘积(可能存在乘法的内在函数),你可以使用这个幻数公式除以100000(100000 == 32 * 3125)。

n / 100000 =    ((n>>5)*175921861ull)>>(32+7)   // ull = unsigned long long

序列乘以(n>>> 5)乘以175921861,然后取出乘积的高32位并向右移7位以获得商。

某些处理器有一条指令将两个32位数相乘,并产生64位乘积的高32位,指令名称与umulh类似。