如果不满足条件,我想在2秒后退出此循环。如果时钟频率为32MHz,我会在这里提出什么值。
while(((READ_REG(ADC_NEW) & ADC_DATA) == 0) && (--timeout > 0));
答案 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
这真的不是超时的方法。相反,有一个周期性的定时器中断运行,并在那里没有时间处理。
更新:如果您启用了中断,则此解决方案的所有投注均已关闭。