<font face="Default Sans Serif,Verdana,Arial,Helvetica,sans-serif" size="2"><font face="Verdana, Arial, Helvetica, sans-serif"><span style="font-size: 12.8px;">hello £º</span></font><div><font face="Verdana, Arial, Helvetica, sans-serif"><span style="font-size: 12.8px;"><span style="white-space:pre">       </span>env : all case test on xilinx zynqmp ultra96 board with 4 A53 (smp)</span></font></div><div><font face="Verdana, Arial, Helvetica, sans-serif"><span style="font-size: 12.8px;"><span style="white-space:pre">     </span>bsp : xilinx zynqmp ultra96</span></font></div><div><font face="Verdana, Arial, Helvetica, sans-serif"><span style="font-size: 12.8px;"><span style="white-space:pre">     </span>version: rtems 5.1</span></font></div><div><font face="Verdana, Arial, Helvetica, sans-serif"><span style="font-size: 12.8px;"><br></span></font></div><div><font face="Verdana, Arial, Helvetica, sans-serif"><span style="font-size: 12.8px;">I see,RTEMS have three console driver to use, but all driver are does not work properly in same case. Description and analysis are as follows</span></font></div><div><font face="Verdana, Arial, Helvetica, sans-serif"><span style="font-size: 12.8px;"><br></span></font></div><div><font face="Verdana, Arial, Helvetica, sans-serif"><span style="font-size: 12.8px;">1.CONFIGURE_APPLICATION_NEEDS_SIMPLE_CONSOLE_DRIVER</span></font></div><div><font face="Verdana, Arial, Helvetica, sans-serif"><span style="font-size: 12.8px;"><span style="white-space:pre">      </span>This driver do not work very well on SMP. If i create 4 task , all task use printf to output  message, all message are out-of-order.</span></font> </div><div><span style="font-size: 12.8px;">Maybe the function "_Console_simple_Write" shoule be locke when output message( Maybe this will affect concurrency ) . My test code like follows</span></div><div><span style="font-size: 12.8px;">==========================</span></div><div><div style=""><span style="font-size: 12.8px;"> #include "consolesimple.h"</span></div><div style=""><span style="font-size: 12.8px;"> </span></div><div style=""><span style="font-size: 12.8px;">+RTEMS_INTERRUPT_LOCK_DEFINE( static, rtems_zynq_uart_bsp_lock, "rtems_zynq_uart_bsp_lock" );</span></div><div style=""><span style="font-size: 12.8px;"> static ssize_t _Console_simple_Write(</span></div><div style=""><span style="font-size: 12.8px;">   rtems_libio_t *iop,</span></div><div style=""><span style="font-size: 12.8px;">   const void    *buffer,</span></div><div style=""><span style="font-size: 12.8px;">@@ -48,9 +49,12 @@ static ssize_t _Console_simple_Write(</span></div><div style=""><span style="font-size: 12.8px;">   buf = buffer;</span></div><div style=""><span style="font-size: 12.8px;">   n = (ssize_t) count;</span></div><div style=""><span style="font-size: 12.8px;"> </span></div><div style=""><span style="font-size: 12.8px;">+  rtems_interrupt_lock_context lock_context;</span></div><div style=""><span style="font-size: 12.8px;">+  rtems_interrupt_lock_acquire(&rtems_zynq_uart_bsp_lock, &lock_context);</span></div><div style=""><span style="font-size: 12.8px;">   for ( i = 0; i < n; ++i ) {</span></div><div style=""><span style="font-size: 12.8px;">     rtems_putc( buf[ i ] );</span></div><div style=""><span style="font-size: 12.8px;">   }</span></div><div style=""><span style="font-size: 12.8px;">+  rtems_interrupt_lock_release(&rtems_zynq_uart_bsp_lock, &lock_context);</span></div><div style=""><span style="font-size: 12.8px;"> </span></div><div style=""><span style="font-size: 12.8px;">   return n;</span></div><div style=""><span style="font-size: 12.8px;"> }</span></div></div><div><span style="font-size: 12.8px;"><br></span></div><div><span style="font-size: 12.8px;">==========================</span></div><div><span style="font-size: 12.8px;"><br></span></div><div><span style="font-size: 12.8px;">2.CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER</span></div><div><span style="font-size: 12.8px;"><span style="white-space:pre">       </span>When I use this driver On smp , the RTEMS will crash.</span></div><div><span style="font-size: 12.8px;"><span style="white-space:pre">   </span>My test case like this : create 4 task , all task use printf to output  message,After some time, the system will crash.</span></div><div><span style="font-size: 12.8px;"><br></span></div><div><span style="font-size: 12.8px;"><br></span></div><div><span style="font-size: 12.8px;">3.CONFIGURE_APPLICATION_NEEDS_SIMPLE_CONSOLE_DRIVER</span></div><div><span style="font-size: 12.8px;"><span style="white-space:pre">   </span>This driver has a bug. If this BUG is triggered, the shell will work abnormally, such that top command (and other commands) will not display any information, all printf will return -1,because  the console is EOF .</span> And let the system run for a while after this BUG appears, it may crash </div><div><span style="white-space:pre"> </span><span style="font-size: 12.8px;">analysis are as follows:</span></div><div><span style="font-size: 12.8px;"><span style="white-space:pre">       </span>I find _Console_simple_task_Write will return 0  when _Console_simple_task_Instance.buf if full.code follows</span></div><div><span style="font-size: 12.8px;"><br></span></div><div><span style="font-size: 12.8px;">==========================</span></div><div><div style=""><span style="font-size: 12.8px;">static ssize_t _Console_simple_task_Write(</span></div><div style=""><span style="font-size: 12.8px;">  rtems_libio_t *iop,    </span></div><div style=""><span style="font-size: 12.8px;">  const void    *buffer, </span></div><div style=""><span style="font-size: 12.8px;">  size_t         count   </span></div><div style=""><span style="font-size: 12.8px;">)                        </span></div><div style=""><span style="font-size: 12.8px;">{</span></div><div style=""><span style="font-size: 12.8px;">  ...............</span></div><div style=""><span style="font-size: 12.8px;">    rtems_interrupt_lock_release( &cons->buf_lock, &lock_context );   </span></div><div style=""><span style="font-size: 12.8px;">                                                                      </span></div><div style=""><span style="font-size: 12.8px;">    if ( junk == 0 ) {                                                </span></div><div style=""><span style="font-size: 12.8px;">      break;                                                                                                           </span></div><div style=""><span style="font-size: 12.8px;">    }                                                                 </span></div><div style=""><span style="font-size: 12.8px;">  }                                                                   </span></div><div style=""><span style="font-size: 12.8px;">                                                                      </span></div><div style=""><span style="font-size: 12.8px;">  rtems_event_system_send( cons->task, RTEMS_EVENT_SYSTEM_SERVER );   </span></div><div style=""><span style="font-size: 12.8px;">                                                                      </span></div><div style=""><span style="font-size: 12.8px;">                                                                                              </span></div><div style=""><span style="font-size: 12.8px;">  return (ssize_t) ( count - todo );       //      can not return 0                      </span></div><div style=""><span style="font-size: 12.8px;">}</span></div></div><div><span style="font-size: 12.8px;">==========================</span></div><div><span style="font-size: 12.8px;"><br></span></div><div><span style="font-size: 12.8px;"><span style="white-space:pre"> </span>if junk is 0 , return will be 0, but you can see NEWLIBC code , when _Console_simple_task_Write  return 0 , then fd will become EOF (see trace _puts_r ---> __sfvwrite_r --->_fflush_r ---->__sflush_r  ).</span> so maybe there can not return 0.  </div><div><span style="font-size: 12.8px;"><span style="white-space:pre">   </span>I find when junk == 0 , use "break" , maybe Perhaps to resolve scheduling deadlocks (the _Console_simple_task_Task's  priority  is too low,when other high priority  output  , _Console_simple_task_Task and and high priority task will deadlock).but i think this function can not return 0 .  maybe i will drop some message . and  always return then len of the mesage. </span></div><div><span style="font-size: 12.8px;"><span style="white-space:pre">  </span>the task priority  should config by USER . so user can configure priority correctly.</span></div><div><span style="white-space:pre">     </span><span style="font-size: 12.8px;">My test code follow , the priority  of _Console_simple_task_Task use 128 (some as my other task , and all other us time slice). I testd and work well.</span> </div><div><span style="font-size: 12.8px;"><br></span></div><div><span style="font-size: 12.8px;">==========================</span></div><div><span style="font-size: 12.8px;"><br></span></div><div><div style=""><span style="font-size: 12.8px;">static Console_simple_task_Control _Console_simple_task_Instance;</span></div><div style=""><span style="font-size: 12.8px;"> </span></div><div style=""><span style="font-size: 12.8px;">+</span></div><div style=""><span style="font-size: 12.8px;">+size_t lcx_head;</span></div><div style=""><span style="font-size: 12.8px;">+size_t lcx_tail;</span></div><div style=""><span style="font-size: 12.8px;">+</span></div><div style=""><span style="font-size: 12.8px;"> static size_t _Console_simple_task_Capacity(</span></div><div style=""><span style="font-size: 12.8px;">   const Console_simple_task_Control *cons</span></div><div style=""><span style="font-size: 12.8px;"> )</span></div><div style=""><span style="font-size: 12.8px;">@@ -97,6 +102,10 @@ static ssize_t _Console_simple_task_Write(</span></div><div style=""><span style="font-size: 12.8px;"> </span></div><div style=""><span style="font-size: 12.8px;">     junk = _Console_simple_task_Capacity( cons );</span></div><div style=""><span style="font-size: 12.8px;"> </span></div><div style=""><span style="font-size: 12.8px;">     if ( junk > todo ) {</span></div><div style=""><span style="font-size: 12.8px;">       junk = todo;</span></div><div style=""><span style="font-size: 12.8px;">     }</span></div><div style=""><span style="font-size: 12.8px;">@@ -116,15 +125,23 @@ static ssize_t _Console_simple_task_Write(</span></div><div style=""><span style="font-size: 12.8px;"> </span></div><div style=""><span style="font-size: 12.8px;">     cons->head = head;</span></div><div style=""><span style="font-size: 12.8px;"> </span></div><div style=""><span style="font-size: 12.8px;">     rtems_interrupt_lock_release( &cons->buf_lock, &lock_context );</span></div><div style=""><span style="font-size: 12.8px;"> </span></div><div style=""><span style="font-size: 12.8px;">     if ( junk == 0 ) {</span></div><div style=""><span style="font-size: 12.8px;">-      break;</span></div><div style=""><span style="font-size: 12.8px;">+      //break;</span></div><div style=""><span style="font-size: 12.8px;">+      continue;</span></div><div style=""><span style="font-size: 12.8px;">     }</span></div><div style=""><span style="font-size: 12.8px;">   }</span></div><div style=""><span style="font-size: 12.8px;"> </span></div><div style=""><span style="font-size: 12.8px;">   rtems_event_system_send( cons->task, RTEMS_EVENT_SYSTEM_SERVER );</span></div><div style=""><span style="font-size: 12.8px;"> </span></div><div style=""><span style="font-size: 12.8px;">   return (ssize_t) ( count - todo );</span></div><div style=""><span style="font-size: 12.8px;"> }</span></div><div style=""><span style="font-size: 12.8px;"><br></span></div><div style=""><span style="font-size: 12.8px;"><br></span></div><div style=""><span style="font-size: 12.8px;">@@ -235,7 +256,8 @@ void _Console_simple_task_Initialize( void )</span></div><div style=""><span style="font-size: 12.8px;"> </span></div><div style=""><span style="font-size: 12.8px;">   rtems_task_create(</span></div><div style=""><span style="font-size: 12.8px;">     rtems_build_name('C', 'O', 'N', 'S'),</span></div><div style=""><span style="font-size: 12.8px;">-    RTEMS_MAXIMUM_PRIORITY - 1,</span></div><div style=""><span style="font-size: 12.8px;">+    //RTEMS_MAXIMUM_PRIORITY - 1,</span></div><div style=""><span style="font-size: 12.8px;">+    128,</span></div><div style=""><span style="font-size: 12.8px;">     RTEMS_MINIMUM_STACK_SIZE,</span></div><div style=""><span style="font-size: 12.8px;">     RTEMS_DEFAULT_ATTRIBUTES,</span></div><div style=""><span style="font-size: 12.8px;">     RTEMS_DEFAULT_MODES,</span></div><div style="font-size: 12.8px;"><br></div></div><div><span style="font-size: 12.8px;"><br></span></div><div><span style="font-size: 12.8px;">==========================</span></div><div></div></font>