Cubeide新建RT-thread(3.1.5)工程记录

cubeide版本1.8,rt-thread版本3.1.5,实验平台正点原子精英板(F103ZET6)

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 = 
;
    __HAL_UNLOCK(&huart1);
    size = rt_strlen(str);
    for (i = 0; i < size; i++)
    {
          
   
        if (*(str + i) == 
)
        {
          
   
            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文件,加入下面代码

#include "rtthread.h"
#include "main.h"
#include "stdio.h"


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
");
        HAL_GPIO_TogglePin(GPIOE, GPIO_PIN_5);
        rt_thread_mdelay(1000);
    }
}

线程含义参数理解

在下面官网文档可以获取
https://www.rt-thread.org/document/api/group___thread.html#gacd985aa60939b95e510f144610f001b9

如下图所示 main.c中引入

#include "rtthread.h"
extern int MX_RT_Thread_Init(void);

初始化引入

MX_RT_Thread_Init();

while循环中引入

HAL_GPIO_TogglePin(GPIOE,GPIO_PIN_5);
  	rt_kprintf("mian_test
");
  	rt_thread_mdelay(500);

结果如下

经验分享 程序员 微信小程序 职场和发展