如何修复 isr.h 中的“为参数指定的存储类”错误?

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

我正在开发自己的操作系统,名为 Choacury,我正在尝试创建一个工作 IRQ,虽然它工作得很好,但每当我尝试编译

timer.c
时,它都会在终端中吐出 this,并拒绝制作二进制文件,这意味着没有 ISO 文件。

编译器工作正常,并且在没有链接和编译timer.c的情况下没有发出ISR.H错误。

如果你好奇,这里是timer.c的代码:

`#include "timer.h"
#include "vga.h"
#include "utils.h"
#include "isr.h"

u32 tick = 0;

static void timer_callback(registers_t regs) {
    tick++;
    k_printf("Tick: ", 0);
    
    char tick_ascii[256];
    // int_to_ascii(tick, tick_ascii);
    // k_printf(tick_ascii);
    // k_printf("\n");
}

void init_timer(u32 freq) {
    /* Install the function we just wrote */
    register_interrupt_handler(IRQ0, timer_callback);

    /* Get the PIT value: hardware clock at 1193180 Hz */
    u32 divisor = 1193180 / freq;
    u8 low  = (u8)(divisor & 0xFF);
    u8 high = (u8)( (divisor >> 8) & 0xFF);
    /* Send the command */
    port_byte_out(0x43, 0x36); /* Command port */
    port_byte_out(0x40, low);
    port_byte_out(0x40, high);
}`

我尝试注释掉

timer.c
的一些打印功能,但没有任何进展。

operating-system interrupt
1个回答
0
投票

您遇到的错误可能与链接过程有关。链接器似乎无法找到 timer.c 文件中使用的某些函数或符号的实现。您可以采取以下几个步骤来排查和解决此问题:

检查头文件:确保头文件(timer.h、vga.h、utils.h、isr.h)正确定义了timer.c中使用的函数和符号。确保它们有适当的包含防护以防止多重包含。

检查函数定义:确保在某个地方定义了timer.c中使用的函数,并且它们相应的目标文件包含在链接过程中。

检查链接器命令:验证在创建最终二进制文件时是否将所有必要的源文件和目标文件链接在一起。链接器命令应包括包含必要功能的所有源文件。

检查ISR实现:由于您的timer_callback函数引用了register_interrupt_handler,请确保该函数在isr.h和isr.c文件中正确实现,并且正确链接。

检查端口函数:像 port_byte_out 这样的函数应该在代码库中的某个位置实现。确保在编译和链接期间它们的实现可以被timer.c文件访问。

检查 Makefile:如果您使用 Makefile 来构建操作系统,请确保在编译和链接过程中包含了所有必需的源文件和目标文件。

检查编译器标志:确保正确设置任何必要的编译器标志或选项。确保您的目标是正确的架构和内存模型。

检查依赖关系:如果您的任何源文件对其他源文件有依赖关系,请确保正确包含这些依赖关系。

逐步构建:尝试逐步构建操作系统,从最简单的代码开始,逐步添加组件。这将帮助您确定代码的哪个特定部分导致了链接问题。

检查拼写错误:仔细检查代码中是否存在拼写错误或命名不一致的情况,尤其是函数名称、变量名称和包含内容。

查看编译错误:如果有任何编译错误,请先修复它们,然后再尝试构建最终的二进制文件。有时,未解决的编译错误可能会导致链接问题。

查看链接器错误消息:当链接器失败时,它通常会提供错误消息,指示找不到哪些符号或函数。仔细查看这些消息以查明问题。

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