这是我的第一篇文章,它涵盖了我一直想要开发和关闭一年的东西。
基本上它归结为以下内容:我有一个newlib的副本,我正在尝试使用LPC2388(来自NXP的ARM7TDMI)。这是在使用arm-elf-gcc
的linux机器上我的问题是我一直在看很多关于移植newlib的教程,他们都谈论存根(如退出,打开,读/写,sbrk),我有一个漂亮的如何实现所有这些功能的好主意。但我应该把它们放在哪里?
我有来自sources.redhat.com/pub/newlib/newlib-1.18.0.tar.gz的newlib发行版,在我找到“syscalls.c”之后(在newlib-1.18.0 / newlib / libc中) / sys / arm)包含我必须更新的所有存根,但是它们都填写了相当完整的代码( NOT 似乎在没有crt0.S的情况下工作,本身不适用于我的芯片。)
我应该自己擦除这些功能,然后重新编写它们吗?或者我应该把它们写在别的地方。我应该使用我的“架构”的名称在newlib / libc / sys中创建一个全新的文件夹并更改目标以匹配吗?
我也很好奇在将它作为一个开源项目发布之后是否有适当的礼仪分配这样的东西。我目前有一个下载binutils,arm-elf-gcc,newlib和gdb的脚本,并编译它们。如果我正在修改newlib目录中的文件,我应该提交一个我的脚本自动应用的补丁吗?或者我应该将修改后的newlib添加到存储库吗?
感谢您的阅读!接下来是对我正在做的更详细的细分。
我正在基于Uzebox项目(http://belogic.com/uzebox/)松散地构建一个ARM视频游戏控制台。
当我试图弄清楚时,我已经从各种不同的资源中做了各种各样的事情。你可以在这里阅读我冒险的开始(sparkfun论坛,没有人回应,因为我自己解决):forum.sparkfun.com/viewtopic.php?f = 11& t = 22072
我通过阅读有关移植newlib的Stackoverflow问题并查看了一些不同的教程(如wiki.osdev.org/Porting_Newlib),但他们也告诉我实现存根而不提及哪里,谁,什么,何时或如何!
答案 0 :(得分:7)
但我应该把它们放在哪里?
只要它们存在于最终链接中,您就可以将它们放在您喜欢的位置。您可以将它们合并到libc库本身中,或者您可以保留该泛型,并将syscalls作为单独的目标特定对象文件或库。
您可能需要创建自己的目标特定crt0.s并为目标进行汇编和链接。
昆腾的Miro Samek提供了一个很好的教程,可用于启动和运行GNU / ARM开发here。这些示例基于Atmel AT91部分,因此您需要了解一些有关NXP设备的信息,以便调整启动代码。
LPC2xxx 的现成Newlib移植层可用here,但链接文件似乎已损坏。 Martin Thomas'WinARM项目中使用了相同的移植层。这是GNU ARM GCC的Windows端口,但其中包含的示例是特定于目标但不是特定于主机的。
您应该只需要修改Newlib上的移植层,并且因为它是目标和特定于应用程序,所以您不需要(事实上可能不应该)将您的代码提交给项目。
答案 1 :(得分:2)
当我使用newlib时,正是我所做的,吹走了crt0.s,syscalls.c和libcfunc.c。我个人的偏好是基于嵌入式应用程序链接crt0.s和syscalls.c的替换(将libcfunc中的少数函数转换为syscalls.c替换)。
我从来没有兴趣将任何这些工作推回发行版,所以无法帮助你。
您走在正确的道路上,crt0.S和syscalls.c是您希望为目标进行自定义的地方。我个人对C库(和printf)感兴趣,主要是中性所有函数返回0或1,或者只是让函数正常工作而不妨碍链接,定期制作文件I / O函数在rom / ram中的数据链接中运行。基本上没有替换或修改newlib中的任何其他文件我取得了相当大的成功,所以你走的是正确的道路。