【ARM Cortex-M 系列 5 -- RT-Thread renesas/ra4m2-eco 移植编译篇】
文章目录
- RT-Thread 移植编译篇
- 编译
- os.environ 使用示例
- os.putenv使用示例
- python from 后指定路径
- 编译问题
- _POSIX_C_SOURCE 介绍
- 编译结果
RT-Thread 移植编译篇
本文以瑞萨的ra4m2-eco 为例介绍如何下载rt-thread 及编译的设置。
RT-Thread 代码下载:
git clone 路径:https://github.com/RT-Thread/rt-thread

代码下载下来后如下:
[03:04:21] (*^~^*) ~/sam/workbase/rtthread/rt-thread$ ls
AUTHORS ChangeLog.md examples Jenkinsfile libcpu README_de.md README.md src tools
bsp components documentation include Kconfig LICENSE README_es.md README_zh.md
此外还需自行下载一套编译 arm gcc 编译工具,如gcc-arm-none-eabi。
编译
进入rt-thread/bsp/renesas/ra4m2-eco 目录执行scons 命令进行编译,通常会报出 RTT_ROOT 没有定义,这个是系统环境变量,我们可以通过 os.environ 进行设置。我看网上很多都提到了使用python中的 setenv 的函数。这时可能是你遇到 AttributeError: module 'os' has no attribute 'setenv' 错误。 我这边最后使用的是 os.environ 进行设置。
os.environ 使用示例
os.environ 是一个包含所有环境变量的字典。你可以直接使用它来设置环境变量,就像操作普通字典一样:
import os
os.environ['MY_VARIABLE'] = 'my_value'
这种方法设置的环境变量只在当前进程中有效,如果 Python 脚本启动了新的子进程,这些变量也会传递给子进程。
os.putenv使用示例
os.putenv() 是一个函数,可以用来设置环境变量。但它的行为会因操作系统和 Python 解释器的不同而有所差异。在某些系统上,使用 os.putenv() 设定的环境变量可能不会立即反映在 os.environ 中,或者根本不起作用:
import os
os.putenv('MY_VARIABLE', 'my_value')
由于这些潜在的不一致性和限制,推荐使用 os.environ 方法来设置环境变量。 我这边使用os.putenv 还是没有解决问题,如下:
import os
#os.putenv('RTT_ROOT', '../../..')
os.environ['RTT_ROOT'] = '../../..'
print(os.getenv('RTT_ROOT'))
rt-thread/bsp/renesas/ra4m2-eco$ py set_evn.py
None
最后还是使用os.environ['MY_VARIABLE'] = 'my_value' 这种方式有效。
os.environ['RTT_ROOT'] = '../../..'if os.getenv('RTT_CC'):CROSS_TOOL = os.getenv('RTT_CC')
if os.getenv('RTT_ROOT'):RTT_ROOT = os.getenv('RTT_ROOT')
至于 RTT_ROOT 具体要设置成什么样的值,需要根据rt-thread/bsp/renesas/ra4m2-eco/Kconfig 进行配置:
mainmenu "RT-Thread Configuration"config BSP_DIRstringoption env="BSP_ROOT"default "."config RTT_DIRstringoption env="RTT_ROOT"default "../../.."
python from 后指定路径
在 Python 中,使用 from 关键字可以导入特定的模块、函数、变量等。当你使用 from ... import ... 这样的语法时,通常会从Python的标准库、已安装的包或者模块搜索路径中的模块导入。如果你需要从特定的文件路径导入模块,需要确保该路径在 Python 搜索模块的路径列表中。
假设你有一个位于 /path/to/module 目录下的模块 mymodule.py,你想要从这个模块中导入名为 myfunction 的函数。下面是如何处理这种情况的步骤:
- 将模块所在的目录添加到
sys.path:
import sys
sys.path.insert(0, '/path/to/module')
使用 sys.path.insert(0, '/path/to/module') 将模块所在目录添加到搜索路径的开始,确保它在搜索时会首先被考虑。
- 现在你可以使用通常的
from ... import ...语法来导入你的函数了:
from mymodule import myfunction
这样,myfunction 将从 /path/to/module/mymodule.py 文件中导入。
请注意,这样做可能会导致模块路径冲突,尤其是当你添加的路径包含有与标准库或第三方库重名的模块时。在实际项目中,通常建议使用相对路径(对于包内的模块)或设置合适的项目结构,而不是直接修改 sys.path。
如果你正在使用包结构,也可以使用相对导入:
# 假设当前文件在 /path/to/module/submodule/ 下
from .. import mymodule
这里,.. 表示上一级目录,因此 mymodule 会从 /path/to/module/ 导入。 在进行模块导入时,请确保遵守 Python 的包和模块命名规范,以及考虑到模块查找路径的顺序,这样可以避免潜在的导入错误和冲突。
在进行rt-thread 编译的时候,在from building import * 处一直报错:
sys.path = sys.path + [os.path.join(RTT_ROOT, 'tools')]
print(sys.path)
try:from building import *
except:print('Cannot found RT-Thread root directory, please check RTT_ROOT')print(RTT_ROOT)exit(-1)
后面将其修改为:
sys.path.insert(0, os.path.join(RTT_ROOT, 'tools'))
#sys.path = sys.path + [os.path.join(RTT_ROOT, 'tools')]
print(sys.path)
try:from building import *
except:print('Cannot found RT-Thread root directory, please check RTT_ROOT')print(RTT_ROOT)exit(-1)
编译问题
在编译时一直报下面问题:
/usr/include/newlib/time.h:56:1: error: unknown type name 'clock_t'; did you mean '_flock_t'?
方案:
在文件rtconfig.py]中 添加:
CFLAGS = DEVICE + ' -Dgcc -D_POSIX_C_SOURCE=200809L'
_POSIX_C_SOURCE 介绍
_POSIX_C_SOURCE 是一个宏定义,用于启用特定版本的 POSIX 兼容性特性。POSIX(Portable Operating System Interface)是一个旨在促进 UNIX 操作系统兼容性的标准集合,它定义了一系列跨不同 UNIX 系统的应用程序编程接口(API)。
在 C 语言源文件中定义 _POSIX_C_SOURCE 宏可以告诉编译器程序打算使用哪个版本的 POSIX 标准。这个宏的值是一个长整数,指定了希望遵循的 POSIX 标准的版本年份。
例如:
#define _POSIX_C_SOURCE 200809L
上面这行代码指示编译器启用 2008 年发布的 POSIX 标准中定义的特性。这可以确保在包含头文件时,只有那些与指定版本兼容的特性和函数原型被包含进来。
在配置编译环境时,你可以在命令行(编译选项中)或源文件的开始处定义这个宏。在命令行中,你可以使用 -D 选项定义它:
gcc -D_POSIX_C_SOURCE=200809L -o my_program my_program.c
在源文件中定义它要确保在包含任何标准库头文件之前定义该宏:
#define _POSIX_C_SOURCE 200809L
#include <stdio.h>
#include <unistd.h>
// 其他标准头文件
这样确保了在编译时,你的程序能够访问与定义的 POSIX 版本兼容的函数和特性。
编译结果
...
LINK rtthread.elf
arm-none-eabi-objcopy -O ihex rtthread.elf rtthread.hex
arm-none-eabi-size rtthread.elftext data bss dec hex filename46764 2460 2548 51772 ca3c rtthread.elf
arm-none-eabi-objcopy -O binary rtthread.elf rtthread.bin
arm-none-eabi-size rtthread.elftext data bss dec hex filename46764 2460 2548 51772 ca3c rtthread.elf
scons: done building targets.
至此成功编译。
推荐阅读:
https://stackoverflow.com/questions/34174471/how-can-i-put-thumb-conditional-instruction-into-it-block
相关文章:
【ARM Cortex-M 系列 5 -- RT-Thread renesas/ra4m2-eco 移植编译篇】
文章目录 RT-Thread 移植编译篇编译os.environ 使用示例os.putenv使用示例python from 后指定路径 编译问题_POSIX_C_SOURCE 介绍编译结果 RT-Thread 移植编译篇 本文以瑞萨的ra4m2-eco 为例介绍如何下载rt-thread 及编译的设置。 RT-Thread 代码下载: git clone …...
功能强大的开源数据中台系统 DataCap 1.18.0 发布
推荐一套基于 SpringBoot 开发的简单、易用的开源权限管理平台,建议下载使用: https://github.com/devlive-community/authx 推荐一套为 Java 开发人员提供方便易用的 SDK 来与目前提供服务的的 Open AI 进行交互组件:https://github.com/devlive-commun…...
A Philosophy of Software Design 学习笔记
前言 高耦合,低内聚,降低复杂度:在软件迭代中,不关注软件系统结构,导致软件复杂度累加,软件缺乏系统设计,模块混乱,一旦需求增加、修改或者优化,改变的代价无法评估&…...
设计模式----解释器模式
一、简介 解释器模式使用频率并不高,通常用来构建一个简单语言的语法解释器,它只在一些非常特定的领域被用到,比如编译器、规则引擎、正则表达式、sql解析等。 解释器模式是行为型设计模式之一,它的原始定义为:用于定义…...
Linux常用命令(一):Conda、RPM、文件权限、apt-get(更新中...
文章目录 一、Conda二、RPM三、文件权限四、apt-get 一、Conda Conda是一个开源的软件包管理系统和环境管理系统,用于安装和管理软件包及其依赖项。它主要用于Python编程语言,但也可以用于其他语言的项目。Conda可以帮助用户创建不同版本的Python环境&a…...
3 个适用于 Mac 电脑操作的 Android 数据恢复最佳工具 [附步骤]
在当今的数字时代,无论是由于意外删除、系统故障还是其他原因,从 Android 设备中丢失数据不仅会带来不便,而且会造成非常严重的后果。特别是对于Mac用户来说,从Android手机恢复数据是一个很大的麻烦。幸运的是,随着许多…...
日志服务 SLS 深度解析:拥抱云原生和 AI,基于 SLS 的可观测分析创新
云布道师 10 月 31 日,杭州云栖大会上,日志服务 SLS 研发负责人简志和产品经理孟威等人发表了《日志服务 SLS 深度解析:拥抱云原生和 AI,基于 SLS 的可观测分析创新》的主题演讲,对阿里云日志服务 SLS 产品服务创新以…...
MinIO客户端之rm
MinIO提供了一个命令行程序mc用于协助用户完成日常的维护、管理类工作。 官方资料 mc rm 删除指定的对象。 准备待删除的对象,查看对象,命令如下: ./mc ls local1/bkt2/控制台的输出,如下: [2023-12-16 01:52:54 …...
【Linux笔记】文件和目录操作
🍎个人博客:个人主页 🏆个人专栏:Linux学习 ⛳️ 功不唐捐,玉汝于成 目录 前言 命令 ls (List): pwd (Print Working Directory): cp (Copy): mv (Move): rm (Remove): 结语 我的其他博客 前言 学习Linux命令…...
Vue-router 中hash模式和history模式的区别
Vue-router 中hash模式和history模式的区别 在通过vue-cli创建项目的时候,出现: 于是,去Google一遍。。 vue-router的model有两种模式:hash模式和history模式。 hash模式和history模式的不同 最直观的区别就是在url中 hash 带了一个很丑的…...
Debian在升级过程中报错
当我们在升级的过程中出现如下报错信息 报错信息如下所示: The following signatures couldnt be verified because the public key is not available: NO_PUBKEY ED444FF07D8D0BF6 W: GPG error: http://mirrors.jevincanders.net/kali kali-rolling InRelease: …...
IOS开发问题记录
1. xcode上传app store connect后testflight没有可构建版本的原因 查看你的邮箱, 里面有原因提示 一般为使用了某些权限, 但是plist没有声明 2. xcode 修改display name后名字并没有改变 原因是并没有修改到plist的CFBundleDisplayName的字段 将CFBundleDisplayName的值修改…...
数据流图_DFD图_精简易上手
数据流图(DFD)是一种图形化技术,它描绘信息流和数据从输人移动到输出的过程中所经受的变换。 首先给出一个数据流图样例 基本的四种图形 直角矩形:代表源点或终点,一般来说,是人,如例图的仓库管理员和采购员圆形(也可以画成圆角矩形):是处理,一般来说,是动作,是动词名词的形式…...
使用 Xcode 创建一个新的项目并运行
启动 Xcode: 打开你的 Mac,然后启动 Xcode。你可以在应用程序文件夹中找到它,或者使用 Spotlight 搜索。 创建新项目: 当 Xcode 启动时,选择 “Create a new Xcode project”(创建一个新的 Xcode 项目)。 在项目模板…...
教师未来前景发展
教师是一个光荣而重要的职业,他们承担着培养下一代的责任和使命。随着社会的不断发展和变化,教师的前景也在不断扩大和改变。本文将探讨教师未来的前景发展,并提供一些思考和建议。 首先,教师的就业前景将继续扩大。随着人口的增长…...
【华为机试】2023年真题B卷(python)-采样过滤
一、题目 题目描述: 在做物理实验时,为了计算物体移动的速率,通过相机等工具周期性的采样物体移动能离。由于工具故障,采样数据存在误差甚至相误的情况。需要通过一个算法过滤掉不正确的采样值,不同工具的故意模式存在…...
编译opencv和opencv_contrib
1 下载源码 下载opencv源码https://github.com/opencv/opencv 下载opencv源码https://github.com/opencv/opencv_contrib 2 开始编译 构建需要下载ffmpeg的包,cmake构建时会自动下载,但是比较满,这里可以从下面链接直接下载 https://downloa…...
每次maven刷新jdk都要重新设置
pom.xml <java.version>17</java.version> 改为<java.version>1.8</java.version>...
《PySpark大数据分析实战》-18.什么是数据分析
📋 博主简介 💖 作者简介:大家好,我是wux_labs。😜 热衷于各种主流技术,热爱数据科学、机器学习、云计算、人工智能。 通过了TiDB数据库专员(PCTA)、TiDB数据库专家(PCTP…...
【小白攻略】php 小数转为百分比,保留两位小数的函数
php 小数转为百分比 首先,最简单直观的方法是利用PHP内置的number_format函数。该函数可以对一个数字进行格式化,并可以设置小数点后的精度。通过将小数乘以100,再用number_format函数将结果格式化为百分比形式,即可达到将小数转为…...
Unity--机械臂场景10-流水线协同与事件驱动架构
1. 事件驱动架构在机械臂流水线中的核心价值 在传统机械臂流水线开发中,我们常常会遇到这样的困境:当传送带传感器检测到工件时,需要直接调用机械臂的抓取方法;机械臂完成动作后,又要手动触发传送带重启。这种硬编码的…...
PSIM 9.0 手把手教学:从零搭建直流电机双闭环调速模型(附完整代码与波形分析)
PSIM 9.0 手把手教学:从零搭建直流电机双闭环调速模型(附完整代码与波形分析) 在电力电子与电机控制领域,仿真技术已成为工程师和研究人员不可或缺的工具。PSIM作为一款专业的电力电子仿真软件,以其高效的仿真速度和直…...
手把手教你用Zynq-7100 FPGA实现100Mbps OOK信号定时同步(含完整Verilog代码)
基于Zynq-7100的OOK信号定时同步实战:从算法到FPGA实现全解析 在无线通信系统中,定时同步是数字接收机设计中最关键的环节之一。当我们需要在Xilinx Zynq-7100 FPGA平台上实现100Mbps OOK信号的接收处理时,面临的最大挑战是如何在仅有50MHz外…...
仅限本周开放|DeepSeek Chat V3.2功能测试黄金 checklist(含17个边界Case+响应时延基线数据)
更多请点击: https://intelliparadigm.com 第一章:DeepSeek Chat V3.2功能测试黄金 checklist 发布说明 DeepSeek Chat V3.2 已正式面向开发者开放灰度测试,本次版本聚焦多模态理解增强、长上下文稳定性优化及企业级安全策略集成。为保障测试…...
零基础新手会议记录,选购避坑指南 可直接上手
日常工作学习中,不少人会遇到会议纪要整理、访谈录音处理、讲座笔记记录的难题,手动整理耗时费力还易出错。本文评测了市面上主流录音转写工具,整理了新手避坑指南和实用选择建议,零基础也能快速上手。综合实测后,听脑…...
md-wechat:让Markdown完美兼容微信公众号排版的工具实战
1. 项目概述:一个让Markdown在微信生态里“活”起来的工具如果你和我一样,是个重度Markdown爱好者,同时又需要在微信生态里频繁地分享技术文档、产品说明或者个人笔记,那你一定体会过那种割裂感。在Typora或VS Code里写得行云流水…...
从零打造智能互动魔法杖:嵌入式系统与创客DIY全流程解析
1. 项目概述:打造你的专属互动魔法杖几年前,我痴迷于各种漫展和角色扮演活动,总想为自己扮演的角色制作一件独一无二、能真正“发光发热”的道具。市面上能买到的发光道具要么太玩具感,要么价格高昂且功能单一。于是,我…...
考古现场数据智能治理新范式(NotebookLM+地层学语义建模深度解析)
更多请点击: https://intelliparadigm.com 第一章:考古现场数据智能治理新范式(NotebookLM地层学语义建模深度解析) 在田野考古数字化进程中,传统地层记录存在碎片化、非结构化与语义断层三大瓶颈。NotebookLM 作为基…...
山东反向旅游推荐“小众秘境古村落”
假期不想挤热门景区,只想寻一处安静古村放空散心?给大家整理山东4 个小众秘境古村落,全程 1-2.5 小时车程,适合近郊自驾、短途出游,原生态氛围拉满,人少景美超适合避峰出行。一、济南长清|方峪古…...
从WCGW代码事故集看软件开发的常见陷阱与防御性编程实践
1. 项目概述:一个“看热闹不嫌事大”的代码仓库在程序员的世界里,除了正经八百的业务代码和开源框架,总有一些项目,它们诞生的初衷不是为了解决某个严肃的技术难题,而是为了捕捉、记录那些让人哭笑不得、甚至有点“幸灾…...
