FreeRTOS qemu mps2-an385 bsp 移植制作 :环境搭建篇

news2024/10/6 6:45:48

开发环境

  • Win10 64位 + VS Code,ssh 远程连接 ubuntu

  • VMware Workstation Pro 16 + Ubuntu 20.04

  • FreeRTOSv202212.01(备注:可以在 github 获取最新版本)

  • qemu qemu-system-arm mps2-an385 开发板,qemu 版本 QEMU emulator version 4.2.1 或更高

  • arm gcc 交叉编译工具链:当前使用 gcc 编译环境, gcc-arm-11.2-2022.02-x86_64-arm-none-eabi, gcc version 11.2.1 20220111

前言

  • FreeRTOS 当前支持 qemu mps2-an385,可以参考 FreeRTOSv202212.01\FreeRTOS\Demo\CORTEX_M3_MPS2_QEMU_GCC,所以整个移植难度降低很多,不过为了全面的掌握 FreeRTOS 上 board 的移植方法,所以采用全新移植的方式。

  • 为何使用 qemu而不使用实际的开发板进行 FreeRTOS 的学习研究?其实就是为了方便、高效,当然全面掌握RTOS 技术开发是离不开实际硬件的。

  • 使用 qemu,可以用于评估验证一些软件功能,开发一些组件、框架,这些软件功能,由于不依赖具体的平台,所以使用 qemu 来开发会大大的提高效率

  • 软件是调试出来的,一些功能的验证、运行结果的比对,需要大量的调试,使用 Qemu,无疑降低了调试环境的搭建,所以Qemu 用于开发学习 FreeRTOS,是很有用的一件事情。

环境的准备

  • 开发环境暂时为 :Linux 环境, ubuntu 20.04,后面尝试适配到 Windows 上,工程编译采用 gcc 交叉编译,Makefile 构建

  • ubuntu 20.04 需要安装 qemu,qemu-system-arm,默认版本即可支持 Qemu 开发板:mps2-an385

  • 可以在 Linux shell 下 输入命令查看 qemu 支持的开发板:

$ qemu-system-arm --version
QEMU emulator version 4.2.1 (Debian 1:4.2-3ubuntu6.27)
Copyright (c) 2003-2019 Fabrice Bellard and the QEMU Project developers
  • qemu-system-arm -M help 查看当前 qemu qemu-system-arm 支持的 ARM 开发板

在这里插入图片描述

  • mps2-an385 ARM MPS2 with AN385 FPGA image for Cortex-M3,类似于 STM32F103 系列,是 ARM Cortex-M3 系列的。

获取 mps2-an385 相关资料

  • 说实话,这个 mps2-an385 的资料非常少,我当前获取到的就是一个 SDK,还是从 ARM 官方搜索半天找到的。不过这个 mps2-an385 类似于 STM32,systick、pendSV 等跟 STM32 基本一致,所以基本不需要改动就可以运行。

下载 V2M-MPS2_CMx_BSP

  • mps2 的资料很少,所以唯一能下载的是 ARM 官方的 V2M-MPS2_CMx_BSP,下载地址为: https://keilpack.azureedge.net/pack/Keil.V2M-MPS2_CMx_BSP.1.8.0.pack

在这里插入图片描述

  • 其实这是个 Keil MDK5 的 Pack 包,安装后,会有相应的头文件、简单的示例

提取启动文件与连接脚本

  • 安装 Keil.V2M-MPS2_CMx_BSP.1.8.0.pack 后, 在 V2M-MPS2_CMx_BSP\1.8.0\Device\CMSDK_CM3\Source\GCC 路径下,有 mps2-an385 的启动文件与连接脚本

在这里插入图片描述

在这里插入图片描述

  • 把整个 V2M-MPS2_CMx_BSP\1.8.0\Device\CMSDK_CM3 目录复制到工程 qemu-mps2-arm 目录下

  • mps2-an385 的 启动文件与连接脚本,与 STM32F103 系列的很像,基本不需要修改就可以使用

