当前位置: 首页 > news >正文

【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 的函数。下面是如何处理这种情况的步骤:

  1. 将模块所在的目录添加到 sys.path
import sys 
sys.path.insert(0, '/path/to/module') 

使用 sys.path.insert(0, '/path/to/module') 将模块所在目录添加到搜索路径的开始,确保它在搜索时会首先被考虑。

  1. 现在你可以使用通常的 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 代码下载&#xff1a; git clone …...

功能强大的开源数据中台系统 DataCap 1.18.0 发布

推荐一套基于 SpringBoot 开发的简单、易用的开源权限管理平台&#xff0c;建议下载使用: https://github.com/devlive-community/authx 推荐一套为 Java 开发人员提供方便易用的 SDK 来与目前提供服务的的 Open AI 进行交互组件&#xff1a;https://github.com/devlive-commun…...

A Philosophy of Software Design 学习笔记

前言 高耦合&#xff0c;低内聚&#xff0c;降低复杂度&#xff1a;在软件迭代中&#xff0c;不关注软件系统结构&#xff0c;导致软件复杂度累加&#xff0c;软件缺乏系统设计&#xff0c;模块混乱&#xff0c;一旦需求增加、修改或者优化&#xff0c;改变的代价无法评估&…...

设计模式----解释器模式

一、简介 解释器模式使用频率并不高&#xff0c;通常用来构建一个简单语言的语法解释器&#xff0c;它只在一些非常特定的领域被用到&#xff0c;比如编译器、规则引擎、正则表达式、sql解析等。 解释器模式是行为型设计模式之一&#xff0c;它的原始定义为&#xff1a;用于定义…...

