我是靠谱客的博主 耍酷麦片,最近开发中收集的这篇文章主要介绍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 Runingrn");
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 Runingrn");
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 rn",from->name,to->name);
rt_kprintf("rn");
}
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 = %drn",count);
rt_thread_mdelay(1000);
}
return RT_EOK;
}

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

最后

以上就是耍酷麦片为你收集整理的STM32CubMx+RT-Thread Studio实现多线程过程的全部内容,希望文章能够帮你解决STM32CubMx+RT-Thread Studio实现多线程过程所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(42)

评论列表共有 0 条评论

立即
投稿
返回
顶部