获取 CMSIS 相关头文件

  • 编译报 system_CMSDK_CM3.c:35:4: error: #error device not specified!,可以在 qemu-mps2-arm/CMSDK_CM3/Source/system_CMSDK_CM3.c 文件上面定义 MCU 的型号 #define CMSDK_CM3

  • 编译还缺少 CMSIS 相关的头文件,如 core_cm3.h 文件: 这部分可以复制 Keil MDK5 pack 路径下的 \ARM\CMSIS\5.8.0\CMSIS\Core\Include\core_cm3.h 到 工程 cmsis\Core\Include 目录

  • 工程创建 qemu-mps2-arm/cmsis/Core/Include 目录,把以下Keil MDK5 pack 路径下的相关 cmsis 头文件文件复制进来

  • \ARM\CMSIS\5.8.0\CMSIS\Core\Include\cmsis_compiler.h

  • \ARM\CMSIS\5.8.0\CMSIS\Core\Include\cmsis_gcc.h

  • \ARM\CMSIS\5.8.0\CMSIS\Core\Include\cmsis_version.h

  • \ARM\CMSIS\5.8.0\CMSIS\Core\Include\core_cm3.h

  • \ARM\CMSIS\5.8.0\CMSIS\Core\Include\mpu_armv7.h

配置arm gcc 交叉编译环境

  • 下载 arm gcc 交叉编译工具链:ARM 官方提供 各个版本的下载地址
    https://developer.arm.com/downloads/-/arm-gnu-toolchain-downloads

  • 当前验证 较新的版本,如 gcc-arm-11.2-2022.02-x86_64-arm-none-eabi,可以正常编译并运行

  • 可以在 gcc 交叉编译工具链下 bin 目录,运行 arm-none-eabi-gcc -v,确认 交叉编译工具链可以工作

在这里插入图片描述

获取 FreeRTOS

  • 如果可以访问 github,建议从 github 上 使用 git 拉取最新的 FreeRTOS 版本,也可以下载 FreeRTOS 的 Release 版本,我当前使用 FreeRTOSv202212.01

  • 下载地址:可以在 github 或者 FreeRTOS 官方网站上找到下载链接 https://github.com/FreeRTOS/FreeRTOS/releases/tag/202212.01

  • git clone https://github.com/FreeRTOS/FreeRTOS.git --recurse-submodules

  • 或者只 clone FreeRTOS 的 Kernel,不过最好全部 clone 下来,参考里面的例程

  • git clone https://github.com/FreeRTOS/FreeRTOS-Kernel.git

配置工程目录文件

  • 为了减少 工程的体积,只需要把需要的代码文件复制到工程即可

  • 可以复制到工程后,手动移除不需要的目录与文件,也可以只复制需要的目录与文件到工程

  • 当前的 qemu mps2-an385 属于 ARM Cortex-M3,Linux gcc 交叉编译环境,所以平台文件需要 FreeRTOSv202212.01\FreeRTOS\Source\portable\GCC\ARM_CM3

  • 内存管理部分:FreeRTOSv202212.01\FreeRTOS\Source\portable\MemMang 需要

  • 内核部分:主要是 FreeRTOSv202212.01\FreeRTOS\Source 下的 .c 文件

  • 头文件 : 需要 FreeRTOSv202212.01\FreeRTOS\Source\include

  • FreeRTOS 的授权 License 可以复制到工程

工程的结构如下

zhangsz@zhangsz:~/rtos/freertos_arm_qemu$ tree
.
├── License
│   └── license.txt
├── qemu_arm_mps2
│   ├── application
│   │   ├── IntQueue.c
│   │   ├── IntQueue.h
│   │   ├── IntQueueTimer.c
│   │   ├── IntQueueTimer.h
│   │   ├── main_blinky.c
│   │   ├── main.c
│   │   └── printf-stdarg.c
│   ├── CMSDK_CM3
│   │   ├── Include
│   │   │   ├── CMSDK_CM3.h
│   │   │   └── system_CMSDK_CM3.h
│   │   └── Source
│   │       ├── ARM
│   │       │   ├── ac6_arm.sct
│   │       │   └── startup_CMSDK_CM3.S
│   │       ├── GCC
│   │       │   ├── gcc_arm.ld
│   │       │   └── startup_CMSDK_CM3.S
│   │       ├── startup_CMSDK_CM3.c
│   │       └── system_CMSDK_CM3.c
│   ├── cmsis
│   │   └── core
│   │       └── include
│   │           ├── cmsis_compiler.h
│   │           ├── cmsis_gcc.h
│   │           ├── cmsis_version.h
│   │           ├── core_cm3.h
│   │           └── mpu_armv7.h
│   ├── FreeRTOSConfig.h
│   ├── Makefile
│   ├── output
│   │   └── asm
│   ├── qemu-debug.sh
│   ├── qemu.sh
│   └── Readme.md
├── readme.md
└── Source
    ├── croutine.c
    ├── event_groups.c
    ├── include
    │   ├── atomic.h
    │   ├── CMakeLists.txt
    │   ├── croutine.h
    │   ├── deprecated_definitions.h
    │   ├── event_groups.h
    │   ├── FreeRTOS.h
    │   ├── list.h
    │   ├── message_buffer.h
    │   ├── mpu_prototypes.h
    │   ├── mpu_wrappers.h
    │   ├── newlib-freertos.h
    │   ├── picolibc-freertos.h
    │   ├── portable.h
    │   ├── projdefs.h
    │   ├── queue.h
    │   ├── semphr.h
    │   ├── stack_macros.h
    │   ├── StackMacros.h
    │   ├── stdint.readme
    │   ├── stream_buffer.h
    │   ├── task.h
    │   └── timers.h
    ├── LICENSE.md
    ├── list.c
    ├── portable
    │   ├── GCC
    │   │   └── ARM_CM3
    │   │       ├── port.c
    │   │       └── portmacro.h
    │   └── MemMang
    │       ├── heap_1.c
    │       ├── heap_2.c
    │       ├── heap_3.c
    │       ├── heap_4.c
    │       ├── heap_5.c
    │       └── ReadMe.url
    ├── queue.c
    ├── README.md
    ├── stream_buffer.c
    ├── tasks.c
    └── timers.c
  • 备注: mps2-an385 的 bsp 相关文件,可以从 FreeRTOSv202212.01\FreeRTOS\Demo\CORTEX_M3_MPS2_QEMU_GCC 获取,当前连接脚本、启动文件,采用 V2M-MPS2_CMx_BSP 里面的

  • Makefile 构建文件

