This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] Compiler/CODECOMPOSER:从starterware生成init.S时出错

Guru**** 2195940 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/597586/compiler-codecomposer-error-in-building-init-s-from-starterware

部件号:CODECOMPOSER

工具/软件:TI C/C++编译器

大家好,

正如标题所示,当我包含init.S文件时,我在构建项目时遇到了问题...我希望我将其发布在正确的位置,但如果没有,请通知我。
我收到的错误是:

  • `entry’(条目)的多个定义   (这与创建新项目时自动生成的START_ARMCA8.S文件冲突)
  • 对`ë_BSS_End'的引用未定义
  • 对`ë_BSS_START'的引用未定义
  • 对`堆栈'的引用未定义

我使用的init.s文件是我使用的编译器(GNU 4.8 >4 Linaro)的starterware (版本2.00 .01.01)的文件。
代码编写器工作室的版本是6.1 .0.0.0104万

我提供init.S以方便您:

@****************************** 全球符号*********************************
全局条目
全局堆栈
.global _BSS_START
.global _BSS_END
.global start_boot
@**************** 内部定义********************************
@
@定义不同模式的堆栈大小。 用户/系统模式将使用
总堆栈大小@
@的其余部分
.set und_stack_size,0x8
设置ABT_STACK_SIZE,0x8
.set fiq_stack_size,0x8
设置IRQ_STACK_SIZE,0x800
设置SVC_STACK_SIZE,0x8
@
@以在CPSR中为不同模式设置模式位
@
.set mode_usr,0x10
设置MODE_FIQ,0x11
set mode_irq,0x12
设置MODE_SVC,0x13
SET MODE_ABT,0x17
.set mode_und,0x1B
SET MODE_SYS,0x1F

二氧化碳I_F_bit,0xC0
@********************** 代码段*******************************************
.text
@
@此代码用于ARM指令
@
代码32
@******************************************************************************
@
@******************************************************************************
@
@ StarterWare中的复位处理程序被命名为'entry'。
@重置处理程序为所有模式设置堆栈指针。
在此期间应禁用FIQ和@ IRQ。 然后清除BSS部分,最后
@切换到调用main()函数的函数。
@
条目:
@
@将堆栈设置为未定义模式
@
LDR r0,=_stack @读取堆栈地址
MSR CPSR_c,#MODE_UND|I_F_bit @切换至UNDEF模式
MOV sp,r0 @写入堆栈指针
sub0,r0,#und_stack_size @提供堆栈空间
@
@将堆栈设置为中止模式
@
MSR CPSR_c,#MODE_ABT|I_F_bit @更改为中止模式
MOV sp,r0 @写入堆栈指针
sub0,r0,#ABT_STACK_SIZE @提供堆栈空间
@
@为FIQ模式设置堆栈
@
MSR CPSR_c,#MODE_FIQ|I_F_bit @更改为FIQ模式
MOV sp,r0 @写入堆栈指针
sub0,r0,#fiq_stack_size @提供堆栈空间
@
@为IRQ模式设置堆栈
@
MSR CPSR_c,#MODE_IRQ|I_F_bit @更改为IRQ模式
MOV sp,r0 @写入堆栈指针
sub0,r0,#irq_stack_size @提供堆栈空间
@
@为SVC模式设置堆栈
@
MSR CPSR_c,#MODE_SVC|I_F_bit @更改为SVC模式
MOV sp,r0 @写入堆栈指针
sub0,r0,#svc_stack_size @提供堆栈空间
@
@为用户/系统模式设置堆栈
@
MSR CPSR_c,#MODE_SYS|I_F_bit @更改为系统模式
MOV sp,r0 @写入堆栈指针

@使分支预测失效并启用分支预测
MOV R0,#0
MCR P15,#0,r0,C7,C5, 6号
ISB.
MRC p15,#0,r0,c1,c0, #0
订单 r0,r0,#0x0.08万
MCR p15,#0,r0,c1,c0, #0

@
@启用并初始化VFP和NEON
@
Orr R1,R1,#(0xF << 20) @或以上CPACR读取值以启用CP
MCR P15,#0,R1,C1,c0, 2号 @写入CPACR

