RTthread之手动移植

为什么手动移植?

  • 了解系统文件组成和结构
  • 发现问题并解决
  • 文字记录

1. 新建一个基础工程

使用STM32F103ZET6芯片
创建一个工程

  1. 打开STM32cubeMX
  2. 使用HSI
  3. 使用UART1
  4. 配置时钟树
  5. 工程基本信息
  6. 生成工程打开
  7. 编译报错
  8. 使用arm compiler: version 6
  9. 编译完成
  10. 串口重定向
int fputc(int ch, FILE *f)
{
    /* 发送单个字节到USART */
    HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);
    return ch;
}
  1. 增加 头文件 #include <stdio.h>

  2. 添加微库 Use MicroLIB
    microlib 是缺省 C 库的备选库。 它旨在与需要装入到极少量内存中的深层嵌入式应用程序配合使用。 这些应用程序不在操作系统中运行

  3. 编译错误把这两个注释编译然后取消注释重新编译
    f103xe.s 启动文件中332行

     EXPORT  //__initial_sp
     EXPORT  __heap_base
     EXPORT  __heap_limit
    
     ELSE
    
     IMPORT  //__use_two_region_memory
     EXPORT  __user_initial_stackheap
  1. 主函数循环串口打印日志 间隔一秒
  2. 基础工程完成

2. KEIL安装包

arm_keil网站

  1. 进入网站点击 CMSIS PACKS
  2. 搜索框输入 RT-Thread
  3. 下载安装包
  4. 下载完成点击根据提示安装
  5. 在keil select software packs 这个倒数第二个按钮可以看到安装完成

3. RT_thread 源码

  1. 进入官网下载RT_THREAD NANO 源码
  2. 解压后可以看到结构
  3. bsp 是各芯片的板级支持包,关注里面的rtconfig.h和board.c 文件
  4. components是各扩展组件
  5. include 是系统需要的头文件
  6. include/libc 是系统需要的头文件
  7. libcpu 是各芯片的接口文件
  8. src 是rtthread内核文件
  9. 将rt_thread目录整个复制到工程文件目录中
  10. 删除掉bsp目录中无效文件

4. KEIL 添加源码文件

  1. keil groups 下新建 几个文件目录
  2. user里面添加board.c
  3. port里面添加 cpuport.c 和 context_rvds.s
  4. source 里面添加src全部源码文件
  5. 魔术棒里添加各头文件路径
  6. 添加完成编译
  7. 报错显示几个函数重复定义
  8. 把stm32f1xx_it.c 里面几个函数注释掉
  9. 编译后通过

5. 修改rt_config.h

  • 在官网文档中心找到内核基础,配置文件那一个章节
  • 根据说明每一个仔细配置
    配置完成编译通过

6. 修改board.c

  1. 修改一下堆的大小
  2. 新建一个board.h 文件
#ifndef __BOADR_H
#define __BOARD_H


#includt <rtthread.h>

void rt_hw_board_init();
void SysTick_Handler(void);

#endif

编译完成

7. 测试RTthread

  1. 主函数添加# include <rtthread.h>
  2. 使用系统延时 rt_thread_mdelay(1000)
  3. 间隔输出日志
  4. 成功
  5. 在主函数主轮询之前创建一个动态线程1
  6. 线程1中间隔输出日志
  7. 编译运行可以看到线程1启动成功
  8. 正常日志输出
    在这里插入图片描述

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值