OUTPUT_DIR := ./output
IMAGE := mps2_demo.elf

KERNEL_ROOT = ./..
CROSS_COMPILE = /home/zhangsz/linux/tools/gcc-arm-11.2-2022.02-x86_64-arm-none-eabi/bin/

CC = $(CROSS_COMPILE)/arm-none-eabi-gcc
LD = $(CROSS_COMPILE)/arm-none-eabi-gcc
SIZE = $(CROSS_COMPILE)/arm-none-eabi-size
MAKE = make

CFLAGS += $(INCLUDE_DIRS) -nostartfiles -ffreestanding -mthumb -mcpu=cortex-m3 \
		  -Wall -msoft-float -g -O0 -ffunction-sections -fdata-sections \
		  -std=gnu99 \

LDFLAGS=-mthumb \
		-mcpu=cortex-m3 \
		-mlittle-endian \
		-ffreestanding \
		-specs=nano.specs \
		-specs=nosys.specs \
		-specs=rdimon.specs \
		-T$(LINK_SCRIPTS) \
		-Wl,-Map=$(OUTPUT_DIR)/mps2_demo.map

#KERNEL_DIR = $(KERNEL_ROOT)/uC-OS2
KERNEL_DIR = $(KERNEL_ROOT)/Source
KERNEL_PORT_DIR += $(KERNEL_DIR)/portable/GCC/ARM_CM3

INCLUDE_DIRS += -I$(KERNEL_DIR)/include \
				-I$(KERNEL_DIR)/portable/GCC/ARM_CM3 \

SOURCE_FILES += $(KERNEL_DIR)/tasks.c
SOURCE_FILES += $(KERNEL_DIR)/list.c
SOURCE_FILES += $(KERNEL_DIR)/queue.c
SOURCE_FILES += $(KERNEL_DIR)/timers.c
SOURCE_FILES += $(KERNEL_DIR)/event_groups.c
SOURCE_FILES += $(KERNEL_DIR)/stream_buffer.c
SOURCE_FILES += $(KERNEL_DIR)/portable/MemMang/heap_4.c
SOURCE_FILES += $(KERNEL_DIR)/portable/GCC/ARM_CM3/port.c

DEMO_ROOT = $(KERNEL_ROOT)
DEMO_PROJECT = $(DEMO_ROOT)/qemu_arm_mps2
INCLUDE_DIRS += -I$(DEMO_PROJECT) \
				-I$(DEMO_PROJECT)/cmsis/core/include \
				-I$(DEMO_PROJECT)/CMSDK_CM3/Include \

SOURCE_FILES += $(DEMO_PROJECT)/application/main.c
SOURCE_FILES += $(DEMO_PROJECT)/application/main_blinky.c
SOURCE_FILES += $(DEMO_PROJECT)/application/IntQueue.c
SOURCE_FILES += $(DEMO_PROJECT)/application/IntQueueTimer.c
SOURCE_FILES += $(DEMO_PROJECT)/application/printf-stdarg.c
SOURCE_FILES += $(DEMO_PROJECT)/CMSDK_CM3/Source/system_CMSDK_CM3.c

ASM_OBJS = $(DEMO_PROJECT)/CMSDK_CM3/Source/GCC/startup_CMSDK_CM3.o

