在msm800中启用硬件监视程序

时间:2009-10-06 06:34:02

标签: c gcc assembly embedded pc104

我需要启用msm800嵌入式计算机的硬件监视程序。

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

这是该设备的文档所说的内容:

  

功能:WATCHDOG

     

编号:EBh

     

说明

     

启用选通并禁用   看门狗。上电后,看门狗   总是被禁用。一旦看门狗   已启用,用户应用程序   必须至少每次都执行一次频闪   800ms,否则看门狗执行   硬件重置

     

输入值:

     

AH:78小时DLAG Int15功能

     

AL:EBh功能请求

     

BL:00h禁用

     

BL:01h启用

     

BL:FFh Strobe

     

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;
}

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

任何帮助?

5 个答案:

答案 0 :(得分: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
);

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

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

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

答案 3 :(得分:0)

以下是我在C中设置特定地址或寄存器的代码(适用于GCC):

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

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

MICRO_PORT = 0xFF;
someval = MICRO_PORT;

答案 4 :(得分:0)

我在文档中找到了这个:

  

看门狗功能集成在INT15功能

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

此外:

  

有一些编程示例可用:产品CD-Rom或   客户下载区:\ tools \ SM855 \ int15dl \ ...

你看过那些例子吗?