volatile的用法以及在单片机寄存器中的现实作用

volatile的用法以及在单片机寄存器中的实际作用
#ifdef __cplusplus
  #define     __I     volatile              
#else
  #define     __I     volatile const         
#endif
#define     __O     volatile                 
#define     __IO    volatile

void Delay(__IO uint32_t nCount)	
{
for(; nCount != 0; nCount--);
}

请问大神:关于这里使用__IO uint32_t nCount,请问这里为什么使用__IO呢?使用__I或者使用__O可以吗?为什么?
请大神指教,谢谢啊
------解决思路----------------------
const 表示只读,只用作输入、不能,只是增加可读性