MOV R1,#0
MCR P15,#0,R1,C7,C5, 4号 @以下FMXR导致刷新预取缓冲器
MOV r0,#0x4000万 @和CP 10和11才刚刚启用
FMXR FPEXC,r0;FPEXC = r0 @启用VFP本身
@
@清除此处的BSS部分
@
Clear_BSS_Section:

LDR r0,=_BSS_START @ BSS的起始地址
LDR R1,=(_BSS_END - 0x04) @ BSS的结束地址
MOV R2,#0
回路:
STR R2,[r0],#4 @在BSS中清除一个单词
CMP r0,R1
BLE循环 @清除到BSS结束

@
@输入start_boot函数。 在系统模式下仍执行。
@
@Enter_main:
LDR R10,=START_BOOT
MOV LR,PC @从start_boot返回虚拟
BX R10 @ Branch to start_boot
子PC,PC,#0x08 @循环
@
@文件结尾
@
结束 

那么,有人有没有办法克服这些错误? 另外,有人能告诉我何时需要使用init.S吗?
提前感谢

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,

    在项目显示的两个错误中,您已经指出了一个错误:只需删除START_ARMCA8.S文件即可解决条目符号的重新定义问题。

    其它错误可能与链接程序脚本文件有关。 添加到新CCS项目(AM335s.lds)的默认链接程序脚本适用于STARTUP_ARMCA8.S文件,但您的init.S文件可能需要从Starterware SW软件包中获取相应的链接程序脚本。

    init.S对C环境和设备执行非常低级的初始化-如果您熟悉Linux环境,它类似于MLO。

    有关Starterware提供的init.S和链接程序脚本的其他详细信息,请咨询Sitara论坛的专家,因为他们对该软件包的了解程度要高得多。

    希望这能有所帮助,
    拉斐尔
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    嘿,

    感谢您的回复。

    我也会在Sitara的论坛上发布,但如果您有答案...

    我应该何时使用init.S而不是startup _ARMCA8.S?
    至于与链接程序脚本文件相关的错误,您的意思是我应该根据我的应用程序选择不同的链接程序脚本文件吗?
    如果是这样,我应该如何知道选择什么?
    (我注意到一些starterware示例使用不同的链接程序文件,例如AM335x.cmd和dmtimerCounter.cmd,所以我想我的第二个问题的答案是肯定的。
    但我特别感兴趣的是,了解上述差异是否与处理中断有关。)

    再次感谢

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,

    >>我应该何时使用init.S而不是startup_ARMCA8.S?
    STARTUP_ARMCA8.S是一个通用的init文件,旨在帮助人们开始使用BareMetal GCC项目-它执行一些初始化,并具有使用CCS半主机功能所需的设置。

    如果我调用正确,则init.S是Starterware提供的自定义init文件,用于他们自己的项目。 我不记得Starterware是使用GCC还是TI ARM编译器。

    >>对于与链接程序脚本文件相关的错误,您的意思是我应该根据我的应用程序选择不同的链接程序脚本文件吗?
    是的,您回答了自己的问题。 中断服务例程和其他与硬件相关的构造的存在将需要修改链接程序脚本和(有时) init.S文件。 在该过程中还会涉及其他启动文件,这种情况并不少见。

    >>例如AM335x.cmd和dmtimerCounter.cmd
    这实际上回答了我之前的疑问:扩展名.cmd表示Starterware项目实际上使用TI ARM编译器(GCC传统上使用.lds或.ld作为链接程序脚本)。

    希望这能有所帮助,
    拉斐尔
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    再次感谢您的回复!!!

    你的帮助对我来说真的很有价值。

    那么我想我必须找到正确的链接程序脚本文件和/或init,或者学习如何创建它们。(这里的任何帮助都将是非常受欢迎的)

    就星标器示例提供的文件而言,它们肯定适用于TI ARM编译器,但也在相应的文件夹下提供了GCC。

    无论如何,再次感谢!!!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,

    如果您现在开始开发,您可能有兴趣了解的一个细节是基于RTOS的处理器SDK的存在。 这是一个更现代的软件包,它具有完全支持,并且很可能具有多个新功能和改进。

    请在以下网址查看:

    http://www.ti.com/tool/processor-sdk-am335x

    此致,

    拉斐尔  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,

    我很抱歉再次在这里写了一篇文章,但首先,我被指示从Sitara的分论坛上向这里提问,其次,我注意到在这里提出一些更合适的问题。

    在代码编辑器工作室的控制台中,构建我的项目后,我得到了以下错误描述:

    i/ccsv6/tools/compiler/gcc-arm-none-eabi-4_8-2014q3/bin/./lib/gcc/arm-no-eabi/arm.4/././././../arm-none-eabi/lib/crt0.o 4.8 :In Function `_start':
    (.text+0x104):对`__bss_start__'的引用未定义  
    和对应的__bss_end__


    现在我猜是因为某种原因,文件crt0.o导致了我的问题...是这样吗?我应该怎么做?

    另外,我已经意识到,我可能没有使用正确的编译和链接器标记...所以,请您帮助我解决这个问题吗?
    在为gcc编译器设置项目后,我只添加了以下选项:

    • mfpu:vfpv3.
    • -mfloat-ABI:softfp.

    我的目标是BeagleBone white。

    如果您需要更多信息,请告诉我,或者我是否应该将其发布到其他子论坛。

    提前感谢

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,

    一般而言,您应该需要.specs文件来选择要使用的运行时:nosys绝对不支持半托管和最小占用空间,或rdimon完全支持半托管(printf等)。 此选项设置为:

    另外,从特定版本的GCC (IIRC 4.8 .x)开始,在设置此选项时,建议删除对libc,libgcc和libnosys/librdimon的链接程序引用。 如果您使用的是libm或其他,则将其作为选项传递,如下所示:

     

    mfpu和-mfloat-ABI是可选的,但取决于其他支持库的构建方式-例如,您不能将库构建与"softfp"链接,将对象文件与"hard"链接。  因此,您可以尝试使用最佳性能选项,即使用-mfloat-abi=hard (使用硬件浮点单元)和-mfp=vfpv3或-mfpu=neon,查看项目是否构建良好。

    希望这能有所帮助,  

    拉斐尔

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,

    我想挑选一些(必要的)编译器和链接器标志会有所不同,因为我最终成功地构建了项目。
    但问题是,现在启动调试会话时,可执行文件会立即加载并开始运行,而我没有按“运行”按钮...相反,我只能选择暂停或停止它。 如果它确实按所需的方式工作,这不是真正的问题...但情况是程序似乎根本没有运行(主板BeagleBone似乎没有加载可执行文件)...此外,我没有调试选项,因为没有任何相关按钮选项可用...

    那么,有三个问题,

    1. 您对发生的事情有什么想法吗? 我的意思是,为什么似乎没有加载可执行文件,为什么我不能将其与调试工具一起启动?
    2. 这是否是与我所选的标志相关的问题? 也许其他设置不会造成这一问题?
    3. 正如您所提到的,对于.specs文件,我无法使用某些库...那么应该选择哪个运行时支持库?

    提前感谢您,对您的问题深表歉意

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    当您加载程序时,CCS会自动“运行到主页”。 您可以通过转到"属性"->"调试"并取消选择"在程序加载或重新启动时"来更改此设置。 对于CCS 6.2 ,右键单击项目,然后选择“属性”。 单击"Debug"(调试)。 在窗口中,单击"自动运行和启动选项"。 查看"自动运行选项"下的内容。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您的回复,

    但很遗憾,它不起作用...再次,当我开始调试时,加载进度窗口刚刚弹出并立即消失(没有任何进度迹象),在调试模式下,运行选项不能与其他调试工具一起使用, 除了暂停和停止...在此期间控制台没有错误...

    代码编写器问题(虽然似乎只能与其他程序配合使用)或生成的可执行文件问题是否应受到指责?

    如果你对我在上一个帖子中提出的其他问题有任何答案,我将非常感谢。

    再次感谢