Rt-Thread学习笔记-----移植到stm32(二)

下面为Rt-Thread移植到stm32的过程。

一、下载 RT-Thread Nano 源码

RT-Thread Nano 是一个极简版的硬实时内核,它是由 C 语言开发,采用面向对象的编程思维,具有良好的代码风格,是一款可裁剪的、抢占式实时多任务的 RTOS。其内存资源占用极小,功能包括任务处理、软件定时器、信号量、邮箱和实时调度等相对完整的实时操作系统特性。适用于家电、消费电子、医疗设备、工控等领域大量使用的 32 位 ARM 入门级 MCU 的场合。它去掉了master版本的BSP,保留了系统OS的核心功能。
在这里插入图片描述

RT-Thread 源代码下载(里面有Github、码云、百度云等下载方式选择)。

二、移植过程

该版本使用正点原子stm32F103ZET6的工程模板作为工程

2.1.1 拷贝相应文件到USER文件夹中

将rt-thread-3.1.3/bsp文件夹下的rtconfig.h、board.c、board.h拷贝到USER文件夹中。
将rt-thread-3.1.3/src文件夹下所有c文件拷贝到新建文件夹RTT_SOURCE中,并添加到工程。
在这里插入图片描述
将rt-thread-3.1.3\libcpu\arm\cortex-m3文件夹下context_rvds.S、cpuport.c拷贝到新建文件夹RTT_PORTS中,并添加到工程文件。
在这里插入图片描述

添加头文件路径。rt-thread-3.1.3\components\finsh、rt-thread-3.1.3\include、rt-thread-3.1.3\include\libc中有头文件,添加至Keil头文件索引。之前rtconfig.h复制到USER文件夹中,所以USER文件夹也要添加到头文件路径。
在这里插入图片描述
添加文件完毕,这个时候我们编译一下,看看怎么样。
在这里插入图片描述
挖槽,是不是吓尿了,16个错误。看看是什么错误。: error: #5: cannot open source input file “RTE_Components.h”: No such file or directory。找不到RTE_Components.h头文件。全局搜索一下,我们发现RTE_Components.h在rtconfig.h中。

头文件 RTE_Components.h是在 MDK中添加 RT-Thead Package 时
由 MDK 自动生成的,目前我们没有使用 MDK 中自带的 RT-Thread 的 Package,所以这个
头文件不存在,如果包含了该头文件,编译的时候会报错
注释掉该头文件。

然后我们再编译一下。
在这里插入图片描述

菊花一紧,怎么又是三个错误,我们来看看。HardFault_Handler、PendSV_Handler、SysTick_Handler在context_rvds和stm32f10x_it.c中重复定义了。

解决方法,将stm32f10x_it.c中PendSV_Handler、SysTick_Handler、HardFault_Handler删除或屏蔽。SysTick_Handler用作系统运行时钟、PendSV_Handler用于线程上下文切换。

再次编译,见证奇迹的时刻。
在这里插入图片描述

舒服。
//-------------------------------------------------------------------------------------
2020.04.29补充:
需要修改board.c文件。添加board.h文件
1.board.c文件修改如下在这里插入图片描述
图中所示部分注释掉或者删除。
在这里插入图片描述

2.board.h文件如下:记得要添加#include "stm32f10x.h"头文件,否则board.c中

SysTick_Config( SystemCoreClock / RT_TICK_PER_SECOND );

会提示报错。
在这里插入图片描述
然后我们添加使用rtthread自带的rt_kprintf串口功能,使用时需要将串口重映射到rt_kprintf。代码如下:

/**
  * @brief  重映射串口DEBUG_USARTx到rt_kprintf()函数
  *   Note:DEBUG_USARTx是在bsp_usart.h中定义的宏,默认使用串口1
  * @param  str:要输出到串口的字符串
  * @retval 无
  *
  * @attention
  * 
  */
void rt_hw_console_output(const char *str)
{	
	/* 进入临界段 */
    rt_enter_critical();

	/* 直到字符串结束 */
    while (*str!='\0')
	{
		/* 换行 */
     if (*str=='\n')//RT-Thread 系统中已有的打印均以 \n 结尾,而并非 \r\n,所以在字符输出时,需要在输出 \n 之前输出 \r,完成回车与换行,否则系统打印出来的信息将只有换行
		{
			USART_SendData(DEBUG_USARTx, '\r'); 
			while (USART_GetFlagStatus(DEBUG_USARTx, USART_FLAG_TXE) == RESET);
		}

		USART_SendData(DEBUG_USARTx, *str++); 				
		while (USART_GetFlagStatus(DEBUG_USARTx, USART_FLAG_TXE) == RESET);	
	}	

	/* 退出临界段 */
    rt_exit_critical();//注意:使用进入临界段语句rt_enter_critical(); 一定要使用退出临界段语句 rt_exit_critical();否则调度器锁住,无法进行调度
}

记住一些硬件外设初始化,可以放在board.c的void rt_hw_board_init()
函数中。
在这里插入图片描述
我们在主函数中测试一下串口是否可以打印。
在这里插入图片描述
在这里插入图片描述
说明我们已经成功移植了

STM32F103移植Rtthread工程下载

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Terry.Z_1009

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值