c - void osSleep(tU32 ticks) - 它是如何工作的(微 Controller 中的定时器)?

标签 c timer microcontroller gpio

我有一个用 C 编写的微 Controller 代码。 根据我的示例,我使用函数“void osSleep(tU32 ticks)”来停止程序一段时间。不幸的是,我不知道它到底是如何工作的,也不知道它对我的微 Controller 做了什么(什么引脚、状态等被设置为什么值)。

我找到了 setBuzzer() 函数,因为我有它的源代码:

void setBuzzer(tBool on)
{
  if (TRUE == on)
    IOCLR = BUZZER_PIN;
  else
    IOSET = BUZZER_PIN;
}

因此GPIO端口设置为1或0为与蜂鸣器相关的PIN (BUZZER_PIN = 0x00002000)。蜂鸣器只有一个引脚,所以我可以启用和禁用它(高电压和低电压)。

我想对 osSleep() 做类似的分析,但奇怪的是,我在整个代码中找不到它的实现,只有声明:

void osSleep(tU32 ticks);

也许那个函数在某个库中。无论如何,我想知道它在较低级别上是如何工作的(例如,当我调用它时计时器会发生什么,执行什么指令 - 就像在蜂鸣器示例中一样)。

此外,Embedded Artists“Pre-emptive Operating System v 1.4.0”代码文档中只有一个高级简短定义。

最佳答案

Unfortunately, I don't know how it really works and what it does to my micro-controller

如果无法访问源代码,就无法确定。尝试使用反汇编器(例如 GNU 的 binutilsobjdump)来了解实际的 osSleep 做了什么。

很可能,它正在挂起一个信号量,该信号量将被定时器节拍 ISR 切换(直接或间接)。不过,您的问题很有趣——文档只提到“此函数使进程休眠指定的滴答数”。但如果没有可运行的,它肯定会使整个 uC 进入低功耗模式。

关于c - void osSleep(tU32 ticks) - 它是如何工作的(微 Controller 中的定时器)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13337404/

相关文章:

java - 如何在swing中调用一段时间内的方法?

c - 为什么我的 SPI 通讯不工作? (Atmega644)

c - 如何将位域及其内部的位传递给函数

javascript - CucumberJS - 错误 : Step timed out after 5000 milliseconds at Timer. listOnTimeout (timers.js:92:15)

c - c中数组分配的内存的哪一部分

c - 从结构中释放内存给出无效指针

C递归程序打印给定数字的所有素因数,从最大因数到最小因数

c - C 中多进程的描述和工作

c - 在链表中插入节点 C : expected node_t * but argument is of type node_t

ios - 如何激活和停用定时器?