STM32CubMx+RT-Thread Studio实现多线程过程

本文主要介绍如何通过STM32CubMx+RT-Thread Studio实现嵌入式多线程运行的步骤。

新建工程

RT-Thread Studio工程

打开RT-Thread Studio软件,新建工程。选择RT-Thread项目
在这里插入图片描述从芯片选型出发,配置芯片信息,这里我的板子是原子探索者F407ZGT6,根据自己的芯片型号配置具体信息。
在这里插入图片描述

至此,RT-Thread Studio 软件配置任务完成,如下图所示。
在这里插入图片描述

STM32CubMx工程

在新建完成的RT-Thread Studio打开STM32CubMx软件,这里要开启多线程 实现不同类型的线程,以板子自带的PF9PF10 LED灯为例。
首先:开启时钟
在这里插入图片描述配置时钟树,主频赫兹为168Mhz。
在这里插入图片描述

打开PF9和PF10,并且设置为输出。
在这里插入图片描述
需要使用终端,因此要打开终端。开启串口1。
在这里插入图片描述

至此,cubmx工程配置完成,可以看到文件目录上多了一个cubmx的文件目录。
在这里插入图片描述

接下来,在cubmx中,删除生成的__WEAK int main(void)函数。
在这里插入图片描述紧接着需要在cubmx生成的SConscript文件中添加生成的如下文件
在这里插入图片描述

添加多线程函数

在完成上述一系列配置之后,在application中的main.c中,直接替换如下函数,实现多线程运行。


#include <rtthread.h>

#define DBG_TAG "main"
#define DBG_LVL DBG_LOG
#include <rtdbg.h>
#include "main.h"
#include "gpio.h"
#include "usart.h"
#include "rtthread.h"
#include "board.h"

#define LED0 GET_PIN(F,9)
#define LED1 GET_PIN(F,10)

#define THREAD_PRIORITY         25
#define THREAD_STACK_SIZE       512
#define THREAD_TIMESLICE        5

/* 指向线程控制块的指针 */
rt_thread_t  tid1 = RT_NULL;
rt_thread_t  tid2 = RT_NULL;

void led0_entry(void* p)
{
    
    
    rt_kprintf("LED0 Runing\r\n");
    while(1)
    {
    
    
        HAL_GPIO_WritePin(GPIOF, GPIO_PIN_9,GPIO_PIN_SET);
        rt_pin_write(LED0, 1);
        rt_thread_delay(500);
        rt_pin_write(LED0, 0);
        rt_thread_delay(500);
    }
}

void led1_entry(void* p)
{
    
    
    rt_kprintf("LED1 Runing\r\n");
    while(1)
    {
    
    
        rt_pin_write(LED1, 1);
        rt_thread_delay(500);
        rt_pin_write(LED1, 0);
        rt_thread_delay(500);
    }
}

void led0_start(void)
{
    
    
    /* 创建线程1 */
    tid1 = rt_thread_create("t11",              /*线程名称*/
                            led0_entry,         /*线程入口函数*/
                            RT_NULL,            /*线程入口函数参数*/
                            THREAD_STACK_SIZE,  /*线程大小*/
                            THREAD_PRIORITY,    /*线程优先级*/
                            THREAD_TIMESLICE    /*线程时间片*/
                            );

    if(tid1 != RT_NULL)//分配成功,加入到就绪队列中
            rt_thread_startup(tid1);
}


void led1_start(void)
{
    
    
    /* 创建线程1 */
    tid2 = rt_thread_create("t22",              /*线程名称*/
                            led1_entry,         /*线程入口函数*/
                            RT_NULL,            /*线程入口函数参数*/
                            THREAD_STACK_SIZE,  /*线程大小*/
                            THREAD_PRIORITY,    /*线程优先级*/
                            THREAD_TIMESLICE    /*线程时间片*/
                            );

    if(tid2 != RT_NULL)//分配成功,加入到就绪队列中
            rt_thread_startup(tid2);
}

MSH_CMD_EXPORT(led0_start, led0_task);//添加任务至终端

MSH_CMD_EXPORT(led1_start, led1_task);

static void hook_of_schedule(struct rt_thread *from,struct rt_thread *to)
{
    
    
    rt_kprintf("from %s ---> to %s \r\n",from->name,to->name);
    rt_kprintf("\r\n");
}


void thread_init_function(void)
{
    
    
    /*设置调度器的钩子函数*/
    rt_scheduler_sethook(hook_of_schedule);
    /*线程1启动*/
    led0_start();
    /*线程2启动*/
    led1_start();
}


int main(void)
{
    
    
    MX_GPIO_Init();

    MX_USART1_UART_Init();

    LOG_D("Init Ok!");

    thread_init_function();

    int count = 1;
    while (count++)
    {
    
    
//        rt_kprintf("count = %d\r\n",count);
        rt_thread_mdelay(1000);
    }

    return RT_EOK;
}

下载,进入终端,输入命令led0_startled1start启动线程,或者将线程放到main函数中,在main中直接启动函数。

猜你喜欢

转载自blog.csdn.net/m0_46152793/article/details/124085655
今日推荐