gpt4 book ai didi

c - 相当于Arduino millis()

转载 作者:太空宇宙 更新时间:2023-11-03 23:41:08 26 4
gpt4 key购买 nike

我目前正在研究将“分流”型传感器集成到电子板上。我选择了 Linear (LTC2947),不幸的是它只有一个 Arduino 驱动器。我必须在 Linux 下翻译 C 中的所有内容以与我的微处理器(APQ8009 ARM Cortex-A7)兼容。我对其中一个功能有一个小问题:

int16_t LTC2947_wake_up() //Wake up LTC2947 from shutdown mode and measure the wakeup time
{
byte data[1];
unsigned long wakeupStart = millis(), wakeupTime;
LTC2947_WR_BYTE(LTC2947_REG_OPCTL, 0);
do
{
delay(1);
LTC2947_RD_BYTE(LTC2947_REG_OPCTL, data);
wakeupTime = millis() - wakeupStart;
if (data[0] == 0) //! check if we are in idle mode
{
return wakeupTime;
}
if (wakeupTime > 200)
{
//! failed to wake up due to timeout, return -1
return -1;
}
}
while (true);
}

在找到 usleep() 等同于 delay() 之后,我在 C 中找不到 millis() 的它。你能帮我翻译这个函数吗?

最佳答案

Arduino millis() 基于一个定时器,该定时器在非常接近 1 KHz 或 1 毫秒时触发溢出中断。为实现同样的目的,我建议您在 ARM 平台上设置一个计时器,并使用计数器更新一个 volatile unsigned long 变量。这将等同于 millis()。

这是 millis() 在幕后所做的事情:

SIGNAL(TIMER0_OVF_vect)
{
// copy these to local variables so they can be stored in registers
// (volatile variables must be read from memory on every access)
unsigned long m = timer0_millis;
unsigned char f = timer0_fract;

m += MILLIS_INC;
f += FRACT_INC;
if (f >= FRACT_MAX) {
f -= FRACT_MAX;
m += 1;
}

timer0_fract = f;
timer0_millis = m;
timer0_overflow_count++;
}

unsigned long millis()
{
unsigned long m;
uint8_t oldSREG = SREG;

// disable interrupts while we read timer0_millis or we might get an
// inconsistent value (e.g. in the middle of a write to timer0_millis)
cli();
m = timer0_millis;
SREG = oldSREG;

return m;
}

来自嵌入式世界,可以说,在新平台上开始项目时,您应该做的第一件事就是建立时钟并让定时器中断以规定的速率运行。那就是嵌入式系统的“Hello World”。 ;) 如果您选择以 1 KHz 的频率执行此操作,那么您就成功了。

关于c - 相当于Arduino millis(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45306220/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com