如何通过配置Time0定时器来修改micros函数溢出时间为24个小时-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 2312|回复: 8

[未解决] 如何通过配置Time0定时器来修改micros函数溢出时间为24个小时

[复制链接]
发表于 2021-8-6 10:44 | 显示全部楼层 |阅读模式
如何通过配置Time0定时器来修改micros函数溢出时间为24个小时
发表于 2021-8-6 22:24 | 显示全部楼层
柳梓铭 发表于 2021-8-6 19:23
意思是改成usigned long long型吗

你搞不定的。

从帖子来看,应该是遇到了什么长计时又要精度的需求,但实际上此时应该变化的是 LZ 的程序结构,而非改装 micros 使满足这个过分的需求。
当 LZ 连自己的程序结构都不太能控制好的时候,改装库简直太难。

非要做的话,我说下几个关键点:

1. 是的,需要改装为 unsigned long long (64bit)返回数值,但 GCC 编译器是否支持、如何支持需要你调整 MAKEFILE;
2. 除了函数返回值,函数涉及的全局变量 wiring.c : timer0_overflow_count 都要调整为 64bit 的,才能确保真正能走到这一步;
3. 由于 AVR 是 8bit 单片机,强行走 64bit 需要超多次运算,每个 64bit++ 大致需要 1us加载、1us运算、1us写回这样的时间量级,
   因而你需要评估代码当中的运行时间对于测量 us 的影响,必要时可能需要汇编调整指令,确保测出来的 us 是有效的。
4. 当前 Arduino 结构已经有 micros 函数结构,你需要评估两种方案:①在原始库上改,②另写个新的 my_micros 函数
   前者动底层库,对其他依赖于这个函数(例如 Serial)的高层库的稳定性都有影响,程序容易有莫名BUG;
   后者需要受制于前者,比如 TIMER0 已经设定为 64 分频计数,你就不能想当然的改寄存器让满足你的新函数。

所以建议 LZ 改自己的程序结构,那样还能简单点。
发表于 2021-8-6 12:40 | 显示全部楼层
那你用millis()不就行了
 楼主| 发表于 2021-8-6 14:55 | 显示全部楼层
XlinliY.Zhang 发表于 2021-8-6 12:40
那你用millis()不就行了

millis()的精度就不是1us了
发表于 2021-8-6 18:26 | 显示全部楼层
柳梓铭 发表于 2021-8-6 14:55
millis()的精度就不是1us了

24h = 86400s = 86400_000000 us

LZ 自己数一下这是几位数,早就超过了 uint32_t 最大计数了。
结论:除非重写 micros,否则不可能。
 楼主| 发表于 2021-8-6 19:23 | 显示全部楼层
本帖最后由 柳梓铭 于 2021-8-7 15:58 编辑
t3486784401 发表于 2021-8-6 18:26
24h = 86400s = 86400_000000 us

LZ 自己数一下这是几位数,早就超过了 uint32_t 最大计数了。

意思是改成unsigned long long型吗
 楼主| 发表于 2021-8-6 19:27 | 显示全部楼层
t3486784401 发表于 2021-8-6 18:26
24h = 86400s = 86400_000000 us

LZ 自己数一下这是几位数,早就超过了 uint32_t 最大计数了。

大佬,请问如果书重写micros函数,该怎么写
 楼主| 发表于 2021-8-7 08:53 | 显示全部楼层
t3486784401 发表于 2021-8-6 22:24
你搞不定的。

从帖子来看,应该是遇到了什么长计时又要精度的需求,但实际上此时应该变化的是 LZ 的程序 ...

好的,谢谢谢谢
发表于 2021-12-8 14:40 来自手机 | 显示全部楼层
晶振估计都没有这个精度吧,这么长时间累计下来肯定不止1us的误差。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-11-28 19:41 , Processed in 0.083866 second(s), 16 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表