APP_OBJS=$(patsubst  %.c, %.o, $(SOURCE_FILES))

LINK_SCRIPTS = $(DEMO_PROJECT)/CMSDK_CM3/Source/GCC/gcc_arm.ld

all: app
	@echo "---- build end ----"

.c.o:
	$(CC) -c $^  -o $@ $(CFLAGS)

.S.o:
	$(CC) -c $^ -o $@ $(CFLAGS)

app : $(APP_OBJS) $(ASM_OBJS)
	$(CC)  $^ -o $(IMAGE) $(LDFLAGS)

clean :
	rm -f $(APP_OBJS)
	rm -f $(ASM_OBJS)
	rm -f $(IMAGE)

export CFLAGS CC
  • 编译时注意修改 CROSS_COMPILE 交叉编译工具链的路径

小结

  • 本篇注意介绍 FreeRTOS qemu mps2-an385 bsp 的制作,后面开始编译、调优与运行

  • qemu 调试环境可以加快 FreeRTOS 的学习与研究,在功能验证、软件组件框架开发中,会提高效率

  • 掌握了 qemu 在 FreeRTOS 上的移植,相信移植到真实硬件上,也会提供较好的参考

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/882896.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

eNSP 配置交换机三种端口链路类型:Access、Trunk、Hybird

文章目录 1 概述1.1 总结:access、trunk、hybird 2 三种端口链路类型2.1 Access2.1.1 报文处理流程2.1.2 命令配置实验 2.2 Trunk2.2.1 报文处理流程2.2.2 命令配置实验 2.3 hybird2.3.1 报文处理流程2.3.2 命令配置实验 3 扩展3.1 查看 vlan 信息:displ…

实习机试代码记录

机试记录 2023-03-11 美团机试第一题第二题第三题第四题第五题 2023-03-12 拼多多机试第一题 多多的压缩编码II第二题 多多的飞机大战游戏第三题 多多的团建计划第四题 多多的餐厅客流量 2023-3-15 阿里机试第一题第二题第三题 2023-3-16 蚂蚁机试第一题 整数抽取第二题 组装电…

突破网络编程1024限制的方法(修改配置文件)

文章目录 概述修改linux配置相关命令步骤1. 打开终端2. 使用sudo权限编辑文件3. 添加资源限制配置4. 保存和退出5. 重启系统或重新登录 其他方法1. 使用事件驱动的框架2. 使用连接池3. 负载均衡4. 使用线程池和进程池5. 升级操作系统设置6. 使用专业的高性能服务器7. 分布式架构…

excel快速选择数据、选择性粘贴、冻结单元格

一、如何快速选择数据 在excel中,希望选择全部数据,通常使用鼠标选择数据然后往下拉,当数据很多时,也可单击单元格使用ctrl A选中全部数据,此外,具体介绍另一种方法。 操作:ctrl shift 方向…

6.RocketMQ之索引文件ConsumeQueue

