允许ISR调用的Procedure(在TinyOS里被称为Async Command)。它可以在Main Thread中运行时,被ISR抢断调用。TinyOS对写Async函数的建议是:Programming Hint 3: Keep code synchronous when you can. Code should be async only if its timing is very important or if it might be used by something whose timing is important. 我实际看了一下TinyOS中Async函数的代码,绝大多数是动作非常快的硬件操作,在过程中全程使用atomic关键字(相当于关闭中断)。通常提供这样的功能的模块会完整封装一些底层硬件或者全局变量(如果用C++的话,那很好,这些变量就成了Local的了,在编译时就能保证隐蔽性),其他模块必须通过这个界面来访问底层硬件或者全局变量,否则就可能出现共享访问冲突。
所以在模块封装上,硬件、或者共享资源、或者一些需要原子性的工具过程(比如在16bit MCU上实现32bit运算的库),应该干脆独立封装,提供的所有方法均为Async方法。这样就很容易避免Shared Data Access问题。