【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函数将结果格式化为百分比形式,即可达到将小数转为…...
vscode里如何用git
打开vs终端执行如下: 1 初始化 Git 仓库(如果尚未初始化) git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...

Python:操作 Excel 折叠
💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...

使用分级同态加密防御梯度泄漏
抽象 联邦学习 (FL) 支持跨分布式客户端进行协作模型训练,而无需共享原始数据,这使其成为在互联和自动驾驶汽车 (CAV) 等领域保护隐私的机器学习的一种很有前途的方法。然而,最近的研究表明&…...

【第二十一章 SDIO接口(SDIO)】
第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...
Java入门学习详细版(一)
大家好,Java 学习是一个系统学习的过程,核心原则就是“理论 实践 坚持”,并且需循序渐进,不可过于着急,本篇文章推出的这份详细入门学习资料将带大家从零基础开始,逐步掌握 Java 的核心概念和编程技能。 …...

RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文全面剖析RNN核心原理,深入讲解梯度消失/爆炸问题,并通过LSTM/GRU结构实现解决方案,提供时间序列预测和文本生成…...

安全突围:重塑内生安全体系:齐向东在2025年BCS大会的演讲
文章目录 前言第一部分:体系力量是突围之钥第一重困境是体系思想落地不畅。第二重困境是大小体系融合瓶颈。第三重困境是“小体系”运营梗阻。 第二部分:体系矛盾是突围之障一是数据孤岛的障碍。二是投入不足的障碍。三是新旧兼容难的障碍。 第三部分&am…...
JavaScript基础-API 和 Web API
在学习JavaScript的过程中,理解API(应用程序接口)和Web API的概念及其应用是非常重要的。这些工具极大地扩展了JavaScript的功能,使得开发者能够创建出功能丰富、交互性强的Web应用程序。本文将深入探讨JavaScript中的API与Web AP…...
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...

针对药品仓库的效期管理问题,如何利用WMS系统“破局”
案例: 某医药分销企业,主要经营各类药品的批发与零售。由于药品的特殊性,效期管理至关重要,但该企业一直面临效期问题的困扰。在未使用WMS系统之前,其药品入库、存储、出库等环节的效期管理主要依赖人工记录与检查。库…...