cli();
uint32_t offset1 = offset;
uint16_t tcnt = TCNT1;
__sync_synchronize();
if (TIFR1 & (1 << TOV1)) {
// overflow happened, deal with it here and relieve the ISR from it
offset += UINT32_C(0x10000);
TIFR1 |= (1 << TOV1); // writing the flag clears it
offset1 = offset;
tcnt = TCNT1;
}
sei();
return (offset1 + tcnt);
cli();
uint32_t offset1 = offset;
uint16_t tcnt = TCNT1;
__sync_synchronize();
if (TIFR1 & (1 << TOV1)) {
// overflow happened, let the interrupt handle it
sei();
cli();
offset1 = offset;
tcnt = TCNT1;
}
sei();
return (offset1 + tcnt);
CiAgICAgICAgY2xpKCk7CiAgICAgICAgdWludDMyX3Qgb2Zmc2V0MSA9IG9mZnNldDsKICAgICAgICB1aW50MTZfdCB0Y250ID0gVENOVDE7CiAgICAgICAgX19zeW5jX3N5bmNocm9uaXplKCk7CiAgICAgICAgaWYgKFRJRlIxICYgKDEgPDwgVE9WMSkpIHsKICAgICAgICAgICAgLy8gb3ZlcmZsb3cgaGFwcGVuZWQsIGRlYWwgd2l0aCBpdCBoZXJlIGFuZCByZWxpZXZlIHRoZSBJU1IgZnJvbSBpdAogICAgICAgICAgICBvZmZzZXQgKz0gVUlOVDMyX0MoMHgxMDAwMCk7CiAgICAgICAgICAgIFRJRlIxIHw9ICgxIDw8IFRPVjEpOyAvLyB3cml0aW5nIHRoZSBmbGFnIGNsZWFycyBpdAogICAgICAgICAgICBvZmZzZXQxID0gb2Zmc2V0OwogICAgICAgICAgICB0Y250ID0gVENOVDE7CiAgICAgICAgfQogICAgICAgIHNlaSgpOwogICAgICAgIHJldHVybiAob2Zmc2V0MSArIHRjbnQpOwogICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgIAogICAgICAgIGNsaSgpOwogICAgICAgIHVpbnQzMl90IG9mZnNldDEgPSBvZmZzZXQ7CiAgICAgICAgdWludDE2X3QgdGNudCA9IFRDTlQxOwogICAgICAgIF9fc3luY19zeW5jaHJvbml6ZSgpOwogICAgICAgIGlmIChUSUZSMSAmICgxIDw8IFRPVjEpKSB7CiAgICAgICAgICAgIC8vIG92ZXJmbG93IGhhcHBlbmVkLCBsZXQgdGhlIGludGVycnVwdCBoYW5kbGUgaXQKICAgICAgICAgICAgc2VpKCk7CiAgICAgICAgICAgIGNsaSgpOwogICAgICAgICAgICBvZmZzZXQxID0gb2Zmc2V0OwogICAgICAgICAgICB0Y250ID0gVENOVDE7CiAgICAgICAgfQogICAgICAgIHNlaSgpOwogICAgICAgIHJldHVybiAob2Zmc2V0MSArIHRjbnQpOwogICAgICAgIA==