有没有想过这个问题:为什么在代码中写了一句printf("HelloWorld");,字符串HelloWorld就会从串口输出?
初级答案:因为包含了组件INCLUDE_SIO
CONSOLE_TTY指向的串口,就会以CONSOLE_BAUD_RATE的波特率输出字符
如果Target是x86或x64,也可能是显示器输出字符。那么答案就变为:包含了组件INCLUDE_PC_CONSOLE
那,printf()如何知道输出到哪个设备呢?
因为"PC console"或"SIO"会调用ioGlobalStdSet(),OS执行了类似于下图的代码
再看一下printf()相关的源码,就可以发现:printf()底层使用的就是consoleFd的write()操作
有兴趣的童鞋,可以继续扒一扒write()是如何关联到物理设备的,而我们今天的主题是:IO重定向
通过ioGlobalStdSet()就可以设置全局的STD_IN、STD_OUT和STD_ERR,参数newFd可以指向IO系统里的任意device,包括串口、Pipe、文件,以及socket。而ioTaskStdSet()用于操作单个任务taskId。跑个小栗子
参数taskId用的0,显然就表示操作当前任务自己了
另外,Kernel Shell本身也定义了重定向操作:
是不是有点意思