我有一个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的binutils
有objdump
来理解实际的osSleep
做什么。
很可能,它挂起在一个信号量上,这个信号量将被定时器tick ISR(直接或间接)切换不过,您的问题很有意思——文档中除了“此函数使进程在指定的时间间隔内休眠”之外,没有提到其他内容,但如果没有可用的程序运行,它肯定会使整个uC进入低功耗模式。