时序问题C嵌入式

时间:2015-06-02 13:19:51

标签: c timer embedded

如果不满足条件,我想在2秒后退出此循环。如果时钟频率为32MHz,我会在这里提出什么值。

while(((READ_REG(ADC_NEW) & ADC_DATA) == 0) && (--timeout > 0));

3 个答案:

答案 0 :(得分:2)

为什么不使用基于计时器的解决方案?

喜欢

volatile bool adc_timeout_flag;

//configure timer for a desired frequency
config_timeout_tim();

//some code here

while(condition_for_adc_not_met() && (adc_timeout_flag == false));
adc_timeout_flag = false;
//something

void timerISR(void) {
  static uint32_t tim;
  ++tim;
  if (tim > TIM_MAX) {
    tim = 0;
    adc_timeout_flag = true;
  }
}

答案 1 :(得分:2)

您确定的任何值可能会有所不同,具体取决于:

  • 处理器架构/指令集。
  • 变量是位于片内存储器,外部存储器还是寄存器中。
  • 不同的编译器选项,例如优化级别。

在几乎任何情况下,使用简单的循环计数器作为计时器是一个糟糕的选择 - 只需使用升级的编译器重建代码可能会影响其时序。

大多数微控制器都有某种定时装置;并且您应该使用其中一个来提供确定性的定时源。最简单的方法是,初始化定时器以增加中断的滴答计数器,然后在循环中轮询该计数器。

所以给出了伪代码:

s/(<a\b[^<]*?|(?<!^)\G)([^\/]*?)%20(?=(?![^\/]*\.jpg">)[^\/"]*">)/\1\2-/g

请注意,这是伪代码 - 真正的代码将是硬件/编译器特定的,如果static volatile unsigned sys_tick = 0 ; __interrupt tickHandler() { sys_tick++ ; } unsigned getTick() { return sys_tick ; } 访问在您的目标上不是原子的,则需要额外的代码。

然后你的循环变为:

unsigned

如果您的目标标准库已经实现了unsigned start = getTick() ; while( READ_REG(ADC_NEW) & ADC_DATA) == 0 && (getTick() - start) < TICKS_PER_SECOND * 2 ) ; ,或者您已将其重新定位到您的硬件,那么您已经获得了必要的时间支持:

clock()

答案 2 :(得分:1)

答案的基础如下:

time_outvalue = timeout_seconds / ( ( 1 / 32,000,000 ) * instructions_in_loop )

假设(并且这个假设是错误的!)有三个指令(一个用于READ_REG,一个用于比较,一个用于timeout--),你得到的值约为21,333,333

这真的不是超时的方法。相反,有一个周期性的定时器中断运行,并在那里没有时间处理。

更新:如果您启用了中断,则此解决方案的所有投注均已关闭。