Parcourir la source

Merge pull request #2 from Guozhanxin/systemview

更新rti软件包
朱天龙 (Armink) il y a 4 ans
Parent
commit
dc6875479e
4 fichiers modifiés avec 204 ajouts et 21 suppressions
  1. 5 0
      inc/rti.h
  2. 9 0
      samples/SConscript
  3. 138 0
      samples/rti_uart_sample.c
  4. 52 21
      src/rti.c

+ 5 - 0
inc/rti.h

@@ -28,6 +28,10 @@
 #include <rthw.h>
 #include "rti_config.h"
 
+#define   RTI_LOG                   (0u)
+#define   RTI_WARNING               (1u)
+#define   RTI_ERROR                 (2u)
+
 /* rti events. First 32 IDs from 0 .. 31 are Compatible for Systemvie */
 #define   RTI_ID_NOP                (0u)
 #define   RTI_ID_OVERFLOW           (1u)
@@ -127,5 +131,6 @@ void rti_trace_disable(rt_uint16_t flag);
 rt_size_t rti_data_get(rt_uint8_t *ptr, rt_uint16_t length);
 rt_size_t rti_buffer_used(void);
 void rti_data_new_data_notify_set_hook(void (*hook)(void));
+void rti_print(const char *s);
 
 #endif

+ 9 - 0
samples/SConscript

@@ -0,0 +1,9 @@
+from building import *
+
+cwd     = GetCurrentDir()
+src     = Glob('*.c') + Glob('*.cpp')
+CPPPATH = [cwd + '/../inc']
+
+group = DefineGroup('rti', src, depend = ['PKG_USING_RTI_UART_SAMPLE'], CPPPATH = CPPPATH)
+
+Return('group')

+ 138 - 0
samples/rti_uart_sample.c

@@ -0,0 +1,138 @@
+/*
+ * File      : rti_uart_sample.c
+ * This file is part of RT-Thread RTOS
+ * COPYRIGHT (C) 2006 - 2012, RT-Thread Development Team
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License along
+ *  with this program; if not, write to the Free Software Foundation, Inc.,
+ *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Change Logs:
+ * Date           Author       Notes
+ * 2018-06-05     flybreak     first version
+ */
+
+#include <rtthread.h>
+#include <rtdevice.h>
+
+#include "rti.h"
+
+#ifdef RT_USING_FINSH
+#include <finsh.h>
+#endif
+
+#ifndef PKG_RTI_UART_BAUD_RATE
+#define PKG_RTI_UART_BAUD_RATE   BAUD_RATE_460800
+#endif
+
+#define TRANSIT_BUF_SIZE         (PKG_RTI_BUFFER_SIZE / 8)
+#define RTI_UART_BAUD_RATE       (PKG_RTI_UART_BAUD_RATE)
+#define RTI_UART_NAME            "rti_uart"
+
+static rt_uint8_t transit_buf[TRANSIT_BUF_SIZE];
+static rt_device_t rti_dev;
+
+void rti_data_new_data_notify(void)
+{
+    int ret = rti_data_get(transit_buf, TRANSIT_BUF_SIZE);
+    rt_device_write(rti_dev, 0, transit_buf, ret);
+}
+
+rt_err_t rt_ind(rt_device_t dev, rt_size_t size)
+{
+    rti_data_new_data_notify_set_hook(rti_data_new_data_notify);
+    rti_start();
+    return 0;
+}
+
+void rti_uart_sample(void)
+{
+    struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT;
+
+    rti_dev = rt_console_get_device();
+
+#ifdef RT_USING_FINSH
+    finsh_set_device(RTI_UART_NAME);
+#endif
+    rt_console_set_device(RTI_UART_NAME);
+
+    rti_dev->open_flag &= ~RT_DEVICE_FLAG_STREAM;
+
+    config.baud_rate = RTI_UART_BAUD_RATE;
+    rt_device_control(rti_dev, RT_DEVICE_CTRL_CONFIG, &config);
+
+    rt_device_set_rx_indicate(rti_dev, rt_ind);
+    rt_device_open(rti_dev, RT_DEVICE_OFLAG_RDWR | RT_DEVICE_FLAG_INT_RX);
+}
+#ifdef RT_USING_FINSH
+MSH_CMD_EXPORT(rti_uart_sample, start record by uart.);
+#endif
+
+/*
+ * rti uart device
+ */
+
+#define RTI_UART_BUF             (128)
+static char uart_buf[RTI_UART_BUF];
+static struct rt_serial_device rti_serial;
+
+static rt_err_t rti_uart_configure(struct rt_serial_device *serial, struct serial_configure *cfg)
+{
+    return RT_EOK;
+}
+static rt_err_t rti_uart_control(struct rt_serial_device *serial, int cmd, void *arg)
+{
+    return RT_EOK;
+}
+static int rti_uart_putc(struct rt_serial_device *serial, char c)
+{
+    static int index = 0;
+    uart_buf[index++] = c;
+    if (c == '\n' || index == RTI_UART_BUF - 1)
+    {
+        uart_buf[index] = '\0';
+        rti_print(uart_buf);
+        index = 0;
+    }
+    return 1;
+}
+static int rti_uart_getc(struct rt_serial_device *serial)
+{
+    return -1;
+}
+
+static const struct rt_uart_ops rti_uart_ops =
+{
+    .configure = rti_uart_configure,
+    .control = rti_uart_control,
+    .putc = rti_uart_putc,
+    .getc = rti_uart_getc,
+    .dma_transmit = RT_NULL
+};
+
+static int rti_uart_init(void)
+{
+    struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT;
+    rt_err_t result = 0;
+
+    /* init rti_uart object */
+    rti_serial.ops    = &rti_uart_ops;
+    rti_serial.config = config;
+
+    /* register rti_uart device */
+    result = rt_hw_serial_register(&rti_serial, RTI_UART_NAME,
+                                   RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX,
+                                   NULL);
+    return result;
+}
+INIT_APP_EXPORT(rti_uart_init);

