2009-10-06 72 views
1

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

不幸的是,我几乎不知道使用汇编语言的任何内容。

这是该设备的文件说:

功能:看门狗

编号:EBH

说明:

启用闪光灯和禁用 看门狗。加电后,看门狗 始终被禁用。一旦看门狗 已被启用,用户应用程序 必须执行选通每个 800ms的至少,否则看门狗执行 一个硬件复位

输入值:

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

这是错的 - 运行在分段错误的结果,我有寄存器中的值正确,但不知道如何实际运行该功能。

任何帮助?

+0

我从来没有使用msm800(我甚至不知道它存在) 但你是否确实需要在字符串中编写asm命令?在我使用的asm系统上,我必须直接写入,而不是写入字符串。 – nuriaion 2009-10-06 06:48:00

+0

我也从来没有见过像这样写的asm指令。 – blak3r 2009-10-08 07:13:32

回答

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 
); 
+0

无法通过这种方式进行编译,“:”在gcc asm中做什么? – zbigh 2009-10-06 10:43:17

+0

它分隔列表如果输出,输入和clobbered寄存器。如果你没有使用gcc,这一点可能是没有意义的,因为你的编译器很可能每次使用“asm”时都会保存所有的寄存器。 – hirschhornsalz 2009-10-07 11:48:30

0

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

0

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

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

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

0

这是我有用于设定一个特定的地址或在C寄存器的代码(使用GCC作品):

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

这定义一个8位端口或地址0x40100000寄存器,可以读/写为任何其他变量:

MICRO_PORT = 0xFF; 
someval = MICRO_PORT; 
0

我发现这个在文档:

看门狗功能集成在INT15功能

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

另外:

有一些编程实例可供选择:产品CD-ROM或 客户下载区:\ TOOLS \ SM855 \ int15dl \ ...

你有没有看着那些例子吗?