我有一个C语言的微控制器代码。
根据我的示例,我使用函数“void osSleep(tU32 ticks)”来停止程序一段时间不幸的是,我不知道它是如何工作的,以及它对我的微控制器做了什么(哪些管脚、状态等被设置为什么值)。
我找到了setBuzzer()函数,因为它的来源是:

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

因此,与蜂鸣器相关的引脚(蜂鸣器引脚=0x00002000)的GPIO端口设置为1或0蜂鸣器有一个引脚,所以我可以启用和禁用它(高电压和低电压)。
我想对osSleep()做类似的分析,但奇怪的是,在整个代码中找不到它的实现,只有声明:
void osSleep(tU32 ticks);

也许那个函数在某个库中不管怎样,我想知道它到底是如何在较低的层次上工作的(例如,当我调用计时器时,计时器会发生什么情况,执行什么指令——就像在蜂鸣器示例中一样)。
此外,文档中只有一个高级的简短定义,用于嵌入式艺术家编写的名为“先发制人的操作系统v 1.4.0”的代码。

最佳答案

不幸的是,我不知道它是如何工作的,以及它对我的微控制器做了什么
如果无法获得消息来源,就无法确定尝试使用反汇编程序(例如GNU的binutilsobjdump来理解实际的osSleep做什么。
很可能,它挂起在一个信号量上,这个信号量将被定时器tick ISR(直接或间接)切换不过,您的问题很有意思——文档中除了“此函数使进程在指定的时间间隔内休眠”之外,没有提到其他内容,但如果没有可用的程序运行,它肯定会使整个uC进入低功耗模式。

09-12 10:05