手动分配地址时,编译器优化了指向函数的指针

Ami*_*ekh 7 c pointers function pic xc8

我需要在地址 0xDD2 处调用一个函数:

// foo.h
void foo(void) __at(0xDD2);

// foo.c
#include "foo.h"
void foo(void)
{
    // some code
}
Run Code Online (Sandbox Code Playgroud)

此代码有效:

#include "foo.h"
void main(void)
{
    void (*a)(void) = &foo;
    a();
}
Run Code Online (Sandbox Code Playgroud)

然而,这个没有:

#include "foo.h"
void main(void)
{
    void (*a)(void) = (void (*)(void))(0x0DD2);
    a();
}
Run Code Online (Sandbox Code Playgroud)

编译器 (XC8) 说:main.c:5:: warning: (759) expression generates no code调试器在调试时传递这些行。

我需要第二个(仅通过其地址调用函数)。为什么编译器会优化它?指针赋值有没有错误?更改编译器的优化级别没有帮助。

Ami*_*ekh 0

根据我在 XC8 手册中阅读的内容以及另一个论坛上的一些讨论,由于编译堆栈和其他一些原因,将对象放在固定地址以在另一个项目中使用它们并不是一个好主意。
但是,如果您只是需要防止编译器在手动分配地址时优化指向函数的指针,请使用此注释此答案中的代码。