如何强制IAR保持链接中断相关的功能?

问题描述 投票:0回答:1

Clarification

我想从静态C库构建嵌入式软件。我的主要问题是软件链接,但由于最终产品的映射文件中缺少与中断相关的功能,因此无法运行。 (至少,这是我的假设)

我已经阅读了IAR的链接器手册,尝试了许多设置,但都无济于事。

您可以在下面找到一个.map文件比较,左边是应该的,右边是我从库中生成的结果。

.map compare

我的中断向量表:

Vector table

如果有关系,目标处理器是ARM​​。

提前感谢!

c static linker embedded iar
1个回答
0
投票

我对IAR并不特别熟悉,但是如果没有提供stronger>]链接,则链接程序通常将使用启动代码中提供的“弱链接”存根来解析向量表符号。

阅读IAR文档,问题是

链接器不会仅出于满足弱引用的目的而包含库中的模块

enter image description here

因此,如果您所有的“具体”中断处理程序都位于单独的模块中,并且没有其他引用的非弱符号,则该模块将不会被链接。

您可以(可能)执行以下操作之一:

  1. 从启动代码中删除弱链接实现

  2. Implement覆盖了调用不同名称

    库代码功能的弱链接实现。 (即,不要将默认的中断向量符号用作库函数的名称,而是实现函数with
  3. 调用库函数的默认名称。)
  4. 通过对库代码的调用而不是默认的实现(通常是一个无穷循环)来实现弱存根]]

  5. 在包含处理程序的一个或多个模块中创建符号,并在代码中对其进行引用以强制链接该模块。例如,您可能具有:

  6.  const int library_isr_force_explicit_link = 0 ;
    

    在库中,然后在您的应用程序中:

    volatile int dummy = library_isr_force_explicit_link ;
    

    然后,包含ISR的模块将被迫链接以解析library_isr_force_explicit_link引用,因此库ISR将解析否则为弱的符号。

    如果库中没有任何已删除的弱实现的实现,则第一个选项将无法链接,这可能是一个有用的诊断方法,而不是一个问题,但这确实意味着每个项目都将具有自定义的启动代码,与您的图书馆链接。

    第二个将增加函数调用的开销,因此会稍微增加中断延迟和堆栈使用。

    第三个是1和2的组合,并具有两者的优点/缺点。

我猜第四个选项可以从文档中使用。

我个人选择选项2只是为了避免修改提供的默认启动-将来可能会减少工作-尤其是在应用供应商提供的更新时,并且如果将代码移植到其他链接器,则不会出现任何特定于链接器的问题不同的工具链。

© www.soinside.com 2019 - 2024. All rights reserved.