+ 52 - 21
src/rti.c

@@ -65,6 +65,7 @@ static void rti_isr_enter(void);
 static void rti_isr_exit(void);
 static void rti_isr_to_scheduler(void);
 static void rti_enter_timer(rt_uint32_t timer);
+static void rti_exit_timer(rt_uint32_t timer);
 static void rti_thread_start_exec(rt_uint32_t thread);
 static void rti_thread_stop_exec(void);
 static void rti_thread_start_ready(rt_uint32_t thread);
@@ -86,12 +87,13 @@ static rt_uint8_t *rti_encode_str(rt_uint8_t *present, const char *ptr, rt_uint8
 static rt_uint32_t rti_shrink_id(rt_uint32_t Id);
 
 /* rti hook functions */
-static void rti_timer_timeout(rt_timer_t t);
+static void rti_timer_enter(rt_timer_t t);
+static void rti_timer_exit(rt_timer_t t);
 static void rti_thread_inited(rt_thread_t thread);
 static void rti_thread_suspend(rt_thread_t thread);
 static void rti_thread_resume(rt_thread_t thread);
 static void rti_scheduler(rt_thread_t from, rt_thread_t to);
-static void rti_object_attach(rt_object_t object);
+//static void rti_object_attach(rt_object_t object);
 static void rti_object_detach(rt_object_t object);
 static void rti_interrupt_enter(void);
 static void rti_interrupt_leave(void);
@@ -103,18 +105,26 @@ static int rti_init(void);
 static rt_size_t rti_data_put(const rt_uint8_t *ptr, rt_uint16_t length);
 
 /* rti hook functions */
-static void rti_timer_timeout(rt_timer_t t)
+static void rti_timer_enter(rt_timer_t t)
 {
     if (!rti_status.enable || rti_status.disable_nest[RTI_TIMER_NUM])
         return ;
     rti_enter_timer((rt_uint32_t)t);
 }
 
+static void rti_timer_exit(rt_timer_t t)
+{
+    if (!rti_status.enable || rti_status.disable_nest[RTI_TIMER_NUM])
+        return ;
+    rti_exit_timer((rt_uint32_t)t);
+}
+
 static void rti_thread_inited(rt_thread_t thread)
 {
     if (!rti_status.enable || rti_status.disable_nest[RTI_THREAD_NUM])
         return ;
     rti_thread_create((rt_uint32_t)thread);
+    rti_send_thread_info(thread);
 }
 
 static void rti_thread_suspend(rt_thread_t thread)
@@ -142,26 +152,26 @@ static void rti_scheduler(rt_thread_t from, rt_thread_t to)
         rti_thread_start_exec((rt_uint32_t)to);
 }
 
