为什么手动移植?
- 了解系统文件组成和结构
- 发现问题并解决
- 文字记录
1. 新建一个基础工程
使用STM32F103ZET6芯片
创建一个工程
- 打开STM32cubeMX
- 使用HSI
- 使用UART1
- 配置时钟树
- 工程基本信息
- 生成工程打开
- 编译报错
- 使用arm compiler: version 6
- 编译完成
- 串口重定向
int fputc(int ch, FILE *f)
{
/* 发送单个字节到USART */
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);
return ch;
}
-
增加 头文件 #include <stdio.h>
-
添加微库 Use MicroLIB
microlib 是缺省 C 库的备选库。 它旨在与需要装入到极少量内存中的深层嵌入式应用程序配合使用。 这些应用程序不在操作系统中运行 -
编译错误把这两个注释编译然后取消注释重新编译
f103xe.s 启动文件中332行
EXPORT //__initial_sp
EXPORT __heap_base
EXPORT __heap_limit
ELSE
IMPORT //__use_two_region_memory
EXPORT __user_initial_stackheap
- 主函数循环串口打印日志 间隔一秒
- 基础工程完成
2. KEIL安装包
- 进入网站点击 CMSIS PACKS
- 搜索框输入 RT-Thread
- 下载安装包
- 下载完成点击根据提示安装
- 在keil select software packs 这个倒数第二个按钮可以看到安装完成
3. RT_thread 源码
- 进入官网下载RT_THREAD NANO 源码
- 解压后可以看到结构
- bsp 是各芯片的板级支持包,关注里面的rtconfig.h和board.c 文件
- components是各扩展组件
- include 是系统需要的头文件
- include/libc 是系统需要的头文件
- libcpu 是各芯片的接口文件
- src 是rtthread内核文件
- 将rt_thread目录整个复制到工程文件目录中
- 删除掉bsp目录中无效文件
4. KEIL 添加源码文件
- keil groups 下新建 几个文件目录
- user里面添加board.c
- port里面添加 cpuport.c 和 context_rvds.s
- source 里面添加src全部源码文件
- 魔术棒里添加各头文件路径
- 添加完成编译
- 报错显示几个函数重复定义
- 把stm32f1xx_it.c 里面几个函数注释掉
- 编译后通过
5. 修改rt_config.h
- 在官网文档中心找到内核基础,配置文件那一个章节
- 根据说明每一个仔细配置
配置完成编译通过
6. 修改board.c
- 修改一下堆的大小
- 新建一个board.h 文件
#ifndef __BOADR_H
#define __BOARD_H
#includt <rtthread.h>
void rt_hw_board_init();
void SysTick_Handler(void);
#endif
编译完成
7. 测试RTthread
- 主函数添加# include <rtthread.h>
- 使用系统延时 rt_thread_mdelay(1000)
- 间隔输出日志
- 成功
- 在主函数主轮询之前创建一个动态线程1
- 线程1中间隔输出日志
- 编译运行可以看到线程1启动成功
- 正常日志输出
8. 基本工程移植完成
具体资料详见网络》》》》》》
RT-thread是一个软件 单片机是一个硬件 软件硬件关联的文件叫接口文件 通常由C和汇编编写 不同的硬件接口文件是不一样的
通常由RTthread和原厂的人编写 内核: cortex-m0 m3 m4 m7 只要是使用这些内核的mcu都可以使用对应接口文件
配置文件:
#ifndef __RTCONFIG_H
#define __RTCONFIG_H
//内核
/* 表示内核对象的名称的最大长度,若代码中对象名称的最大长度大于宏定义的长度,
* 多余的部分将被截掉。*/
#define RT_NAME_MAX 8
/* 字节对齐时设定对齐的字节个数。常使用 ALIGN(RT_ALIGN_SIZE) 进行字节对齐。*/
#define RT_ALIGN_SIZE 4
/* 定义系统线程优先级数;通常用 RT_THREAD_PRIORITY_MAX-1 定义空闲线程的优先级 */
#define RT_THREAD_PRIORITY_MAX 32
/* 定义时钟节拍,为 1000 时表示 1000 个 tick 每秒,一个 tick 为 1ms */
#define RT_TICK_PER_SECOND 1000
/* 检查栈是否溢出,未定义则关闭 */
//#define RT_USING_OVERFLOW_CHECK
/* 定义该宏开启 debug 模式,未定义则关闭 */
//#define RT_DEBUG
/* 开启 debug 模式时:该宏定义为 0 时表示关闭打印组件初始化信息,定义为 1 时表示启用 */
//#define RT_DEBUG_INIT 0
/* 开启 debug 模式时:该宏定义为 0 时表示关闭打印线程切换信息,定义为 1 时表示启用 */
//#define RT_DEBUG_THREAD 0
/* 定义该宏表示开启钩子函数的使用,未定义则关闭 */
//#define RT_USING_HOOK
/* 定义了空闲线程的栈大小 */
#define IDLE_THREAD_STACK_SIZE 256
//线程间通信
/* 定义该宏可开启信号量的使用,未定义则关闭 */
#define RT_USING_SEMAPHORE
/* 定义该宏可开启互斥量的使用,未定义则关闭 */
#define RT_USING_MUTEX
/* 定义该宏可开启事件集的使用,未定义则关闭 */
#define RT_USING_EVENT
/* 定义该宏可开启邮箱的使用,未定义则关闭 */
#define RT_USING_MAILBOX
/* 定义该宏可开启消息队列的使用,未定义则关闭 */
#define RT_USING_MESSAGEQUEUE
/* 定义该宏可开启信号的使用,未定义则关闭 */
//#define RT_USING_SIGNALS
//内存管理
/* 开启静态内存池的使用 */
//#define RT_USING_MEMPOOL
/* 定义该宏可开启两个或以上内存堆拼接的使用,未定义则关闭 */
//#define RT_USING_MEMHEAP
/* 开启小内存管理算法 */
#define RT_USING_SMALL_MEM
/* 关闭 SLAB 内存管理算法 */
//#define RT_USING_SLAB
/* 开启堆的使用 */
#define RT_USING_HEAP
//内核设备对象
/* 表示开启了系统设备的使用 */
//#define RT_USING_DEVICE
/* 定义该宏可开启系统控制台设备的使用,未定义则关闭 */
//#define RT_USING_CONSOLE
/* 定义控制台设备的缓冲区大小 */
//#define RT_CONSOLEBUF_SIZE 128
/* 控制台设备的名称 */
//#define RT_CONSOLE_DEVICE_NAME "uart1"
//自动初始化
/* 定义该宏开启自动初始化机制,未定义则关闭 */
#define RT_USING_COMPONENTS_INIT
/* 定义该宏开启设置应用入口为 main 函数 */
#define RT_USING_USER_MAIN
/* 定义 main 线程的栈大小 */
#define RT_MAIN_THREAD_STACK_SIZE 1024
//finsh
/* 定义该宏可开启系统 FinSH 调试工具的使用,未定义则关闭 */
//#define RT_USING_FINSH
/* 开启系统 FinSH 时:将该线程名称定义为 tshell */
//#define FINSH_THREAD_NAME "tshell"
/* 开启系统 FinSH 时:使用历史命令 */
//#define FINSH_USING_HISTORY
/* 开启系统 FinSH 时:对历史命令行数的定义 */
//#define FINSH_HISTORY_LINES 5
/* 开启系统 FinSH 时:定义该宏开启使用 Tab 键,未定义则关闭 */
//#define FINSH_USING_SYMTAB
/* 开启系统 FinSH 时:定义该线程的优先级 */
//#define FINSH_THREAD_PRIORITY 20
/* 开启系统 FinSH 时:定义该线程的栈大小 */
//#define FINSH_THREAD_STACK_SIZE 4096
/* 开启系统 FinSH 时:定义命令字符长度 */
//#define FINSH_CMD_SIZE 80
/* 开启系统 FinSH 时:定义该宏开启 MSH 功能 */
//#define FINSH_USING_MSH
/* 开启系统 FinSH 时:开启 MSH 功能时,定义该宏默认使用 MSH 功能 */
//#define FINSH_USING_MSH_DEFAULT
/* 开启系统 FinSH 时:定义该宏,仅使用 MSH 功能 */
//#define FINSH_USING_MSH_ONLY
//mcu
/* 定义该工程使用的 MCU 为 STM32F103ZE;系统通过对芯片类型的定义,来定义芯片的管脚 */
//#define STM32F103ZE
/* 定义时钟源频率 */
//#define RT_HSE_VALUE 8000000
/* 定义该宏开启 UART1 的使用 */
//#define RT_USING_UART1
#endif