(一)RT-Thread源码的下载
RT-Thread官网下载
rt-thread.org/download.html
https://www.rt-thread.org/download.html
(二) RT-Thread系统移植
1.创建stm32裸机项目工程
1.1任意写一个stm32标准库程序,我这里使用的是最基础的stmf103c8t6的驱动LED闪烁程序

2.解压移植RT-Thread文件
1.2把解压后的rt-thread源码文件夹-rt-thread整体复制到工程文件中


3.裁剪rt-thread文件
3.1首先删除下图中框选到的无用文件,

只留下 —bsp
—components
—include
—libcpu
—src
这五个文件夹
3.2打开bsp,只留下board.c,rtconfig.h这两个文件放到bsp根目录,别的文件都删除


4.添加工程组文件
打开工程,右键项目工程,Add group添加组,rtt\\src与rtt\\port

5.添加头文件和微调文件内容
5.1 添加.\\rt-thread\\bsp,.\\rt-thread\\include,.\\User这三个头文件路径

5.2 打开rtthread.h,添加一句头文件
#include <stdarg. h>

5.3 打开board.c,最上面添加#include "stm32f10x.h" 头文件,找到void rt_hw_board_init(void),注释第一行error,在下面添加一句
SysTick_Config (SystemCoreClock/ RT_TICK_PER_SECOND);
在void rt_hw_board_init(void)上面添加一个函数
void SysTick_Handler(void) { rt_interrupt_enter(); rt_tick_increase();
rt_interrupt_leave(); }

5.4 打开stm32f10x_it.c文件,注释掉void HardFault_Handler(void)和void PendSV_Handler(void)和


最后编译无错误
(三) RT-Thread系统运行验证
1.对我们移植后的LED闪烁项目工程.main函数进行简单修改,使其调用移植的RT-Thread线程调度函数运行程序
#include "stm32f10x.h" #include "LED.h" #include <rtthread.h>
void thread1_entry(void *parameter); void thread2_entry(void *parameter);
static rt_thread_t thread1; static rt_thread_t thread2;
int main(void) { LED_Init();
thread1 = rt_thread_create("thread1", thread1_entry, RT_NULL, 1024, 5, 20); thread2 = rt_thread_create("thread2", thread2_entry, RT_NULL, 1024, 5, 20);
rt_thread_startup(thread1); rt_thread_startup(thread2); }
void thread1_entry(void *parameter) { while (1) { LED1_ON(); rt_thread_delay(500); LED1_OFF(); rt_thread_delay(500); } }
void thread2_entry(void *parameter) { while (1) { LED2_ON(); rt_thread_delay(500); LED2_OFF(); rt_thread_delay(500); } }
LED.c
#include "stm32f10x.h" // Device header
void LED_Init(void) { RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_SetBits(GPIOA, GPIO_Pin_1 | GPIO_Pin_2); }
void LED1_ON(void) { GPIO_ResetBits(GPIOA, GPIO_Pin_1); }
void LED1_OFF(void) { GPIO_SetBits(GPIOA, GPIO_Pin_1); }
void LED1_Turn(void) { if (GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_1) == 0) { GPIO_SetBits(GPIOA, GPIO_Pin_1); } else { GPIO_ResetBits(GPIOA, GPIO_Pin_1); } }
void LED2_ON(void) { GPIO_ResetBits(GPIOA, GPIO_Pin_2); }
void LED2_OFF(void) { GPIO_SetBits(GPIOA, GPIO_Pin_2); }
void LED2_Turn(void) { if (GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_2) == 0) { GPIO_SetBits(GPIOA, GPIO_Pin_2); } else { GPIO_ResetBits(GPIOA, GPIO_Pin_2); } }
LED.h
#ifndef __LED_H #define __LED_H
void LED_Init(void); void LED1_ON(void); void LED1_OFF(void); void LED1_Turn(void); void LED2_ON(void); void LED2_OFF(void); void LED2_Turn(void);
#endif

