我正在使用没有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;
}
答案 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类似。