您现在的位置是:首页 > 正文

移植RTT--官方教程

2024-02-01 05:54:20阅读 3

CPU架构移植:大部分的CPU都移植好了,不太需要用户去操作。libcpu文件夹里面就是各种的CPU架构。主要处理标红四个函数:

函数和变量 描述
rt_base_t rt_hw_interrupt_disable(void); 关闭全局中断
void rt_hw_interrupt_enable(rt_base_t level); 打开全局中断
rt_uint8_t *rt_hw_stack_init(void *tentry, void *parameter, rt_uint8_t *stack_addr, void *texit); 线程栈的初始化,内核在线程创建和线程初始化里面会调用这个函数
void rt_hw_context_switch_to(rt_uint32 to); 没有来源线程的上下文切换在调度器启动第一个线程的时候调用,以及在 signal 里面会调用
void rt_hw_context_switch(rt_uint32 from, rt_uint32 to); 从 from 线程切换到 to 线程,用于线程和线程之间的切换
void rt_hw_context_switch_interrupt(rt_uint32 from, rt_uint32 to); 从 from 线程切换到 to 线程,用于中断里面进行切换的时候使用
rt_uint32_t rt_thread_switch_interrupt_flag; 表示需要在中断里进行切换的标志
rt_uint32_t rt_interrupt_from_thread, rt_interrupt_to_thread; 在线程进行上下文切换时候,用来保存 from 和 to 线程
rt_tick_increase()  时钟节拍

重点:BSP的移植:这里主要是针对Rt-thread下BSP下没有的芯片的移植。

三种方式:

从现有bsp修改(相同/相似型号芯片),主要是从E:\rt-thread\bsp目录下,这次项目就是选的这种方式。

基于模板移植(同一系列芯片),主要从E:\rt-thread\bsp\stm32\libraries\templates目录下,芯片系列以stm32为例。

裸机工程添加(难度最大)

一、从现有bsp修改,步骤:

1、通过看bsp下的readme.md看下芯片配置是否相似。找到后,复制一份工程出来,改一下名

2、时钟配置,通过CubeMX配置时钟,生成工程后,在main.c里 SystemClock_Config() 拷贝一份到board.c中。

3、串口引脚,通过CubeMX配置好串口后,调用E:\birld\rtOS\bsp\myOS\sixBand\board\CubeMX_Config\Src下的stm32l4xx_hal_msp.c底层配置。然后,通过menuconfig,打开串口外设,并在kernel下,控制台串口名称要对应到打印串口。

4、Flash、RAM大小

在board.h,还有链接脚本link.sct(文件在E:\birld\rtOS\bsp\myOS\sixBand\board\linker_scripts)下修改。

scons --dist,打包一个BSP。

二、模板移植:

1、选好通用模板

2、按照以下修改:

项目 需要修改的内容说明
CubeMX_Config (文件夹) CubeMX 工程
linker_scripts (文件夹) BSP 特定的链接脚本
board.c/h 系统时钟、GPIO 初始化函数、芯片存储器大小
Kconfig 芯片型号、系列、外设资源(在E:\birld\rtOS\bsp\myOS\sixBand\board下)
SConscript 芯片启动文件、目标芯片型号(也是在E:\birld\rtOS\bsp\myOS\sixBand\board下,启动文件修改)

其他参见:一、现有BSP修改

三、祼机移植   2020-5-21看的直播,5-27日才能看回看

RTT的内核架构

移植步骤:

1、准备祼机工程(带串口打印)

2、添加RT-Thread源码(src,include,libcpu,rtconfig.h)

本人是基于stm32L431RCT6的芯片来移植,并且源工程是用CubeMX直接生成的,所以工程添加情况如下:基于nano3.13版本进行的移植。

Board文件夹存放的是board.c文件。rt-config.h与board.c都是直接拷贝nano3.13目录下bsp下:

3、实现时钟管理(Systick配置)board.c已经实现了systick的配置,所以基本上没动。至此,已经实现了大半,在工程中将main.c里的delay(),改为rt_thread_delay(500);就可以实现移植前的功能了。目的是,给系统提供时间片,这样系统才能跑起来。同时,系统切换时的延时rt_thread_delay()也是基于系统时间片的,切换也是基于systick的中断函数,所以这两步必不可少。

第一步,实现配置:

第二步实现systick中断

4、实现控制台输出(实现rt_hw_console_output()):目的是为了调用kt_printf打印调试信息。

这里主要实现coponets.c---->rt_show_version()下调用的rt_kprintf()函数。打开rt_printf()函数定义,有两种方式,一种是设备,另一种是void rt_hw_console_output(const char *str)函数。