本文着重分析为consumequeue/topic/queueId目录下的索引文件。 1.ConsumeQueueStore public class ConsumeQueueStore {protected final ConcurrentMap<String>, ConcurrentMap<Integer>, ConsumeQueueInterface>> consumeQueueTable;public boolean load(…

重新梳理DeepFaceLab(DeepFake)最近动态:简要且全面的信息

DeepFaceLab相关文章 一&#xff1a;《简单介绍DeepFaceLab&#xff08;DeepFake&#xff09;的使用以及容易被忽略的事项》 二&#xff1a;《继续聊聊DeepFaceLab&#xff08;DeepFake&#xff09;不断演进的2.0版本》 三&#xff1a;《如何翻译DeepFaceLab&#xff08;DeepF…

docker安装及优化详解

目录 一、部署20版的docker 1.1 安装依赖包 1.2 设置阿里云镜像源 1.3 安装docker-ce 社区版 1.4 关闭增强机制 1.5 开启服务 1.6 设置镜像加速 1.7 网络优化 二、linux 系统中的命令 记10条(cd ls pwd mv cp ) 2.1 查询docker 版本 2.2 搜索镜像 2.3 技能点 2.…

北美电商圈的黑马Shein(希音)产品权重打造,测评补单助销量提升

这两年北美的电商领域出现了一些备受关注的热门平台&#xff0c;其中Shein和TEMU无疑是其中的佼佼者。关于TEMU的测评之前有做过介绍&#xff0c;今天我们来探讨一下Shein是否也可以借助测评补单的方式来打造产品泉州提升销量。 首先不可否认只要是电商平台都可以通过测评补单…

数据结构--最短路径 Dijkstra算法

数据结构–最短路径 Dijkstra算法 Dijkstra算法 计算 b e g i n 点到各个点的最短路 \color{red}计算\ begin\ 点到各个点的最短路 计算 begin 点到各个点的最短路 如果是无向图&#xff0c;可以先把无向图转化成有向图 我们需要2个数组 final[] &#xff08;标记各顶点是否已…

FPGA:uart原理+tx发送模块

文章目录 一、串口通信二、UART通信三、tx发送模块 一、串口通信 处理器与外部设备通信的两种方式&#xff1a; 串行通信&#xff1a; 指数据的各个位使用多条数据线同时进行传输。 并行通信&#xff1a; 将数据分成一位一位的形式在一条数据线上逐个传输。 串行通信的通信方…

SpringBoot中properties、yml、yaml的优先级

原理 配置优先级低的会先加载然后会被配置优先级高的覆盖 验证 创建SpringBoot项目&#xff08;网址&#xff09; 在resource目录下创建application.properties、application.yml、application.yaml文件 运行 结论 优先级顺序&#xff1a; properties>yml>yaml

ARM处理器

1、RISC处理器&#xff1a; RISC (Reduced Instruction Set Computer) 微处理器是一种计算机微处理器架构&#xff0c;其设计原则是通过简化指令集来提高执行速度。 (1)、RISC处理器的设计理念&#xff1a; 简化指令集&#xff1a;RISC 微处理器的指令集非常精简&#xff0c…

匠心工艺-易天注胶设备新升级

随着科技的不断发展&#xff0c;注胶设备也在不断地升级换代。近期&#xff0c;易天光通信自主研发的注胶新设备投入DAC产线使用&#xff0c;新升级的注胶设备在原有的基础上&#xff0c;投入了更加先进的工艺技术&#xff0c;大幅度提升生产工作效率。 一、注胶设备的功能与性…

【UE】Web Browser内嵌网页在场景中的褪色问题

使用WebBrowser放置在场景中时&#xff0c;网页颜色会出现异常的褪色。 这是因为 Web 浏览器插件以 sRGB 格式输出其颜色数据&#xff0c;而 Widget/3D Widget 需要线性 RGB 格式的数据。 可以通过创建在 3D Widget 中使用的新材质&#xff08;而不是默认的 Widget3DPassthr…

Rust语法:所有权引用生命周期

文章目录 所有权垃圾回收管理内存手动管理内存Rust的所有权所有权转移函数所有权传递 引用与借用可变与不可变引用 生命周期悬垂引用函数生命周期声明结构体的生命周期声明Rust生命周期的自行推断生命周期约束静态生命周期 所有权 垃圾回收管理内存 Python&#xff0c;Java这…

远程仓库上创建一个新的分支 `b` 并将远程分支 `a` 的内容克隆到 `b` 分支上

一、需求&#xff1a; 要在远程仓库上创建一个新的分支 b 并将远程分支 a 的内容克隆到 b 分支上&#xff0c;你可以按照以下步骤进行操作&#xff1a; 二、解决方案&#xff1a; 1. 首先&#xff0c;使用 git clone 命令克隆远程仓库到本地。例如&#xff0c;要克隆一个名为…

Python数据分析实战-dataframe 某一列数据每个元素做处理并新增一列(附源码和实现效果)

实现功能 dataframe 某一列数据每个元素做处理并新增一列 实现代码 import pandas as pd# 创建示例数据 df pd.DataFrame({A: [1, 2, 3], B: [foo, bar, baz]}) # 对列 B 中的每个元素加上 processed_ 前缀&#xff0c;并将结果添加为新列 C df[C] df[B].apply(lambda x: p…

台湾shopee:虾皮电商平台选品方法与市场机遇

台湾Shopee虾皮电商平台为台湾本土卖家和消费者提供了一个线上交易平台。对于想要在台湾市场做虾皮电商的卖家来说&#xff0c;选择合适的产品是非常重要的。本文介绍一些做虾皮电商的选品方法和策略。 首先&#xff0c;了解市场需求是选品的基础。在进入台湾Shopee市场之前&a…

Linux6.39 Kubernetes Pod控制器

文章目录 计算机系统5G云计算第三章 LINUX Kubernetes Pod控制器一、Pod控制器及其功用二.pod控制器有多种类型1.ReplicaSet2.Deployment3.DaemonSet4.StatefulSet5.Cronjob 三、Pod与控制器之间的关系1.Deployment2.SatefulSet1&#xff09;为什么要有headless2&#xff09;为…

注解@Value获取配置文件内容 (demo)

1. 自定义配置文件内容 (application.yml) 2. 使用 Value("${xxx}") 注入属性 import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component;Compone…