2009-10-06 65 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 \ ...

你有沒有看着那些例子嗎?