systemview
实时可视化调试:SystemView 助你掌控RTOS运行态 kk开源笔记 https://mp.weixin.qq.com/s/uFJ_ZI5aUv4xKqx3JsVKcw
#define SEGGER_SYSVIEW_RTT_CHANNEL 1 systemview 用的是rtt 的channel 1
调 SEGGER_RTT_WriteSkipNoLock 接口
#define CHANNEL_ID_UP SEGGER_SYSVIEW_RTT_CHANNEL #define CHANNEL_ID_DOWN SEGGER_SYSVIEW_RTT_CHANNEL
_HandleIncomingPacket
UART->RTT
- 加一个可以收发的UART
- 定时的通过RTT发送
- 通过UART接收
- 线程定时的去操作rtt
start command: 0x53,0x56,0x03,0x00
ascii: SV\r\n
- 定一个超时时间,比如2ms,超过这个时间没有log更新,则发送信号量,发送数据
- 每次发送log的时候更新这个定时器
- 当发送的时候,发现ringbuffer中的数据超过最大值的一半,就必须发送信号量发送数据
// 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);
segger_rtt 要面向对象
每个buffer,要加一个名字,方便查找