Linux常用命令(一):Conda、RPM、文件权限、apt-get(更新中...

文章目录 一、Conda二、RPM三、文件权限四、apt-get 一、Conda Conda是一个开源的软件包管理系统和环境管理系统&#xff0c;用于安装和管理软件包及其依赖项。它主要用于Python编程语言&#xff0c;但也可以用于其他语言的项目。Conda可以帮助用户创建不同版本的Python环境&a…...

3 个适用于 Mac 电脑操作的 Android 数据恢复最佳工具 [附步骤]

在当今的数字时代&#xff0c;无论是由于意外删除、系统故障还是其他原因&#xff0c;从 Android 设备中丢失数据不仅会带来不便&#xff0c;而且会造成非常严重的后果。特别是对于Mac用户来说&#xff0c;从Android手机恢复数据是一个很大的麻烦。幸运的是&#xff0c;随着许多…...

日志服务 SLS 深度解析:拥抱云原生和 AI,基于 SLS 的可观测分析创新

云布道师 10 月 31 日&#xff0c;杭州云栖大会上&#xff0c;日志服务 SLS 研发负责人简志和产品经理孟威等人发表了《日志服务 SLS 深度解析&#xff1a;拥抱云原生和 AI&#xff0c;基于 SLS 的可观测分析创新》的主题演讲&#xff0c;对阿里云日志服务 SLS 产品服务创新以…...

MinIO客户端之rm

MinIO提供了一个命令行程序mc用于协助用户完成日常的维护、管理类工作。 官方资料 mc rm 删除指定的对象。 准备待删除的对象&#xff0c;查看对象&#xff0c;命令如下&#xff1a; ./mc ls local1/bkt2/控制台的输出&#xff0c;如下&#xff1a; [2023-12-16 01:52:54 …...

【Linux笔记】文件和目录操作

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a;Linux学习 ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 命令 ls (List): pwd (Print Working Directory): cp (Copy): mv (Move): rm (Remove): 结语 我的其他博客 前言 学习Linux命令…...

Vue-router 中hash模式和history模式的区别

Vue-router 中hash模式和history模式的区别 在通过vue-cli创建项目的时候&#xff0c;出现: 于是&#xff0c;去Google一遍。。 vue-router的model有两种模式&#xff1a;hash模式和history模式。 hash模式和history模式的不同 最直观的区别就是在url中 hash 带了一个很丑的…...

Debian在升级过程中报错

当我们在升级的过程中出现如下报错信息 报错信息如下所示&#xff1a; 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&#xff0c;然后启动 Xcode。你可以在应用程序文件夹中找到它&#xff0c;或者使用 Spotlight 搜索。 创建新项目: 当 Xcode 启动时&#xff0c;选择 “Create a new Xcode project”&#xff08;创建一个新的 Xcode 项目&#xff09;。 在项目模板…...

教师未来前景发展

教师是一个光荣而重要的职业&#xff0c;他们承担着培养下一代的责任和使命。随着社会的不断发展和变化&#xff0c;教师的前景也在不断扩大和改变。本文将探讨教师未来的前景发展&#xff0c;并提供一些思考和建议。 首先&#xff0c;教师的就业前景将继续扩大。随着人口的增长…...

【华为机试】2023年真题B卷(python)-采样过滤

一、题目 题目描述&#xff1a; 在做物理实验时&#xff0c;为了计算物体移动的速率&#xff0c;通过相机等工具周期性的采样物体移动能离。由于工具故障&#xff0c;采样数据存在误差甚至相误的情况。需要通过一个算法过滤掉不正确的采样值&#xff0c;不同工具的故意模式存在…...

编译opencv和opencv_contrib

1 下载源码 下载opencv源码https://github.com/opencv/opencv 下载opencv源码https://github.com/opencv/opencv_contrib 2 开始编译 构建需要下载ffmpeg的包&#xff0c;cmake构建时会自动下载&#xff0c;但是比较满&#xff0c;这里可以从下面链接直接下载 https://downloa…...

每次maven刷新jdk都要重新设置

pom.xml <java.version>17</java.version> 改为<java.version>1.8</java.version>...

《PySpark大数据分析实战》-18.什么是数据分析

&#x1f4cb; 博主简介 &#x1f496; 作者简介&#xff1a;大家好&#xff0c;我是wux_labs。&#x1f61c; 热衷于各种主流技术&#xff0c;热爱数据科学、机器学习、云计算、人工智能。 通过了TiDB数据库专员&#xff08;PCTA&#xff09;、TiDB数据库专家&#xff08;PCTP…...

【小白攻略】php 小数转为百分比,保留两位小数的函数

php 小数转为百分比 首先&#xff0c;最简单直观的方法是利用PHP内置的number_format函数。该函数可以对一个数字进行格式化&#xff0c;并可以设置小数点后的精度。通过将小数乘以100&#xff0c;再用number_format函数将结果格式化为百分比形式&#xff0c;即可达到将小数转为…...

vscode里如何用git

打开vs终端执行如下&#xff1a; 1 初始化 Git 仓库&#xff08;如果尚未初始化&#xff09; git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...

Python:操作 Excel 折叠

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

使用分级同态加密防御梯度泄漏

抽象 联邦学习 &#xff08;FL&#xff09; 支持跨分布式客户端进行协作模型训练&#xff0c;而无需共享原始数据&#xff0c;这使其成为在互联和自动驾驶汽车 &#xff08;CAV&#xff09; 等领域保护隐私的机器学习的一种很有前途的方法。然而&#xff0c;最近的研究表明&…...

【第二十一章 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入门学习详细版(一)

大家好&#xff0c;Java 学习是一个系统学习的过程&#xff0c;核心原则就是“理论 实践 坚持”&#xff0c;并且需循序渐进&#xff0c;不可过于着急&#xff0c;本篇文章推出的这份详细入门学习资料将带大家从零基础开始&#xff0c;逐步掌握 Java 的核心概念和编程技能。 …...

RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 本文全面剖析RNN核心原理&#xff0c;深入讲解梯度消失/爆炸问题&#xff0c;并通过LSTM/GRU结构实现解决方案&#xff0c;提供时间序列预测和文本生成…...

安全突围:重塑内生安全体系:齐向东在2025年BCS大会的演讲

文章目录 前言第一部分&#xff1a;体系力量是突围之钥第一重困境是体系思想落地不畅。第二重困境是大小体系融合瓶颈。第三重困境是“小体系”运营梗阻。 第二部分&#xff1a;体系矛盾是突围之障一是数据孤岛的障碍。二是投入不足的障碍。三是新旧兼容难的障碍。 第三部分&am…...

JavaScript基础-API 和 Web API

在学习JavaScript的过程中&#xff0c;理解API&#xff08;应用程序接口&#xff09;和Web API的概念及其应用是非常重要的。这些工具极大地扩展了JavaScript的功能&#xff0c;使得开发者能够创建出功能丰富、交互性强的Web应用程序。本文将深入探讨JavaScript中的API与Web AP…...

纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join

纯 Java 项目&#xff08;非 SpringBoot&#xff09;集成 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系统“破局”

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