接触RT_Thread已经有很长一段时间了,在平时工作中经常接触到ucosII和Linux的教学与开发工作,所以对国产的RT_Thread很容易上手,尤其是通过这次对中科蓝讯开发板的测评,对国产处理器和国产OS的强势崛起感触颇深!接下来分享一下测评过程。
一、安装好RT-Thread Studio V2.1.0,打开SDK管理器,安装RT-Thread Source_Code latest、Bluetrum板级支持包和工具链RISC-V-GCC V10.1.0,接下来基于蓝讯开发板创建工程AB32VG1_USART。
编译工程,同时打开蓝讯的下载工具Downloader_v2.0.0,选择通过USB转串口连接开发板的端口号,选择开发模式,并且在开始按钮里把擦除和自动选择上,这样在RT-Thread Studio编译好工程后会自动下载程序到开发板,这个做的很好,赞一下!
下载程序后
尝试着在添加一行程序
rt_kprintf(“Hello, world\n”);
rt_kprintf(“Hello AB32VG1_USART\n”);
重新编译运行,
说明软硬件环境没有问题了。
二、修改相关文件
这个定义不是手动改的,而是通过env环境配置,要添加串口1的配置 可以编辑Kconfig文件,在env环境下使用menuconfig进入图形配置界面。如果不从env配置的方式添加串口 ,可以直接在board.h中直接添加,#define BSP_USING_UART1 以及相关的定义。
在main.c中,添加如下代码,这里使用了静态信号量,用于触发中断时释放信号量,同时定义了串口1的线程函数。
static rt_thread_t usart1_thread = RT_NULL; //串口1线程
static void usart1_thread_entry(void* parameter);
static rt_err_t uart1_input(rt_device_t dev, rt_size_t size);
static rt_device_t serialuart1;
char str[] = “Hello AB32VG1_USART1!\r\n”;
static struct rt_semaphore rx_sem1;
在main函数之前实现如下函数,
static void usart1_thread_entry(void* parameter)
{
serialuart1 = rt_device_find("uart1");
rt_device_open(serialuart1 , RT_DEVICE_OFLAG_RDWR | RT_DEVICE_FLAG_INT_RX );
rt_device_set_rx_indicate(serialuart1 , uart1_input);
rt_device_write(serialuart1 , 0, str, (sizeof(str) - 1));
char ch;
while (1)
{
while (rt_device_read(serialuart1 , -1, &ch, 1) != 1)
{
rt_sem_take(&rx_sem1, RT_WAITING_FOREVER);
}
ch = ch+1;
rt_device_write(serialuart1 , 0, &ch, 1);
}
}
static rt_err_t uart1_input(rt_device_t dev, rt_size_t size)
{
rt_sem_release(&rx_sem1);
return RT_EOK;
}
在main函数中,创建线程:
rt_sem_init(&rx_sem1, “rx_sem1”, 0, RT_IPC_FLAG_FIFO);
usart1_thread = rt_thread_create( “uart1”, //创建串口任务
usart1_thread_entry,
RT_NULL,
512,
5,
20);
if (usart1_thread != RT_NULL)
rt_thread_startup(usart1_thread);
else
return -1;
查看板子原理图,通过USB转TTL连接串口1和PC机,编译、自动下载后运行:
运行后发现乱码,考虑到串口波特率问题,在drv_usart.c中第191行添加如下代码后现实正常。
if(i == UART1_INDEX)
{
uart_obj[i].serial.config.baud_rate = 115200;
}
在串口调试助手里输入字符,字符+1后返回。串口1测试正常。
三、添加LED线程
串口1运行以后,发现LED不亮了,也是为了测试一下多线程,又写了一个LED线程。
//LED线程
static rt_thread_t led_thread = RT_NULL;
static void led_thread_entry(void* parameter);
static rt_device_t led;
static void led_thread_entry(void* parameter)
{
uint32_t cnt = 0;
uint8_t led0 = rt_pin_get(“PE.1”);
rt_pin_mode(led0, PIN_MODE_OUTPUT);
while (1)
{
if (cnt % 2 == 0)
{
rt_pin_write(led0, PIN_LOW);
}
else
{
rt_pin_write(led0, PIN_HIGH);
}
cnt++;
rt_thread_mdelay(500);
}
}
在main函数中,创建LED线程。
//创建led任务
led_thread = rt_thread_create( “led0”,
led_thread_entry,
RT_NULL,
512,
6,
10);
if(led_thread != RT_NULL)
rt_thread_startup(led_thread);
else
return -1;
重新编译运行,LED快速的闪烁起来,串口1正常通信,多线程测试ok。
输入list_deivce和ps命令查看系统设备和线程情况,列出了线程名称、优先级、堆栈等信息。
原作者:永恒之约