IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 基于STM32移植RT-Thread nano操作系统 -> 正文阅读

[嵌入式]基于STM32移植RT-Thread nano操作系统

在STM32F103ZET6上移植RT-Thread nano内核,使用keil作为开发环境。
**

1.准备工作

**
需要准备一份裸机工程,和RT-Thread nano源码:
裸机工程建议使用完整的工程,若使用keil创建,库文件并不在工程文件夹中,而是通过添加库路径进行引用的,可以直接去keil路径中将文件拷贝到工程文件中。为保证后续操作,建议将裸机下载试一下。

在这里插入图片描述
RT-Thread nano源码直接到官网下载就行
在这里插入图片描述
解压下载包,进入rtthread文件夹,得到系统的所有文件:
在这里插入图片描述

2.移植

2.1 删除与我们移植STM32无关的文件,bsp中我们仅保留board.c和rtconfig.h
在这里插入图片描述
libcpu中,STM32属于ARM架构M3内核,所以仅保留arm及下的cortex-m3文件:
在这里插入图片描述
随后,将rtthread文件夹放入裸机工程中:
在这里插入图片描述
总结一下,实际上RTOS的文件可分为三部分
第一部分:是板级相关的文件和系统配置文件,前者中主要是做一些板级的初始化,后者主要是通过修改宏或者相关数值来裁剪或者配置系统功能,在rtthread中即为bsp文件夹中的board.c和rtconfig.h。
在这里插入图片描述

第二部分:是系统文件,包括系统各个功能的源文件,如线程、通信、内存等,此处为src文件夹下的所有文件,此部分文件不需要修改。
在这里插入图片描述

第三部分:是芯片内核移植相关的文件(此处为cortex-m),这其中涉及ARM架构和操作系统的底层实现原理,实际上下载源码中官方已经对cortex-m做了适配移植。
在这里插入图片描述
按照三部分,将文件加入到keil工程,我是按照三部分,看起来直接一点,具体怎样放置文件没有绝对的规则。
在这里插入图片描述
2.2 测试系统
到此,实际上因为RTTHREAD做了相关的移植适配,系统到STM32F103ZET6的移植基本就好了,比如下图rt_hw_board_init()函数,下载官网的源码就已经写好了时钟配置和系统滴答时基的配置,如果通过keil软件包引入RTTHREAD还需要完成这两个函数。

void rt_hw_board_init()
{
    /* System Clock Update */
    SystemCoreClockUpdate();
    
    /* System Tick Configuration */
    _SysTick_Config(SystemCoreClock / RT_TICK_PER_SECOND);

    /* Call components board initial (use INIT_BOARD_EXPORT()) */
#ifdef RT_USING_COMPONENTS_INIT
    rt_components_board_init();
#endif

#if defined(RT_USING_USER_MAIN) && defined(RT_USING_HEAP)
    rt_system_heap_init(rt_heap_begin_get(), rt_heap_end_get());
#endif
}

在移植过程中,预计出现以下错误,参考解决办法如下:
错误解决:
(1)删除头文件 RTE_Components.h,并注释掉rtconfig.h中对它的引用,它是在 MDK中添加 RT-Thead Package 时由 MDK 自动生成的,我们不使用keil的package,不删除会引发一个报错。
(2)注释掉stm32f10x_it.c中的HardFault_Handler(void),PendSV_Handler(void),SysTick_Handler(void),因为rtthread对它们进行了实现,不删除会导致重复定义错误。
(3)Error: L6218E: Undefined symbol rt_thread_create (referred from main.o),打开rtconfig.h中的堆使用宏#define RT_USING_HEAP,系统中采用动态方式创建线程等等操作需要使用到堆,不然会出现以上错误。
(4)还有一个隐藏问题,下载的源码中,将任务数默认设置为8,所以测试代码时,若线程优先级低于8(数字大于8)时,会发现代码没有报错而线程无法运行,可通过修改宏定义
#define RT_THREAD_PRIORITY_MAX 32
更改线程数量,或者通过下图向导框修改,rtthread最高支持256
在这里插入图片描述
在这里插入图片描述

接下来点个灯测试一下,记得将相关的头文件路径配置好:
在这里插入图片描述

//此处为led.c
#include "led.h"
#include "stm32f10x_gpio.h"

//初始化PB5和PE5为输出口.并使能这两个口的时钟		    
//LED IO初始化
void LED_Init(void)
{
 
 GPIO_InitTypeDef  GPIO_InitStructure;
 	
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOE, ENABLE);	 //使能PB,PE端口时钟
	
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;				 //LED0-->PB.5 端口配置
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		 //推挽输出
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		 //IO口速度为50MHz
 GPIO_Init(GPIOB, &GPIO_InitStructure);					 //根据设定参数初始化GPIOB.5
 GPIO_Write(GPIOB,0);

 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;	    		 //LED1-->PE.5 端口配置, 推挽输出
 GPIO_Init(GPIOE, &GPIO_InitStructure);	  				 //推挽输出 ,IO口速度为50MHz
 GPIO_SetBits(GPIOE,GPIO_Pin_5); 						 //PE.5 输出高 
}
 

void led_on(void)
{
	GPIO_WriteBit(GPIOB, GPIO_Pin_5, 0);
	
}

void led_off(void)
{
	GPIO_WriteBit(GPIOB, GPIO_Pin_5, 1);
}



//此处为main.c
#include "led.h"
#include <rtthread.h>

 rt_thread_t led_thread = RT_NULL;
 
void led_thread_entry(void* para)
{
	while(1)
	{
		led_off();
		rt_thread_mdelay(300);
		led_on();
		rt_thread_mdelay(100);
		
	}
}
 
 
int main(void)
{ 
 
	LED_Init();		        //初始化LED端口

	
	led_thread = rt_thread_create("led",led_thread_entry, RT_NULL, 128, 20, 20);
	if(led_thread != RT_NULL)
	rt_thread_startup(led_thread);
	
	return 0;

} 
  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2022-04-27 11:29:12  更:2022-04-27 11:30:11 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 3:54:13-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码