我试图将一个纯粹的Linux应用程序移植到OS X Snow Leopard(10.6.4)。 这是一个通过串口向目标硬件发送二进制文件的应用程序。 该应用程序几乎正在运行,但我遇到了与串口写入有趣的问题。
使用与Linux相同的设置(115.2k是波特率),与Linux相比,OS X串行数据发送似乎要慢10倍或更多。 在Linux中需要3秒,需要30-40秒,到那时在接收端的目标固件超时:)。
深入到串口写function,我看到它使用select()系统调用来查找设备(或文件描述符)是否准备好写入数据。 每个写系统调用在OS X中写入1024个字节的数据,在Linux中写入1087个字节的数据(这就是写入的返回值)。 我的数据大小是50KB的一级二进制文件(这是一个小型的引导程序,可以在下一级加载更大的二进制文件)。
伪代码
select() configuration with 1s time out and observing the serial port file descriptor for write ready. while(true) { rc=select(...) if(rc>0){write(...) and other logic to get out of while if done} if(rc==0){//try again} if(rc<0){//error} }
我观察到,在linux中,写一个接一个地发生。 一系列的写入,并以jiffy的forms出现在函数中。 但是,在OS X中,如同3个写入然后select两次(2秒后)再返回一些写入和select超时等等,使function慢很多。
任何线索?
注:该应用程序正在使用termios lib API来控制串行端口。
我可以通过更改多产品芯片设备驱动程序来解决这个问题。 默认情况下,它是使用非标准的开源驱动程序,我从多产的网站上下载了OS X驱动程序,并且工作正常。 感谢Nils和其他人的支持!