Procházet zdrojové kódy

【完善】stdout stream 模式的对接。

Signed-off-by: armink <armink.ztl@gmail.com>
armink před 6 roky
rodič
revize
3d4566441f
4 změnil soubory, kde provedl 19 přidání a 13 odebrání
  1. 1 1
      port/mphalport.c
  2. 17 3
      port/mpputsnport.c
  3. 1 0
      port/mpputsnport.h
  4. 0 9
      port/mpy_main.c

+ 1 - 1
port/mphalport.c

@@ -54,7 +54,7 @@ void mp_hal_stdout_tx_strn(const char *str, mp_uint_t len) {
 }
 
 void mp_hal_stdout_tx_strn_stream(const char *str, size_t len) {
-    mp_putsn(str, len);
+    mp_putsn_stream(str, len);
 }
 
 mp_uint_t mp_hal_ticks_us(void) {

+ 17 - 3
port/mpputsnport.c

@@ -29,6 +29,7 @@
 
 static rt_device_t console_dev = NULL;
 static struct rt_device dummy_console = { 0 };
+static rt_uint16_t console_open_flag;
 
 void mp_putsn(const char *str, size_t len) {
     if (console_dev) {
@@ -36,24 +37,36 @@ void mp_putsn(const char *str, size_t len) {
     }
 }
 
+void mp_putsn_stream(const char *str, size_t len) {
+    if (console_dev) {
+        rt_uint16_t old_flag = console_dev->open_flag;
+
+        console_dev->open_flag |= RT_DEVICE_FLAG_STREAM;
+        rt_device_write(console_dev, 0, str, len);
+        console_dev->open_flag = old_flag;
+    }
+}
+
 void mp_putsn_init(void) {
     {/* register dummy console device */
 #ifdef RT_USING_DEVICE_OPS
-        static struct rt_device_ops _ops = {.ops = &_ops};
+        static struct rt_device_ops _ops = {0};
+        dummy_console.ops = &_ops
 #endif
 
         dummy_console.type = RT_Device_Class_Char;
 
-        rt_device_register(&dummy_console, "dummy", RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_STREAM);
+        rt_device_register(&dummy_console, "dummy", RT_DEVICE_FLAG_RDWR);
     }
 
     /* backup the console device */
     console_dev = rt_console_get_device();
+    console_open_flag = console_dev->open_flag;
 
     /* set the new console device to dummy console */
     rt_console_set_device(dummy_console.parent.name);
     /* reopen the old console device for mp_putsn */
-    rt_device_open(console_dev, RT_DEVICE_OFLAG_RDWR | RT_DEVICE_FLAG_INT_RX | RT_DEVICE_FLAG_STREAM);
+    rt_device_open(console_dev, RT_DEVICE_OFLAG_RDWR | RT_DEVICE_FLAG_INT_RX);
 }
 
 void mp_putsn_deinit(void) {
@@ -61,6 +74,7 @@ void mp_putsn_deinit(void) {
     rt_device_close(console_dev);
     /* restore the old console device */
     rt_console_set_device(console_dev->parent.name);
+    console_dev->open_flag = console_open_flag;
 
     rt_device_unregister(&dummy_console);
 }

+ 1 - 0
port/mpputsnport.h

@@ -30,5 +30,6 @@
 void mp_putsn_init(void);
 void mp_putsn_deinit(void);
 void mp_putsn(const char *str, size_t len);
+void mp_putsn_stream(const char *str, size_t len);
 
 #endif /* _MPPUTCHARPORT_H_ */

+ 0 - 9
port/mpy_main.c

@@ -69,7 +69,6 @@ static char *heap = RT_NULL;
 void mpy_main(const char *filename) {
     int stack_dummy;
     stack_top = (void *)&stack_dummy;
-    rt_uint16_t old_flag;
 
     mp_getchar_init();
     mp_putsn_init();
@@ -105,11 +104,6 @@ void mpy_main(const char *filename) {
     mp_obj_list_init(mp_sys_argv, 0);
     readline_init0();
 
-    /* Save the open flag */
-    old_flag = rt_console_get_device()->open_flag;
-    /* clean the stream flag. stream flag will automatically append '\r' */
-    rt_console_get_device()->open_flag &= ~RT_DEVICE_FLAG_STREAM;
-
     if (filename) {
 #ifndef MICROPYTHON_USING_UOS
         rt_kprintf("Please enable uos module in sys module option first.\n");
@@ -149,9 +143,6 @@ void mpy_main(const char *filename) {
         }
     }
 
-    /* restore the open flag */
-    rt_console_get_device()->open_flag = old_flag;
-
     gc_sweep_all();
 
     mp_deinit();