文章目录
- 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