我有一个函数旨在捕获所有将发生的中断调用,但我无法让任何函数从地址 04 开始。
注意:我不想使用特定于中断类型的函数,我不希望它们在代码中产生开销。
我已经用 SDCC 尝试了以下代码,可能不太相关,但我会将它们保留在这里以防万一。
__code __at (4) void handler() {
和
void __at (4) handler() {
没有运气,手册也没有进一步解释。
我有一个函数旨在捕获所有将发生的中断调用,但我无法让任何函数从地址 04 开始。
注意:我不想使用特定于中断类型的函数,我不希望它们在代码中产生开销。
我已经用 SDCC 尝试了以下代码,可能不太相关,但我会将它们保留在这里以防万一。
__code __at (4) void handler() {
和
void __at (4) handler() {
没有运气,手册也没有进一步解释。
您不希望函数从地址 4 开始,而是希望编译器在该位置生成跳转到您的 isr 函数。
快速浏览一下 SDCC 文档会给出以下结构:
void isr(void) interrupt n { /* your code goes here */ }
在哪里需要 goto 指令的“n”向量槽。
其他编译器将具有类似的功能,您需要查看编译器文档以获取确切的咒语。
例如,使用 HiTech C:
void interrupt isr(void) { /* code */ }
函数的位置取决于链接器,而不是编译器。
我知道在最初的问题之后很长时间,但我正在寻找相同的答案并发现这个有用的信息,确认在 SDCC 3.3.0 上工作:(来源: http: //www.mail-archive.com/sdcc-用户@lists.sourceforge.net/msg00411.html )
要使函数链接到一个固定的已知地址,您可以用其他两个函数包围该函数:参见下面的示例。注意:所有 _ 都是双 _ _ 字符!(如果您打算在整个代码中多次使用它,您也可以像上面的示例中那样定义宏。
将 #### 替换为以下函数所需的地址:
测试.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.
希望这有帮助!
我在一个邮件列表中找到了这个。
sdcc --codeseg SEGNAME -c file.c
使用并链接执行此操作进行编译sdcc -Wl -bSEGNAME=0x7ff0 ...