uint32_t result;
cli();
uint16_t my_tcnt = TCNT1;
__sync_synchronize(); // memory barrier
if ((TIFR1 & (1 << TOV1))) {
// Timer overflowed but interrupt hasn't run yet,
// and it won't here because we cli.
// Re-capture TCNT1 to make sure we get a post-overflow sample,
// and use ovfs+1 for the result.
result = (((TimeType)(ovfs + 1) << 16) + TCNT1);
} else {
// Timer hasn't yet overflowed when we captured TCNT,
// and cli makes sure ovfs is consistent with my_tcnt.
result = (((TimeType)ovfs << 16) + my_tcnt);
}
sei();
dWludDMyX3QgcmVzdWx0OwoKY2xpKCk7CnVpbnQxNl90IG15X3RjbnQgPSBUQ05UMTsKX19zeW5jX3N5bmNocm9uaXplKCk7IC8vIG1lbW9yeSBiYXJyaWVyCmlmICgoVElGUjEgJiAoMSA8PCBUT1YxKSkpIHsKICAgIC8vIFRpbWVyIG92ZXJmbG93ZWQgYnV0IGludGVycnVwdCBoYXNuJ3QgcnVuIHlldCwKICAgIC8vIGFuZCBpdCB3b24ndCBoZXJlIGJlY2F1c2Ugd2UgY2xpLgogICAgLy8gUmUtY2FwdHVyZSBUQ05UMSB0byBtYWtlIHN1cmUgd2UgZ2V0IGEgcG9zdC1vdmVyZmxvdyBzYW1wbGUsCiAgICAvLyBhbmQgdXNlIG92ZnMrMSBmb3IgdGhlIHJlc3VsdC4KICAgIHJlc3VsdCA9ICgoKFRpbWVUeXBlKShvdmZzICsgMSkgPDwgMTYpICsgVENOVDEpOwp9IGVsc2UgewogICAgLy8gVGltZXIgaGFzbid0IHlldCBvdmVyZmxvd2VkIHdoZW4gd2UgY2FwdHVyZWQgVENOVCwKICAgIC8vIGFuZCBjbGkgbWFrZXMgc3VyZSBvdmZzIGlzIGNvbnNpc3RlbnQgd2l0aCBteV90Y250LgogICAgcmVzdWx0ID0gKCgoVGltZVR5cGUpb3ZmcyA8PCAxNikgKyBteV90Y250KTsKfQpzZWkoKTsK