工具与软件:
您好!
为了生成延迟、 我们有以下伪代码、这与 TI 的示例代码类似
period_value 指所需的延迟量(作为参数传递)。
当控制器持续运行数天时、由于 uint64类型的翻转条件、CURRENT_TIME 值是否可能小于 initial_time 值。 问题是、如果上述变量发生翻转、如何在 TI 中完成处理? 或者我们是否应该在代码中添加任何翻转条件?
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
工具与软件:
您好!
为了生成延迟、 我们有以下伪代码、这与 TI 的示例代码类似
当控制器持续运行数天时、由于 uint64类型的翻转条件、CURRENT_TIME 值是否可能小于 initial_time 值。 问题是、如果上述变量发生翻转、如何在 TI 中完成处理? 或者我们是否应该在代码中添加任何翻转条件?
尊敬的 Jagadish:
是的、您指出的函数与我们所拥有的函数类似。 我们已根据我们的标准对其进行了修改。 因此,我对前面的评论感到好奇:
当控制器持续运行数天时、由于 uint64类型的翻转条件、CURRENT_TIME 值是否可能小于 initial_time 值。 问题是、如果上述变量发生翻转、如何在 TI 中完成处理? 或者我们是否应该在代码中添加任何翻转条件?
尊敬的 Bharath Kumar:
uint64 不会发生翻转、但有一个边界条件需要在应用级别进行处理。 我想先解释一下行为:
为了说明我为 RTI 比较0配置了1秒超时的行为、如下所示:
而预分频后的 RTI 时钟为1MHz
基于此、 为我的 COMPx 和 UDCPx 寄存器分配了1000000:
因此、计时器将执行的操作是、它将 针对每个 RTC 时钟脉冲持续递增 FRCx (在预分频器之后)。 如果该 FRCx 值与 COMPx 匹配 、则意味着发生超时、并且将生成 COMPARE0中断。 现在、在该中断之后、为了周期性地生成中断、计时器模块会将 UDCPx 值与 COMPx 相加 、以生成下一个中断。 因此、FRCx 将 再次跟踪 COMPx 值、如果再次与该值匹配、我们将获得中断、并且此过程将继续。
现在、如果我们验证 rtiGetCurrentTick 函数定义:
它将返回节拍值、如下所示:
Tick = RTI_CNT_FRCx -(RTI_CMP_COMPx - RTI_CMP_UDCPx);
因此、该节拍值将为我们提供按 FRCx 计数的 RTI 时钟脉冲数。
示例:
在本例中、我们配置了1000000、这意味着我们将得到0到999999之间的周期、
为了理解执行以下操作的行为、我持续读取节拍值并将其发送到 UART 端口
如您所见、它将不断递增、直至达到1000000、然后回滚到零并再次开始。
因此、如果应用程序希望使用此节拍值创建延迟、则应用程序应注意这一边界条件。
在这种边界条件下、电流值可能小于初始值。
解决方案如下:
读取当前值后、将其与初始值进行比较、如果小于初始值、请将 UDCPx 与当前值相加。
void delay(MicroSeconds period_value) { Uint64 initial_time; Uint64 current_time; get_current_timer_value(initial_time); Uint64 ticks_value = convert_microsec_to_ticks_values(period_value); do { get_current_timer_value(current_time); if(current_time < initial_time) { current_time = current_time + rtiREG->CMP[0].UDCPx; } } while ( (current_time - initial_time) < ticks_value ); return; }
——
谢谢、此致、
Jagadish。