c - 将 100MHz 计数器转换为毫秒的定点数学

标签 c microcontroller

我正在研究没有 FPU 的小端 32 位微 Controller 。我需要一种方法将 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;
}

最佳答案

假设处理器可以将两个 32 位无符号整数相乘,得到一个 64 位乘积(乘法可能有一个内在函数),您可以使用这个魔数(Magic Number)公式除以 100000 (100000 == 32 * 3125)。

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

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

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

关于c - 将 100MHz 计数器转换为毫秒的定点数学,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41499054/

相关文章:

c++ - 这是什么控制风格?

c - ANN : Learning Vector Quantization not working

javascript - Arduino yun vs tessel vs espruino

c - 为什么153的阶乘在下面的程序中失败了

c++ - 错误 : cast from 'const prog_uchar*' to 'byte' loses precision?

c - 指向 void 的指针作为函数中的参数,没有可变数量参数的原型(prototype)

8051 中的代码优化

c - 通过 UART 使用 ASCII

c - 如何在运行时使用 C 查找微 Controller 中的堆栈溢出

c - 在 C 中使用 fgets() 作为非阻塞调用是否安全?