编程方法的建议

选择编程方法

您可能对在微处理器上使用while(1)主循环进行状态轮询,或是大多数脚本那样的,一步一步顺序实现功能的过程编程方式颇为熟悉。 在很多情况下,这种方法非常简单直接,利于理解且能工作。但是,这里提供的很多API需要消耗很多时间才能完成(如,使充电器进入QC2.0模式大概需要两秒,或是您需要等待用户按键输入), 如果您的应用能够接受这样的等待,这样实现也没有什么问题。但是,在很多情况下,例如,您需要不断在屏幕上刷新读数,这样的编程方法会不理想,因为这意味着您的读数会卡住很长时间。要消耗很多时间的API通常都会提供一个可选参数,您可以为耗时操作的完成设置一个回调函数,有的特殊事件也允许用户设置回调函数(例如, PD的Source_Capability消息被收到),这使您可以使用事件驱动的方式来编程。

如果您的程序不需要调用耗时或者需要等待某个事件到来的API,且您的程序可以接受卡住的情况,您也许应该选择过程编程。

如果您的程序不能接受由于耗时操作带来的卡顿,您也许应该选择事件驱动的编程方法。

使用过程编程的建议

1.如果您选择过程编程,不要设置任何事件处理程序,因为他们永远不会被调用。事件处理程序只会在您的脚本退出后,执行器进入事件循环时才可能被执行。在这之前,执行权完全由您的脚本掌控,事件循环没有机会被执行。

2.由于您不需要事件循环,您应当在您的脚本退出时调用os.exit(), 不要让解释器在读到您的脚本末尾时自动退出,因为那样执行器会进入事件循环,您的程序也会一直处于运行状态,需要外部终止信号才能完全停止(例如您在表头上操作要求终止程序,或者在上位机上操作终止程序)。

使用事件驱动编程的建议

1.您需要在您的脚本中打开需要使用的资源,声明和创建事件及其回调函数(如,用于刷新屏幕的定时器回调函数),然后让解释器在读到您的脚本末尾后自然退出。之后执行器进入事件循环,接下来您的代码的行为将完全取决于您刚刚建立的各种事件。

2.当您要调用一个耗时的API时,确保您给它传递了一个在操作完成时调用的回调函数,不要在任何回调函数中占用太多CPU时间,因为这会让其他事件的回调函数无法被执行。

3.不要在回调函数中使用delay.ms(), 它将阻塞线程并导致其他事件无法被触发。如果您想要在一定时间后执行某项操作,请使用tmr

4.您可以调用os.exit()结束事件循环完全退出程序。