RTT开发之windows 环境配置

news2025/1/12 1:44:21

1. 安装python

有些文章说支持2.7, 实测3.9环境也是OK的

2. 安装scons组件

其他文章多是下载安装,实际操作麻烦还成功率低, 直接pip安装

 pip install scons

然后命令测试

D:\rt-thread-5.0.0\bsp\wch\arm\ch579m>scons
scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
scons: building associated VariantDir targets: build
scons: `.' is up to date.
scons: done building targets.

证明安装成功

3. 下载rtt完整的最新版本

 https://github.com/RT-Thread/rt-thread

目前更新到5.0.0

解压到指定目录

4. 修改编译配置文件

 vscode打开对应芯片bsp目录的rtconfig.py

这次玩的是沁恒的CH579M, 目录: D:\rt-thread-5.0.0\bsp\wch\arm\ch579m\rtconfig.py

import os

# toolchains options
ARCH='arm'
CPU='cortex-m0'
CROSS_TOOL='keil'

# bsp lib config
BSP_LIBRARY_TYPE = None

if os.getenv('RTT_CC'):
    CROSS_TOOL = os.getenv('RTT_CC')
if os.getenv('RTT_ROOT'):
    RTT_ROOT = os.getenv('RTT_ROOT')

# cross_tool provides the cross compiler
# EXEC_PATH is the compiler execute path, for example, CodeSourcery, Keil MDK, IAR
if  CROSS_TOOL == 'gcc':
    PLATFORM    = 'gcc'
    EXEC_PATH   = r'C:/GCC'
elif CROSS_TOOL == 'keil':
    PLATFORM    = 'armcc'
    EXEC_PATH   = r'd:/Keil_v5'
elif CROSS_TOOL == 'iar':
    PLATFORM    = 'iccarm'
    EXEC_PATH   = r'C:/IAR'

if os.getenv('RTT_EXEC_PATH'):
    EXEC_PATH = os.getenv('RTT_EXEC_PATH')

BUILD = 'debug'

if PLATFORM == 'gcc':
    # toolchains
    PREFIX = 'arm-none-eabi-'
    CC = PREFIX + 'gcc'
    AS = PREFIX + 'gcc'
    AR = PREFIX + 'ar'
    CXX = PREFIX + 'g++'
    LINK = PREFIX + 'gcc'
    TARGET_EXT = 'elf'
    SIZE = PREFIX + 'size'
    OBJDUMP = PREFIX + 'objdump'
    OBJCPY = PREFIX + 'objcopy'

    DEVICE = ' -mcpu=cortex-m0 -mthumb -ffunction-sections -fdata-sections'
    CFLAGS = DEVICE + ' -std=gnu9x'
    AFLAGS = ' -c' + DEVICE + ' -x assembler-with-cpp'
    LFLAGS = DEVICE + ' -Wl,--gc-sections,-Map=rt-thread.map,-cref,-u,Reset_Handler -T board/linker_scripts/link.lds'

    CPATH = ''
    LPATH = ''

    if BUILD == 'debug':
        CFLAGS += ' -O0 -gdwarf-2 -g'
        AFLAGS += ' -gdwarf-2'
    else:
        CFLAGS += ' -O2'

    CXXFLAGS = CFLAGS 

    POST_ACTION = OBJCPY + ' -O binary $TARGET rtthread.bin\n' + SIZE + ' $TARGET \n'

elif PLATFORM == 'armcc':
    # toolchains
    CC = 'armcc'
    CXX = 'armcc'
    AS = 'armasm'
    AR = 'armar'
    LINK = 'armlink'
    TARGET_EXT = 'axf'

    DEVICE = ' --cpu Cortex-M3 '
    CFLAGS = '-c ' + DEVICE + ' --apcs=interwork --c99'
    AFLAGS = DEVICE + ' --apcs=interwork '
    LFLAGS = DEVICE + '  --info sizes --info totals --info unused --info veneers --list rt-thread.map'
    LFLAGS += r' --strict --scatter "board\linker_scripts\rt-thread.sct" '
    CFLAGS += ' -I' + EXEC_PATH + '/ARM/ARMCC/include'
    LFLAGS += ' --libpath=' + EXEC_PATH + '/ARM/ARMCC/lib'

    CFLAGS += ' -D__MICROLIB '
    AFLAGS += ' --pd "__MICROLIB SETA 1" '
    LFLAGS += ' --library_type=microlib '
    EXEC_PATH += '/ARM/ARMCC/bin/'

    if BUILD == 'debug':
        CFLAGS += ' -g -O0'
        AFLAGS += ' -g'
    else:
        CFLAGS += ' -O2'

    CXXFLAGS = CFLAGS 

    POST_ACTION = 'fromelf --bin $TARGET --output rtthread.bin \nfromelf -z $TARGET'

elif PLATFORM == 'iccarm':
    # toolchains
    CC = 'iccarm'
    CXX = 'iccarm'
    AS = 'iasmarm'
    AR = 'iarchive'
    LINK = 'ilinkarm'
    TARGET_EXT = 'out'

    DEVICE = '-Dewarm'

    CFLAGS = DEVICE
    CFLAGS += ' --diag_suppress Pa050'
    CFLAGS += ' --no_cse'
    CFLAGS += ' --no_unroll'
    CFLAGS += ' --no_inline'
    CFLAGS += ' --no_code_motion'
    CFLAGS += ' --no_tbaa'
    CFLAGS += ' --no_clustering'
    CFLAGS += ' --no_scheduling'
    CFLAGS += ' --endian=little'
    CFLAGS += ' --cpu=Cortex-M3'
    CFLAGS += ' -e'
    CFLAGS += ' --fpu=None'
    CFLAGS += ' --dlib_config "' + EXEC_PATH + '/arm/INC/c/DLib_Config_Normal.h"'
    CFLAGS += ' --silent'

    AFLAGS = DEVICE
    AFLAGS += ' -s+'
    AFLAGS += ' -w+'
    AFLAGS += ' -r'
    AFLAGS += ' --cpu Cortex-M3'
    AFLAGS += ' --fpu None'
    AFLAGS += ' -S'

    if BUILD == 'debug':
        CFLAGS += ' --debug'
        CFLAGS += ' -On'
    else:
        CFLAGS += ' -Oh'

    LFLAGS = ' --config "board/linker_scripts/link.icf"'
    LFLAGS += ' --entry __iar_program_start'

    CXXFLAGS = CFLAGS
    
    EXEC_PATH = EXEC_PATH + '/arm/bin/'
    POST_ACTION = 'ielftool --bin $TARGET rtthread.bin'

def dist_handle(BSP_ROOT, dist_dir):
    import sys
    cwd_path = os.getcwd()
    sys.path.append(os.path.join(os.path.dirname(BSP_ROOT), 'tools'))
    from sdk_dist import dist_do_building
    dist_do_building(BSP_ROOT, dist_dir)

沁恒用的是keil进行编译,所以交叉工具设为keil

 CROSS_TOOL='keil'

然后指定keil的安装目录:

elif CROSS_TOOL == 'keil':

    PLATFORM    = 'armcc'

    EXEC_PATH   = r'd:/Keil_v5' # 换成自己的keil安装目录

5. 修改板子的sct文件,否则会报link错误

D:\rt-thread-5.0.0\bsp\wch\arm\ch579m>scons -j4
scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
scons: building associated VariantDir targets: build
LINK rtthread.axf
Fatal error: L6031U: Could not open scatter description file .\board\linker_scripts\link.sct: No such file or directory
Finished: 0 information, 0 warning, 0 error and 1 fatal error messages.
scons: *** [rtthread.axf] Error 1
scons: building terminated because of errors. 

根据错误,修改成keil里面自行生成的可用的sct文件搬过来的路径 

     LFLAGS += r' --strict --scatter "board\linker_scripts\rt-thread.sct" '

再编译:

 

D:\rt-thread-5.0.0\bsp\wch\arm\ch579m>scons -j4
scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
scons: building associated VariantDir targets: build
LINK rtthread.axf
fromelf --bin rtthread.axf --output rtthread.bin
fromelf -z rtthread.axf

========================================================================

** Object/Image Component Sizes

      Code (inc. data)   RO Data    RW Data    ZI Data      Debug   Object Name

    120072      18564       4660        680      27596     819711   rtthread.axf (uncompressed)
    120072      18564       4660        168      27596     819711   rtthread.axf (compressed)
    120072      18564       4660        168          0          0   ROM Totals for rtthread.axf
scons: done building targets.

顺利完成编译 

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

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

相关文章

【最优潮流】直流最优潮流(OPF)课设(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

HJ51 输出单向链表中倒数第k个结点

写在前面: 做题环境如下: 题目渠道:牛客网 HJ51 输出单向链表中倒数第k个结点 华为机试题 编程语言:C 一、题目描述 描述 输入一个单向链表,输出该链表中倒数第k个结点,链表的倒数第1个结点为链表的尾指针…

这就是二分查找?(C语言版)

大家好!我又来了,哈哈~今天我要和大家分享一种神奇的算法——二分查找!你可能会问,“二分查找有什么好玩的?”但在我看来它就像一场魔法表演,当你输入一个数,他会在一堆数中快速找到它的位置。找…

day10 TCP是如何实现可靠传输的

TCP最主要的特点 1、TCP是面向连接的运输层协议。( 每一条TCP连接只能有两个端点(endpoint),每一条TCP连接只能是点对点的(一对一)) 2、TCP提供可靠交付的服务。 3、TCP提供全双工通信。 4…

HTTP第一讲——HTTP是什么?

定义: HTTP 就是超文本传输协议,也就是 HyperText TransferProtocol。 HTTP 的名字是“超文本传输协议”,它可以拆成三个部分,分别是:“超文本”、“传输”和“协议”。 首先,HTTP 是一个协议。不过&…

Swagger使用手册

目录 Swagger 的依赖Swagger 的配置Swagger 生成的测试页面地址Swagger 的注解遇到过的问题提示 documentationPluginsBootstrapper 空指针异常 Swagger 的依赖 <!--swagger2--> <dependency><groupId>io.springfox</groupId><artifactId>sprin…

【MATLAB图像处理实用案例详解(23)】——基于形态学处理的焊缝边缘检测算法

目录 一、问题描述二、图像预处理2.1 中值滤波去噪2.2 白平衡处理 三、焊缝边缘检测3.1 Sobel算子边缘检测3.2 Prewitt算子边缘检测3.3 Canny算子边缘检测3.4 形态学处理边缘检测 四、结果分析 一、问题描述 目前很多机械关键部件均为钢焊接结构&#xff0c;钢焊接结构易出现裂…

SSL证书支持IP改成https地址

我们都知道SSL证书能为域名加密&#xff0c;那么IP地址可以实现https加密吗&#xff1f;答案当然是肯定的。为IP地址进行https加密不仅能保护IP服务器与客户端之间数据传输安全&#xff0c;还能对IP服务器进行身份验证&#xff0c;确保用户信息安全&#xff0c;增强用户对IP地址…

Python每日一练(20230502)

目录 1. 被围绕的区域 &#x1f31f;&#x1f31f; 2. 两数之和 II &#x1f31f; 3. 二叉树展开为链表 &#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏 1…

【操作系统OS】学习笔记:第一章 操作系统基础【哈工大李治军老师】

基于本人观看学习 哈工大李治军老师主讲的操作系统课程 所做的笔记&#xff0c;仅进行交流分享。 特此鸣谢李治军老师&#xff0c;操作系统的神作&#xff01; 如果本篇笔记帮助到了你&#xff0c;还请点赞 关注 支持一下 ♡>&#x16966;<)!! 主页专栏有更多&#xff0…

【前端知识】Cookie, Session,Token和JWT的发展及区别(中)

【前端知识】Cookie, Session&#xff0c;Token和JWT的发展及区别&#xff08;中&#xff09; 4. Session4.1 Session的背景及定义4.2 Session的特点&#x1f44d;4.2.1 Session的特点&#x1f440;4.2.2 Session保存的位置 4.3 Session的一些重要/常用属性4.4 Session的认证流…

算法之美~分治算法

如何理解分治算法&#xff1f; 分治算法&#xff08;divide and conquer&#xff09;的核心思想其实是&#xff0c;分而治之&#xff0c;也就是将原问题划分成n个规模较小&#xff0c;并且结构与原问题相似的子问题&#xff0c;递归第解决这些子问题&#xff0c;然后再合并其结…

什么是 Docker?它能用来做什么?

文章目录 什么是云计算&#xff1f;什么是 Docker&#xff1f;虚拟化技术演变特点架构镜像&#xff08;Image&#xff09;仓库&#xff08;Registry &#xff09;容器&#xff08;Container&#xff09; 应用场景 什么是云计算&#xff1f; 云计算是一种资源的服务模式&#x…

应急响应概述

一、应急响应事件类型 常见的应急响应事件分类&#xff1a; Web 入侵&#xff1a;主页篡改、Webshell 系统入侵&#xff1a;病毒木马、勒索软件、远控后门 网络攻击&#xff1a;DDOS 攻击、DNS 劫持、ARP 欺骗 二、可疑账号排查 2.1Windows 1&#xff09;‘WinR’…

世界坐标系、相机坐标系和图像坐标系的转换

本文转载于&#xff1a;https://blog.csdn.net/weixin_38842821/article/details/125933604?spm1001.2014.3001.5506 1. 世界坐标 世界坐标系是一个特殊坐标系&#xff0c;它建立了描述其他坐标系需要的参考框架。能够用世界坐标系描述其他坐标系的位置&#xff0c;而不能用更…

stack、queue和priority_queue的使用介绍--C++

一、stack介绍 1. stack是一种容器适配器&#xff0c;专门用在具有后进先出操作的上下文环境中&#xff0c;其删除只能从容器的一端进行元素的插入与提取操作。 2. stack是作为容器适配器被实现的&#xff0c;容器适配器即是对特定类封装作为其底层的容器&#xff0c;并提供一组…

YOLOv5 更换Neck之 BiFPN:如何替换YOLOv5的Neck实现更强的检测能力?

目录 一、BiFPN是什么&#xff1f;1、什么是BiFPN2、BiFPN的优势 二、为什么要用BiFPN替换YOLOv5的Neck&#xff1f;1、YOLOv5原有的Neck存在的问题2、BiFPN的适用场景 三、如何在YOLOv5中实现BiFPN1、下载并替换BiFPN代码2、修改配置文件3、遇到的问题及解决方法 四、BiFPN超参…

IronOCR 2023.4.13 Crack

IronOCR能够允许用户软件工程师直接从图片中读取文本文章&#xff0c;以及从.NET的程序和互联网网站中读取PDF。从扫描的图像中读取文本和条形码&#xff0c;能够支持多种外语&#xff0c;并且输出为纯文本甚至信息结构。IronOCR库能够供用户在互联网游戏控制台中使用。MVC&…

PyQt6: 多网卡适配器的选择与显示(GPT4帮写)

PyQt6: 多网卡适配器的选择与显示 1. 背景2. Python获取本机网卡适配器信息3. PyQT6 UI显示网卡信息4. PyQT6 后台处理&#xff1a;ButtonComboBox 附&#xff1a;GPT Output&#xff1a;博主热门文章推荐&#xff1a; &#xff08;本文部分文案由ChatGPT生成&#xff0c;但代码…

企企通:为什么成长型企业,需要SaaS采购管理平台?

根据艾瑞咨询发布的《2022年中国企业级SaaS行业研究报告》&#xff0c;未来三年SaaS行业的增长也将与宏观经济恢复速度相挂钩&#xff0c;在中性预期下&#xff0c;到2024年中国企业级SaaS市场规模将有望达到1201亿元。 由于SaaS和云模式出现&#xff0c;采购角色在慢慢发生了变…