我需要启用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;
}
这是错误的 - 运行导致分段错误,我在寄存器中有正确的值,但不知道如何实际运行该函数。
任何帮助?
答案 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 \ ...
你看过那些例子吗?