「已注销」 2021-05-08 11:09 采纳率: 33.3%
浏览 13

滴答定时器貌似直接用时钟周期进行计时,计时不应该是一个机器周期加一次么?

滴答定时器貌似直接用时钟周期进行计时,计时不应该是一个机器周期加一次么?

延迟函数直接使用系统时钟进行加一次,而没有除去12,为什么能直接计数呢

  • 写回答

1条回答 默认 最新

  • 码农阿豪@新空间 优质创作者: Java、后端开发技术领域 2024-07-06 14:36
    关注
    让阿豪来帮你解答,本回答参考chatgpt3.5编写提供,如果还有疑问可以评论或留言
    问题一:滴答定时器计时为什么不是一个机器周期加一次? 解答: 滴答定时器一般是用于精确计时和延迟的功能。它的计时方式通常是基于系统时钟的分频来实现的,而不是直接以机器周期为单位计数的。 机器周期是CPU执行一条指令所需要的时间,它的长度与CPU的设计有关,一般情况下是固定的。而滴答定时器需要实现的计时范围要更加广泛,通常要支持微秒级别的计时,因此直接以机器周期为单位计数并不方便。 滴答定时器通常由系统时钟发出的脉冲来驱动,每个脉冲到来时滴答定时器的计数器增加一。系统时钟一般会通过分频器来调整频率,从而实现不同精度的计时。例如,如果系统时钟的频率是1MHz,每个脉冲到来时滴答定时器的计数器就加1。这样一来,滴答定时器的计时精度就取决于系统时钟频率和分频设置。 案例: 假设系统时钟频率为1MHz,滴答定时器的分频系数为10。那么,滴答定时器每隔100个系统时钟周期,计数器的值就会加1。也就是说,滴答定时器的计时精度为100us。 代码示例(伪代码):
    initialize_tick_timer();
    while (1) {
        if (tick_timer_expired()) {
            // 执行相应的计时任务
            // ...
            reset_tick_timer();
        }
    }
    

    问题二:延迟函数为什么直接使用系统时钟进行加一次,而没有除去12? 解答: 延迟函数通常是用于在程序中实现一段指定时间的延迟。它的实现方式和滴答定时器有所不同。 延迟函数一般会使用一个较长的循环来进行延迟,具体的延迟时间取决于循环的执行次数。为了简化实现,常见的延迟函数会使用系统时钟作为循环计数的依据,而不是把系统时钟直接除以一个固定的数(如12)。 使用系统时钟来进行延迟可以保证延迟的时间相对稳定,不受不同系统时钟频率的影响。因为系统时钟通常是由晶振或其他稳定的时钟源提供的,其频率相对稳定。 案例: 假设系统时钟频率为1MHz,需要延迟10ms。延迟函数可以根据系统时钟的频率来计算所需的循环次数,以实现大致的延迟时间。 代码示例(C语言):

    void delay_ms(uint32_t ms) {
        // 1毫秒的延迟循环次数
        uint32_t delay_cycles = ms * (SystemCoreClock / 1000);
        for (uint32_t i = 0; i < delay_cycles; i++) {
            // 空循环
        }
    }
    

    需要注意的是,上述的延迟函数实现是简化的示例,实际中可能会根据具体的平台和编程环境进行调整。

    评论

报告相同问题?