使用最简单的,重新定义一下rt_hw_console_output().

个人遇到的问题是:

1、在重定义时,多加了一个取地址符,造成一直输出不对。

其中Usart_SendString原型为:

2、输出Log后没有换行:

解决:

以上遇到的两个问题,都和这个函数原型Usart_SendString()有关。

这个函数是输出一行,然后没有回车,所以是接着输出的,怎么办呢?最简单的办法。

 解决:

5、实现动态内存管理(rt_system_headp_init()):目的是为了实现多线程。线程是要分配栈空间的,所以需要知道每个栈的起始地址和结束地址。

直接移植的nano下的board.c里已经实现了rt_system_headp_init(),只要开启两个宏就可以了。

修改一个栈大小为10K,如下图:

然后在mian()函数里面创建一个新线程试试就可以了。如下:

至此,完成一个裸机工程的移植。

完整代码,附工程见CSDN上传资源

网站文章

  • 怎样做到长期写一个价值博客?

    怎样做到长期写一个价值博客?

    怎样做到长期写一个价值博客?(一)为什么你应该(从现在开始就)写博客用一句话来说就是,写一个博客有很多好处,却没有任何明显的坏处。(阿灵顿的情况属于例外,而非常态,就像不能拿抽烟活到一百岁的英国老太太...

    2024-02-01 05:54:14
  • XxlJob(一) 分布式定时任务XxlJob用法及核心调度源码详解

    XxlJob(一) 分布式定时任务XxlJob用法及核心调度源码详解

    XxlJob是目前最流行的分布式定时任务中间件,对比quartz,代码的侵入明显少了很多,而且admin组件提供了可视化ui, 简单易用,目前已经接入几百家物联网公司使用,由此可见XxlJob的强大任务调度能力为广大开发者所认可,那XxlJob是怎么工作的? XxlJob最新依赖版本: 2.3.0 和源码地址: com.xuxueli ...

    2024-02-01 05:54:08
  • java 数据库 html_HTML,Java,C语言,SQL数据库常用单词汇集1

    HTMLlist 列表;img 图片(image);& nbsp; 空格(&和n之间的空格去掉,不要忘记分号); (文字末尾添加)换行;background 背景;position 位...

    2024-02-01 05:53:40
  • JavaScript之迭代器Iterator

    JavaScript之迭代器Iterator

    2024-02-01 05:53:32
  • char str1[]="abc"; char str2[]="abc";str1与str2不相等,为什么

    两者不相等,是因为str1 和 str2 都是字符数组,每个都有其自己的存储区,它们的值则是各存储区的首地址。但有些情况却不一样, 程序如下: #include int main(void) { const char str3[] = "abc"; const char str4[] = "abc"; const char *st

    2024-02-01 05:53:25
  • win10计算机网络共享设置,win10电脑如何设置局域网共享?

    win10计算机网络共享设置,win10电脑如何设置局域网共享?

    win10电脑如何设置局域网共享??平时,大家在学校学习时,需要在课堂上使用到电脑,而有的时候就需要设置局域网共享来分发一些教学素材,或者是作业文档之类的东西,但是一些同学就是苦于不熟悉该如何去设置局...

    2024-02-01 05:52:58
  • mybatis中foreach的collection使用

    mybatis中foreach的collection使用

    2024-02-01 05:52:50
  • 选中的磁盘具有MBR分区表,在EFI系统上,windows只能安装到GPT磁盘

    选中的磁盘具有MBR分区表,在EFI系统上,windows只能安装到GPT磁盘

    今天在给自己做系统选择驱动器C盘的时候,出现了这种下面的这种问题,“Windows无法安装在这个磁盘。选中的磁盘具有MBR分区表。在EFI系统上,windows只能安装在GPT磁盘。” 解决方法: 首...

    2024-02-01 05:52:43
  • Android中线程和线程池

    我们知道线程是CPU调度的最小单位。在Android中主线程是不能够做耗时操作的,子线程是不能够更新UI的。在Android中,除了Thread外,扮演线程的角色有很多,如AsyncTask,IntentService和HandlerThread等等。由于内容过多,所以将分为上下两部分,第一部分主要和大家谈谈Android中的线程,以及在Android中的常用的线程池。第二部分我们一起来...

    2024-02-01 05:52:36
  • Cmake一次编译多个cpp

    Module下有一个CMakeLists.txt 的文件 默认内容是这样的,(只贴了需要改动的部分)cmake_minimum_required(VERSION 3.4.1)# Creates and names a library, sets it as either STATIC# or SHARED, and provides the relative paths...

    2024-02-01 05:52:07