【问题标题】:How do I get a function to be compiled at address 04 with GPLINK? (For PIC16)如何使用 GPLINK 在地址 04 处编译函数? (对于 PIC16)
【发布时间】:2011-08-26 20:15:48
【问题描述】:

我有一个函数旨在捕获所有将发生的中断调用,但我无法让任何函数从地址 04 开始。

注意:我不想使用特定于中断类型的函数,我不希望它们在代码中产生开销。

我用 SDCC 尝试了以下代码,可能不太相关,但我会保留它们以防万一。

__code __at (4) void handler() {

void __at (4) handler() {

没有运气,手册也没有进一步解释。

【问题讨论】:

  • 添加了“micocontroller”标签,希望有人能帮帮我。

标签: c microcontroller pic sdcc


【解决方案1】:

函数的位置取决于链接器,而不是编译器。

【讨论】:

  • 感谢您的澄清,我已相应地编辑了帖子。但不幸的是,这不是我想要的答案。
【解决方案2】:

您不希望函数从地址 4 开始,而是希望编译器在该位置生成一个跳转到您的 isr 函数。

快速浏览一下 SDCC 文档可以得出以下结构:

void isr(void) interrupt n { /* your code goes here */ }

你想要 goto 指令的地方'n'向量槽。

其他编译器会有类似的功能,你需要查看编译器文档以了解确切的咒语。

例如,使用 HiTech C:

void interrupt isr(void) { /* code */ }

【讨论】:

  • 我确实希望函数从地址 4 开始,就像我以前对 CC5X ​​所做的那样。这个答案并不能以任何方式解决我的问题。
  • @Mario:在 C 中,这回答了你的问题。您的回复有两个问题: 1. 将函数直接放在位置 4 会保存一条指令。你真的需要那个额外的循环和/或额外的词吗? 2.告诉编译器你的中断例程是一个中断例程的“开销”让编译器处理保存上下文并生成适当的函数序言/结语。如果您需要优化它,请在汇编器中编写并告诉汇编器和链接器您想要什么。在这种情况下,您还应该对自己正在做的事情有足够的了解,不要问这样的问题。
  • 我知道我在做什么,如果我问什么,那是因为我需要这样做。如果您不知道该怎么做,我理解,但至少不要告诉我我想做与我要求的不同的事情。否则我不会这么问。
【解决方案3】:

我知道在最初的问题之后很长时间,但我正在寻找相同的答案并找到了这个有用的信息,确认在 SDCC 3.3.0 上工作: (来源:http://www.mail-archive.com/sdcc-user@lists.sourceforge.net/msg00411.html

要使函数链接到一个固定的已知地址,您可以用其他两个函数包围该函数:参见下面的示例。注意:所有 _ 都是双 _ _ 字符! (如果您打算在整个代码中多次使用宏,也可以像上面的示例一样定义宏。

将#### 替换为以下函数所需的地址:

test.c

void begin_absolute_code(void) __naked
{
    __asm
          .area ABSCODE (ABS,CODE)
          .org 0x####        // YOUR FUNCTION'S DESIRED ADDRESS HERE.
    __endasm;
}

void your_function(...)
{
     // Do stuff here. This code will be placed at the specified address.
}

void end_absolute_code(void) __naked
{
    __asm
        .area CSEG (REL,CODE)
    __endasm;
}

void other_functions_here(...)
    // These functions will return to relative positions determined by the linker.

希望对您有所帮助!

【讨论】:

  • 是的,它很有帮助。谢谢。
【解决方案4】:

我在邮件列表中找到了这个。

使用sdcc --codeseg SEGNAME -c file.c编译
并链接这样做sdcc -Wl -bSEGNAME=0x7ff0 ...

【讨论】:

    猜你喜欢
    • 2010-11-05
    • 2018-02-01
    • 1970-01-01
    • 2012-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多