thanks for the reply, i use select because the read function does not work well, so i try it maybe you could see my other topics<div><br></div><div><br></div><div style="font-size: 12px;font-family: Arial Narrow;padding:2px 0 2px 0;">------------------ 原始邮件 ------------------</div><div style="font-size: 12px;background:#efefef;padding:8px;"><div><b>发件人:</b> "Chris Johns"<chrisj@rtems.org>; </div><div><b>发送时间:</b> 2019年3月24日(星期天) 中午11:31</div><div><b>收件人:</b> "787562067"<googcheng@qq.com>; "users"<users@rtems.org>; </div><div><b>主题:</b> Re: rtems-net: network sema obtain: network not initialised error</div></div><div><br></div>On 22/3/19 9:44 pm, 787562067 wrote:<br/>> I called select function , why report this error?<br/><br/>You see this error because the network stack that provides the select call is<br/>not initialised. The select call in the legacy stack (in the RTEMS source tree)<br/>is only for network sockets file descriptors.<br/><br/>Select is specialised for network sockets to make it easy to port standard<br/>networking code.<br/><br/>> Hello, I'm waiting for input..<br/>> \0wait 5s <br/>> select begin<br/>> rtems-net: network sema obtain: network not initialised<br/>> <br/>> <br/>> <br/>> code:<br/>> =============================<br/>> int uart_recv(int fd, char *rcv_buf,int data_len)  <br/><br/>Initialising the network stack will not work with a UART file descriptor, the<br/>select call in the legacy stack is specialised to work only with network sockets.<br/><br/>RTEMS is real-time and threading is used rather than a select type design.<br/>Because threads or tasks are available users tend to create a thread for each<br/>resource you would block on in select and you just call read and block there.<br/>This approach gives you a better design because the overhead to multiplex and<br/>demultiplex descriptors in a select call is avoided and the slowest path latency<br/>for a single select loop for multiple descriptors is avoided.<br/><br/>> {  <br/>>     int len,fs_sel;  <br/>>     fd_set fs_read;  <br/>>      <br/>>     struct timeval time;  <br/>>      <br/>>     FD_ZERO(&fs_read);  <br/>>     FD_SET(fd,&fs_read);  <br/>>      <br/>>     time.tv_sec = 4;  <br/>>     time.tv_usec = 0;  <br/>>      <br/>>     printf("select begin\n");<br/>>     fs_sel = select(fd+1,&fs_read,NULL,NULL,&time);  <br/><br/>Why no just call read and block? You use termios to control timeouts when waiting?<br/><br/>Chris<br/><br/>>     printf("fs_sel = %d\n",fs_sel);  <br/>>     if(fs_sel)  <br/>>     {  <br/>> len = read(fd,rcv_buf,data_len);  <br/>> printf("I am right!(version1.2) len = %d fs_sel = %d\n",len,fs_sel);  <br/>> return len;  <br/>>     }  <br/>>     else  <br/>>     {  <br/>> printf("Sorry,I am wrong!");  <br/>> return FALSE;  <br/>>     }       <br/>> } <br/>> <br/>> <br/>> <br/>> <br/>> _______________________________________________<br/>> users mailing list<br/>> users@rtems.org<br/>> http://lists.rtems.org/mailman/listinfo/users<br/>> <br/>