cubeide版本1.8,rt-thread版本3.1.5,实验平台正点原子精英板(F103ZET6)
声明;本文参考了rt-thread官方教程以及一些博主的记录,仅供学习记录使用,方便以后查阅。
1、准备rt-thread包
进入包管理页面,选择网络获取,之后输入网址
https://www.rt-thread.org/download/cube/RealThread.RT-Thread.pdsc
2、添加包
三个都勾上即可
可见多出如下选项 这里选择内核版本,其他参数默认,我大概看了下其他参数,跟官方说的影响不大 之后常规操作一下,就是建立一个带串口1和led的工程 取消使用一些中断,这些中断在rt-thread里面被复用了 具体为 HardFault_Handler、PendSV_Handler、SysTick_Handler 中断
后面选择好时钟以及debug就可以生成代码了
3、修改代码
直接编译会报错,因此需要修改代码
首先是看一下这个目录 因为我之前一直这里报错,不知道啥原因,他自己定义了一个串口二的初始化函数,然后还有重定向输入输出,但是一直报错,干脆就给他删掉重写一个就完事了
删掉串口定义和输入输出函数,在main.c中添加(末尾处添加即可)
char rt_hw_console_getchar(void)
{
int ch = -1;
if (__HAL_UART_GET_FLAG(&huart1, UART_FLAG_RXNE) != RESET)
{
ch = huart1.Instance->DR & 0xff;
}
else
{
if (__HAL_UART_GET_FLAG(&huart1, UART_FLAG_ORE) != RESET)
{
__HAL_UART_CLEAR_OREFLAG(&huart1);
}
rt_thread_mdelay(10);
}
return ch;
}
void rt_hw_console_output(const char *str)
{
rt_size_t i = 0, size = 0;
char a = '\r';
__HAL_UNLOCK(&huart1);
size = rt_strlen(str);
for (i = 0; i < size; i++)
{
if (*(str + i) == '\n')
{
ITM_SendChar(a);
HAL_UART_Transmit(&huart1, (uint8_t *)&a, 1, 1);
}
HAL_UART_Transmit(&huart1, (uint8_t *)(str + i), 1, 1);
}
}
下面需要修改下启动文件 注释bl main,替换为bl entry
4、编写rt-thread线程
新建一个rtthread_test.c文件,加入下面代码
static struct rt_thread led_thread;
static char led_thread_stack[256];
static void led_thread_entry(void *parameter);
int MX_RT_Thread_Init(void)
{
//初始化线程
rt_err_t rst;
rst = rt_thread_init(&led_thread,
(const char *)"ledtest", /* 线程名字 */
led_thread_entry, /* 线程入口函数 */
RT_NULL, /* 线程入口函数参数 */
&led_thread_stack[0],
sizeof(led_thread_stack), /* 线程栈大小 */
RT_THREAD_PRIORITY_MAX - 2, /* 线程的优先级 */
20); /* 线程时间片 */
if (rst == RT_EOK)
{
rt_thread_startup(&led_thread); //创建线程
}
return 0;
}
static void led_thread_entry(void *parameter)
{
while (1)
{
rt_kprintf("rt-thread_test\r\n");
HAL_GPIO_TogglePin(GPIOE, GPIO_PIN_5);
rt_thread_mdelay(1000);
}
}
线程含义参数理解
在下面官网文档可以获取
https://www.rt-thread.org/document/api/group___thread.html
如下图所示 main.c中引入
extern int MX_RT_Thread_Init(void);
初始化引入
MX_RT_Thread_Init();
while循环中引入
HAL_GPIO_TogglePin(GPIOE,GPIO_PIN_5);
rt_kprintf("mian_test\r\n");
rt_thread_mdelay(500);
结果如下
|