C 在msm800中启用硬件看门狗

C 在msm800中启用硬件看门狗,c,gcc,assembly,embedded,pc104,C,Gcc,Assembly,Embedded,Pc104,我需要启用msm800嵌入式计算机的硬件看门狗 不幸的是,我几乎不知道如何使用汇编语言 这是设备的文档所说的: 功能:看门狗 编号:EBh 说明: 启用选通并禁用 监察人通电后,看门狗 它总是被禁用的。曾经的看门狗 已启用,则用户应用程序 必须至少每小时执行一次选通 800毫秒,否则看门狗执行 硬件重置 输入值: AH:78h DLAG Int15功能 AL:EBh功能请求 BL:00h禁用 BL:01h启用 BL:FFh选通 01h FFh启用看门狗/重触发 BH:00h=BL->秒数/01h

我需要启用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;
}
#包括
int main(){
asm(
movb$0x78,%ah\n\t
movb$0xEB,%al\n\t
movb$0x01,%bl\n\t
movb$0x00,%bh\n\t
“整数$0x80”
);
返回0;
}
虽然这是错误的-运行会导致分段错误,我在寄存器中有正确的值,但不知道如何实际运行该函数


有什么帮助吗?

如果您使用的是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
);

如果您使用的是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
);

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

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

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

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


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

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

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


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

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

这定义了地址0x40100000处的8位端口或寄存器,可作为任何其他变量进行读/写:

MICRO_PORT = 0xFF;
someval = MICRO_PORT;

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

这定义了地址0x40100000处的8位端口或寄存器,可作为任何其他变量进行读/写:

MICRO_PORT = 0xFF;
someval = MICRO_PORT;

我在文档中找到了:

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

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

此外:

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


您看过这些示例了吗?

我在文档中发现:

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

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

此外:

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


您看过这些示例吗?

我从未使用过msm800(我甚至不知道它存在),但您是舒尔公司的产品,需要将asm命令写入字符串吗?在我使用asm的系统上,我必须直接编写,而不是以字符串形式编写。我也从未见过这样编写的asm指令。我从未使用过msm800(我甚至不知道它存在),但您是舒尔公司的吗?您是否需要以字符串形式编写asm命令?在我使用asm的系统上,我必须直接编写它,而不是以字符串形式编写。我也从来没有见过这样编写的asm指令。不能以这种方式编译它,它会做什么:“在gcc asm中做什么?如果输出、输入和阻塞寄存器,它会分隔一个列表。如果您没有使用gcc,这一点可能是没有意义的,因为每次使用“asm”时,您的编译器很可能会保存所有寄存器。如果不能这样编译它,在gcc asm中做什么?:“在gcc asm中做什么?如果输出、输入和删除寄存器,它会分隔一个列表。如果您没有使用gcc,这一点可能没有意义,因为每次使用“asm”时,编译器很可能会保存所有寄存器。