1

我需要启用 msm800 嵌入式计算机的硬件看门狗。

不幸的是,我对使用汇编语言几乎一无所知。

这是设备文档所说的:

功能:看门狗

编号:EBh

描述:

启用闪光灯并禁用看门狗。上电后,看门狗始终处于禁用状态。启用看门狗后,用户应用程序必须至少每 800 毫秒执行一次选通,否则看门狗将执行硬件复位

输入值:

AH:78h DLAG Int15 函数

AL:EBh 功能请求

BL:00h 禁用

BL: 01h 启用

BL:FFh 频闪

01h-FFh 启用看门狗/重新触发

BH:00h = BL -> 秒数。/ 01h = BL -> 最小数量。

输出值:AL 01h 发生看门狗定时器超时

这就是我想出的:

#include <stdio.h>

int main() {

    asm(
        "movb       $0x78,      %ah\n\t"
        "movb       $0xEB,      %al\n\t"
        "movb       $0x01,      %bl\n\t"
        "movb       $0x00,      %bh\n\t"
        "int        $0x80"
    );

    return 0;
}

虽然这是错误的 - 运行导致分段错误,我在寄存器中有正确的值,但不知道如何实际运行该函数。

有什么帮助吗?

4

5 回答 5

1

如果你使用 gcc,你需要告诉它哪些寄存器被破坏了。

asm(
    "movb           $0x78,          %ah\n\t"
    "movb           $0xEB,          %al\n\t"
    "movb           $0x01,          %bl\n\t"
    "movb           $0x00,          %bh\n\t"
    "int            $0x80"
    :
    :
    : "ax", "bx", //... and what else may be clobbered by the int $80
);
于 2009-10-06T10:20:51.353 回答
0

我在文档中找到了这个:

看门狗功能集成在 INT15 功能中

所以看起来你应该调用 int 0x15,而不是 0x80。0x80 是一个 Linux 系统调用。

还:

有一些编程示例可用:产品光盘或客户下载区:\tools\SM855\int15dl\...</p>

你看过那些例子吗?

于 2012-07-23T11:10:04.393 回答
0

通常,您的编译器供应商会提供一种在 C 代码中设置 CPU 外设的方法。我会尝试在您的手册中搜索“WDT”或“Watchdog”,看看它是否提供了一些方便的方法。

于 2009-10-08T07:15:18.930 回答
0

这是我在 C 中设置特定地址或寄存器的代码(与 GCC 一起使用):

#define MICRO_PORT  (*(vuint8 *)(0x40100000))

这在地址 0x40100000 处定义了一个 8 位端口或寄存器,可以像任何其他变量一样读取/写入:

MICRO_PORT = 0xFF;
someval = MICRO_PORT;
于 2012-07-23T08:20:58.017 回答
0

您面临的问题可能与上下文切换有关。您通过中断指令将控制权转移到,这意味着上下文切换部分需要由您的代码处理。简而言之,您必须编写一个中断服务程序并从您的主函数中调用它。

该例程应该在实际中断处理器之前保存处理器的状态。这样做是因为中断处理可能会修改寄存器的内容。

退出时,例程应该恢复处理器的状态。中断服务程序不会接受任何参数,也不会返回任何值。

于 2009-11-06T02:28:32.617 回答