6. M601ウォッチドッグの使用

1ソフトウェアウォッチドッグAPI


この記事で紹介するデータ構造とAPIは、SDKのzyf_wtd.hファイルを参照できます


1.1使用法


OpenCPUソリューションでは、ハードウェアウォッチドッグはデフォルトでライブラリで有効になっており、定期的に犬に餌を与えるため、開発者はこのロジックの一部を処理する必要はありません。さらに、このソリューションは開発者にソフトウェアウォッチドッグを提供します。ソフトウェアウォッチドッグは、ZYF_Wdt_Enableを呼び出すことによってオンにされます。オンにされた後、ソフトウェアウォッチドッグカウンターの値が指定された時間内にクリアされない場合、モジュールは再起動します。ZYF_FeedDogを通じてソフトウェアウォッチドッグカウンターをクリアします。モジュールが再起動した場合。ウォッチドッグはZYF_Wdt_Disableを介してオフにできます。


1.2 API関数


1.2.1 ZYF_Wdt_Enable
この関数は、ウォッチドッグを有効にするために使用されます
・関数プロトタイプ
bool ZYF_Wdt_Enable(uint32_t max_interval_ms);
・パラメータ
max_interval_ms:
[input]:ウォッチドッグトリガー時間
・戻り値
ウォッチドッグを有効にした結果


1.2.2 ZYF_Wdt_Disable
この関数は、ウォッチドッグをオフにするために使用されます
。関数プロトタイプ
bool ZYF_Wdt_Disable(void);

・パラメータ
NONE
・戻り値
ウォッチドッグをオフにした結果


1.2.3 ZYF_FeedDogは
犬に餌を与えます。つまり、レジスターの値をゼロにクリアします。
・関数プロトタイプ
void ZYF_FeedDog(void);
・パラメータ
NONE
・戻り値
NONE

 

2ウォッチドッグルーチンの概要

この章では、主にSDKでexample_wtd.cを使用してウォッチドッグ機能を個別にテストする方法を紹介します。

この例では、スレッドSMSThread_Exampleを開始して、ウォッチドッグ機能をテストします。ZYF_WtdTest()は
、タイマーパラメータを設定するために使用されます。ZYF_Wtd()の機能は、ウォッチドッグのタイムアウト時間を10秒
に設定することです; 一方、それは、タイマーの供給期間を9秒に設定することです。詳細は次のとおりです。


#include <stddef.h>
#include <stdint.h>
#include <stdbool.h>
#include "zyf_timer.h"
#include "zyf_wtd.h"

#include "zyf_trace.h"
#include "zyf_app.h"
#include "zyf_uart.h"
#include "zyf_thread.h"



typedef struct
{
    uint32_t max_interval;
    uint32_t feed_interval;
    ZYF_Timer_t *feed_timer;
} ZYF_Wdt_t;

static ZYF_Wdt_t gBsjWdt;

static Uart_Param_t g_uart1param;

void UartWriteCallBack(void* Param) // general com
{
    Uart_Param_t *uartparam = (Uart_Param_t *)Param; 
    if(Param == NULL)
    {
        return;
    }    

    ZYF_UartWrite(uartparam->port,(uint8_t *)"UartWrite succeed\r\n",strlen("UartWrite succeed\r\n"));
    ZYF_UartWriteCallbackSwitch(uartparam->port,false);

}

void UartReadCallBack(void* Param) // 
{
    uint32_t recvlen = 0;
    Uart_Param_t *uartparam = (Uart_Param_t *)Param; 

    ZYF_LOG("Uart%d recv",uartparam->port);

    while(ZYF_UartRead(uartparam->port, &(uartparam->uartbuf[recvlen]), 1))
    {
        ZYF_LOG("recv :%02x",uartparam->uartbuf[recvlen]);
        recvlen++;
    }
    ZYF_UartWrite(uartparam->port,uartparam->uartbuf,recvlen);
    ZYF_UartWriteCallbackSwitch(uartparam->port,true);
}


static void AppUartInit(void)
{
    int32_t ret;
    g_uart1param.port = DEBUG_PORT;
    ZYF_UartRegister(g_uart1param.port, UartReadCallBack,&g_uart1param);
    ZYF_UartWriteCbRegister(g_uart1param.port,UartWriteCallBack,&g_uart1param);
    ZYF_UartOpen(g_uart1param.port, 115200, ZYF_FC_NONE);

    ZYF_LOG("AppUartInit");
    return;
}


static void _feedDog(void *wd_)
{
    ZYF_Wdt_t *wd = (ZYF_Wdt_t *)wd_;
    ZYF_LOG("ZYF_feedDog");

    
    ZYF_FeedDog();
    ZYF_StartTimer(wd->feed_timer, wd->feed_interval);
}

void ZYF_WtdClose(void)
{
    ZYF_Wdt_Disable();
}

bool ZYF_WtdOpen(uint32_t max_interval_ms, uint32_t feed_interval_ms)
{
    ZYF_Wdt_t *wd = &gBsjWdt;
    if (max_interval_ms < feed_interval_ms)
        return false;

    ZYF_Wdt_t *timer = ZYF_CreateTimer(_feedDog, (void *)wd);
    if (timer == NULL)
        return false;

    wd->max_interval = max_interval_ms;
    wd->feed_interval = feed_interval_ms;
    wd->feed_timer = timer;

    bool r = ZYF_Wdt_Enable(max_interval_ms);
    if (!r)
    {
        ZYF_DeleteTimer(timer);
        return false;
    }

    ZYF_StartTimer(wd->feed_timer, wd->feed_interval);
    return true;
}

void ZYF_WtdTest(void)
{
    bool ret = ZYF_WtdOpen(10000, 9000);
    if(!ret)
    {
        ZYF_LOG("ZYF_WTD init failed.");
    }
    ZYF_LOG("ZYF_WTD init success!");
}

void SMSThread_Example(void * Param)
{
    ZYF_MsgQ_t *ptMsg;
    ZYF_AppMsg_t tMsg;
    int iRet = -1;
    ptMsg = ZYF_MsgQCreate(10, sizeof(ZYF_AppMsg_t));
    ZYF_LOG("thread enter!");

    ZYF_WtdTest();
    
    while (1) {
        ZYF_LOG("in while.");
        iRet = ZYF_MsgQGet(ptMsg, (void *)&tMsg);
        if (iRet < 0) {
            ZYF_LOG("Failed to get msg");
            ZYF_ThreadSleep(1000);
        }
    }

}


static void prvInvokeGlobalCtors(void)
{
    extern void (*__init_array_start[])();
    extern void (*__init_array_end[])();

    size_t count = __init_array_end - __init_array_start;
    for (size_t i = 0; i < count; ++i)
        __init_array_start[i]();
}


int appimg_enter(void *param)
{
    AppUartInit();
    ZYF_LOG("application image enter, param 0x%x", param);

    prvInvokeGlobalCtors();

    ZYF_ThreadCreate("SMSThread_Example", SMSThread_Example, NULL, ZYF_PRIORITY_HIGH, 10*1024);
    return 0;
}

void appimg_exit(void)
{
    OSI_LOGI(0, "application image exit");
}







 

おすすめ

転載: blog.csdn.net/w_hizyf_m/article/details/107084052