-static void rti_object_attach(rt_object_t object)
-{
-    if (!rti_status.enable || rti_status.disable_nest[RTI_THREAD_NUM])
-        return ;
-    switch (object->type)
-    {
-    case RT_Object_Class_Thread:
-        rti_thread_create((rt_uint32_t)object);
-        rti_send_thread_info((rt_thread_t)object);
-        break;
-    default:
-        break;
-    }
-}
+//static void rti_object_attach(rt_object_t object)
+//{
+//    if (!rti_status.enable || rti_status.disable_nest[RTI_THREAD_NUM])
+//        return ;
+//    switch (object->type & (~RT_Object_Class_Static))
+//    {
+//    case RT_Object_Class_Thread:
+//        rti_thread_create((rt_uint32_t)object);
+//        rti_send_thread_info((rt_thread_t)object);
+//        break;
+//    default:
+//        break;
+//    }
+//}
 
 static void rti_object_detach(rt_object_t object)
 {
     if (!rti_status.enable || rti_status.disable_nest[RTI_THREAD_NUM])
         return ;
-    switch (object->type)
+    switch (object->type & (~RT_Object_Class_Static))
     {
     case RT_Object_Class_Thread:
         rti_thread_stop_exec();
@@ -414,6 +424,11 @@ static void rti_enter_timer(rt_uint32_t timer)
     rti_send_packet_value(RTI_ID_TIMER_ENTER, rti_shrink_id(timer));
 }
 
+static void rti_exit_timer(rt_uint32_t timer)
+{
+    rti_send_packet_void(RTI_ID_TIMER_EXIT);
+}
+
 static void rti_thread_start_exec(rt_uint32_t thread)
 {
     rti_send_packet_value(RTI_ID_THREAD_START_EXEC, rti_shrink_id(thread));
@@ -549,6 +564,19 @@ static void rti_send_packet_value(rt_uint8_t rti_id, rt_uint32_t value)
     rti_send_packet(rti_id, start, present);
 }
 
+void rti_print(const char *s)
+{
+    rt_uint8_t packet[RTI_INFO_SIZE + 2 * RTI_VALUE_SIZE + RTI_MAX_STRING_LEN];
+    rt_uint8_t *start, *present;
+
+    start = rti_record_ready(packet);
+    present = rti_encode_str(start, s, RTI_MAX_STRING_LEN);
+    present = rti_encode_val(present, RTI_LOG);
+    present = rti_encode_val(present, 0);
+
+    rti_send_packet(RTI_ID_PRINT_FORMATTED, start, present);
+}
+
 static void rti_send_packet(rt_uint8_t rti_id, rt_uint8_t *packet_sta, rt_uint8_t *packet_end)
 {
     rt_uint16_t  len;
@@ -602,7 +630,9 @@ static void rti_send_packet(rt_uint8_t rti_id, rt_uint8_t *packet_sta, rt_uint8_
     rti_status.time_stamp_last = time_stamp;
 }
 
-/* rti api */
+/*
+ * rti api function.
+ */
 void rti_data_new_data_notify_set_hook(void (*hook)(void))
 {
     rti_data_new_data_notify = hook;
@@ -737,7 +767,7 @@ static int rti_init(void)
         return -1;
     }
     /* register hooks */
-    rt_object_attach_sethook(rti_object_attach);
+    //rt_object_attach_sethook(rti_object_attach);
     rt_object_detach_sethook(rti_object_detach);
     rt_object_trytake_sethook(rti_object_trytake);
     rt_object_take_sethook(rti_object_take);
@@ -748,7 +778,8 @@ static int rti_init(void)
     rt_thread_inited_sethook(rti_thread_inited);
     rt_scheduler_sethook(rti_scheduler);
 
-    rt_timer_timeout_sethook(rti_timer_timeout);
+    rt_timer_enter_sethook(rti_timer_enter);
+    rt_timer_exit_sethook(rti_timer_exit);
 
     rt_interrupt_enter_sethook(rti_interrupt_enter);
     rt_interrupt_leave_sethook(rti_interrupt_leave);