bluetoothlover_doc icon indicating copy to clipboard operation
bluetoothlover_doc copied to clipboard

systemview

Open supperthomas opened this issue 7 months ago • 11 comments

supperthomas avatar Jun 10 '25 11:06 supperthomas

实时可视化调试:SystemView 助你掌控RTOS运行态 kk开源笔记 https://mp.weixin.qq.com/s/uFJ_ZI5aUv4xKqx3JsVKcw

supperthomas avatar Jun 10 '25 11:06 supperthomas

#define SEGGER_SYSVIEW_RTT_CHANNEL 1 systemview 用的是rtt 的channel 1

supperthomas avatar Jun 10 '25 12:06 supperthomas

调 SEGGER_RTT_WriteSkipNoLock 接口

supperthomas avatar Jun 10 '25 12:06 supperthomas

#define CHANNEL_ID_UP SEGGER_SYSVIEW_RTT_CHANNEL #define CHANNEL_ID_DOWN SEGGER_SYSVIEW_RTT_CHANNEL

supperthomas avatar Jun 10 '25 12:06 supperthomas

_HandleIncomingPacket

supperthomas avatar Jun 10 '25 12:06 supperthomas

UART->RTT

  1. 加一个可以收发的UART
  2. 定时的通过RTT发送
  3. 通过UART接收
  4. 线程定时的去操作rtt

supperthomas avatar Jun 10 '25 12:06 supperthomas

start command: 0x53,0x56,0x03,0x00

ascii: SV\r\n

supperthomas avatar Jun 11 '25 09:06 supperthomas

  1. 定一个超时时间,比如2ms,超过这个时间没有log更新,则发送信号量,发送数据
  2. 每次发送log的时候更新这个定时器
  3. 当发送的时候,发现ringbuffer中的数据超过最大值的一半,就必须发送信号量发送数据

supperthomas avatar Jun 17 '25 06:06 supperthomas

// if use RT_USING_SERIAL_V1  you can add the code before schedule
#define SAMPLE_UART_NAME       "lpuart1"    /* 串口设备名称 */
static rt_device_t serial  = RT_NULL;                /* 串口设备句柄 */
static struct rt_semaphore rx_sem;    /* 用于接收消息的信号量 */
static rt_err_t uart_input(rt_device_t dev, rt_size_t size)
{
    /* 串口接收到数据后产生中断,调用此回调函数,然后发送接收信号量 */
    rt_sem_release(&rx_sem);

    return RT_EOK;
}
uint8_t rev_data[1024];
static void thread1_entry(void *parameter)
{
    rt_uint32_t count = 0;
    uint32_t rv_count = 0;

    serial = rt_device_find(SAMPLE_UART_NAME);
		if(serial == RT_NULL)
		{
			rt_kprintf("===> %s not found!\n", SAMPLE_UART_NAME);
		}
    rt_device_open(serial, RT_DEVICE_FLAG_INT_RX);
    /* 初始化信号量 */
    rt_sem_init(&rx_sem, "rx_sem", 0, RT_IPC_FLAG_FIFO);
    rt_device_set_rx_indicate(serial, uart_input);
    while (1)
    {
         // 看下是否有数据
        if(SEGGER_RTT_GetBytesInBuffer(2) > 0)
				{
					rv_count = SEGGER_RTT_GetBytesInBuffer(2);
					  rt_kprintf(" receive data :%d", rv_count);
					  SEGGER_RTT_ReadUpBuffer(2, rev_data,rv_count);
            rt_device_write(serial, 0, rev_data, rv_count);                          
				}
		    rt_thread_mdelay(10);
    }
    rt_kprintf("thread1 exit\n");
    /* 线程 1 运行结束后也将自动被系统脱离 */
}

#define THREAD_PRIORITY         25
#define THREAD_STACK_SIZE       512
#define THREAD_TIMESLICE        5
int rt_hw_vbt_init(void)
{
	   //创建一个线程,轮询buffer index 2的数据,通过串口发出来,
    static rt_thread_t tid1 = RT_NULL;
    
    /* 创建线程 1,名称是 thread1,入口是 thread1_entry*/
    tid1 = rt_thread_create("thread1",
                            thread1_entry, RT_NULL,
                            THREAD_STACK_SIZE,
                            THREAD_PRIORITY, THREAD_TIMESLICE);

    /* 如果获得线程控制块,启动这个线程 */
    if (tid1 != RT_NULL)
        rt_thread_startup(tid1);
    return 0;
}
MSH_CMD_EXPORT(rt_hw_vbt_init, rt_hw_vbt_init sample);

supperthomas avatar Jun 19 '25 12:06 supperthomas

segger_rtt 要面向对象

supperthomas avatar Jun 25 '25 02:06 supperthomas

每个buffer,要加一个名字,方便查找

supperthomas avatar Jun 25 '25 09:06 supperthomas