我想从静态C库构建嵌入式软件。我的主要问题是软件链接,但由于最终产品的映射文件中缺少与中断相关的功能,因此无法运行。 (至少,这是我的假设)
我已经阅读了IAR的链接器手册,尝试了许多设置,但都无济于事。
您可以在下面找到一个.map文件比较,左边是应该的,右边是我从库中生成的结果。
我的中断向量表:
如果有关系,目标处理器是ARM。
提前感谢!
我对IAR并不特别熟悉,但是如果没有提供stronger>]链接,则链接程序通常将使用启动代码中提供的“弱链接”存根来解析向量表符号。
阅读IAR文档,问题是
链接器不会仅出于满足弱引用的目的而包含库中的模块
因此,如果您所有的“具体”中断处理程序都位于单独的模块中,并且没有其他引用的非弱符号,则该模块将不会被链接。
您可以(可能)执行以下操作之一:
从启动代码中删除弱链接实现
Implement覆盖了调用不同名称
库代码功能的弱链接实现。 (即,不要将默认的中断向量符号用作库函数的名称,而是实现函数with通过对库代码的调用而不是默认的实现(通常是一个无穷循环)来实现弱存根]]
在包含处理程序的一个或多个模块中创建符号,并在代码中对其进行引用以强制链接该模块。例如,您可能具有:
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只是为了避免修改提供的默认启动-将来可能会减少工作-尤其是在应用供应商提供的更新时,并且如果将代码移植到其他链接器,则不会出现任何特定于链接器的问题不同的工具链。