7304|10

70

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

寻使用过AT926x系类ARM内置看门狗的高手 [复制链接]

在网上查了很多资料,AT926x系类的ARM内置看门狗基本上很少用,都推荐使用外部看门狗,我尝试了好多天使用内置的看门狗来监控自己的应用程序,但都没有找到切入点,十分不甘心,向大家学习。
先把我的尝试简单介绍一下:
Kernel\Watchdog目录下有个watchdog.c的文件
1、喂狗函数:OEMRefreshWatchDog()
2、引用了一个指针函数extern void (* pfnOEMRefreshWatchDog) (void);   ///< function pointer used by the kernel to call the function to refresh watchdog,我全文所搜pfnOEMRefreshWatchDog并没有发现在哪里定义
3、看门狗初始化函数:OEMInitWatchDogTimer()


在看门狗初始化函数OEMInitWatchDogTimer()里面是这么写的
OALMSG(OAL_FUNC, (L"+OEMInitWatchDogTimer\r\n"));
g_pWatchdog = OALPAtoVA (WatchdogProcSpecificGetWDTCBaseAddress(), FALSE);
RETAILMSG(1,(TEXT("AT91SAM926x_DispWatchDog %x!\r\n"),g_pWatchdog->WDTC_WDMR));

//Set the watcdog period
dwResult = AT91SAM926x_SetWatchDogConfiguration(g_pWatchdog,AT91C_WDTC_WDRSTEN | AT91C_WDTC_WDDBGHLT | AT91C_WDTC_WDIDLEHLT, dwWatchdogPeriod);

pfnOEMRefreshWatchDog = OEMRefreshWatchDog;
   
ALMSG(1, (L"-OEMInitWatchDogTimer (result = %d)\r\n",dwResult));

return dwResult;

在初始化和开启看门狗以后就到了红色的那句,我在OEMRefreshWatchDog函数里面加了一条打印语句,发现系统起来以后每隔2s这样会打印一次。


我的目的当然是把这个喂狗进程(或线程)关掉,然后用我自己建立的线程喂狗,这样才能监控我的应用程序,但在目录底下搜了没找到pfnOEMRefreshWatchDog使用的地方,郁闷啊,菜鸟赐教~
此帖出自ARM技术论坛

最新回复

恩,两种方法都要研究研究,我也觉得只要不初始化pfnOEMRefreshWatchDog指针就可以了,但是希望确实能起得来,而且还运行蛮久一段时间才会重启一次,继续努力~  详情 回复 发表于 2009-11-21 09:35
点赞 关注
 

回复
举报

69

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
公司是OEM?
此帖出自ARM技术论坛
 
 
 

回复

52

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
呵呵,不是,整了个bsp包,想把这个看门狗用起来,不然放着这资源不用,太可惜了~
此帖出自ARM技术论坛
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

4
 
#ifndef OAL_WATCHDOG_REFRESH_OUT
    pfnOEMRefreshWatchDog = OEMRefreshWatchDog;
#else
        g_dwWatchdogPeriod = dwResult;
        dwResult = 0;
#endif
   
        return dwResult;

如果不想让系统内核来刷看门狗,就不要初始化pfnOEMRefreshWatchDog指针,另外将返回值改为0;
自己再实现已Ioctl给外部程序调用,刷看门狗
此帖出自ARM技术论坛
 
 
 

回复

53

帖子

0

TA的资源

一粒金砂(初级)

5
 
下周再看,先顶了
此帖出自ARM技术论坛
 
 
 

回复

90

帖子

0

TA的资源

一粒金砂(初级)

6
 
引用 3 楼 kuron 的回复:
#ifndef OAL_WATCHDOG_REFRESH_OUT
? ? pfnOEMRefreshWatchDog = OEMRefreshWatchDog;
#else
g_dwWatchdogPeriod = dwResult;
dwResult = 0;
#endif
? ?
return dwResult;

如果不想让系统内核来刷看门狗,就不要初始化pfnOEMRefreshWatchDog指针,另外将返回值改为0;
自己再实现已Ioctl给外部程序调用,刷看门狗


不初始化pfnOEMRefreshWatchDog指针我也试过了,系统还是能起得来,过了很久才会重启一次,但我没把返回值清零,这个返回值是看门狗定时器溢出周期,不明白是否一定要清零。
此帖出自ARM技术论坛
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

7
 
引用 5 楼 th007sw 的回复:
引用 3 楼 kuron 的回复:
#ifndef OAL_WATCHDOG_REFRESH_OUT
? ? pfnOEMRefreshWatchDog = OEMRefreshWatchDog;
#else
g_dwWatchdogPeriod = dwResult;
dwResult = 0;
#endif
? ?
return dwResult;

如果不想让系统内核来刷看门狗,就不要初始化pfnOEMRefreshWatchDog指针,另外将返回值改为0;
自己再实现已Ioctl给外部程序调用,刷看门狗


不初始化pfnOEMRefreshWatchDog指针我也试过了,系统还是能起得来,过了很久才会重启一次,但我没把返回值清零,这个返回值是看门狗定时器溢出周期,不明白是否一定要清零。

默认情况下,这个如果没有对g_dwWatchdogPeriod赋值,其值为0,nk中的watch dog线程会使用无限大作为timeout时间,如下
--------------------------------

static DWORD WINAPI WatchDogTimerThrd (
    LPVOID   pParam)
{
    DWORD           dwTimeout, dwTick, dwDiff;
    PWatchDog       pWD;
    PPROCESS        pprcKilled;
   

    // the watchdog thread run with access to all processes so that it can set the watchdog event
    SWITCHKEY (dwTick, 0xffffffff);
   
    do {
        // refresh hardware watchdog if exist
        pfnOEMRefreshWatchDog ();

        // default timeout is either hardware watchdog period, or infinite when there is no
        // hardware watchdog
        dwTimeout = dwOEMWatchDogPeriod? dwOEMWatchDogPeriod : INFINITE;
此帖出自ARM技术论坛
 
 
 

回复

83

帖子

0

TA的资源

一粒金砂(初级)

8
 
既然g_dwWatchdogPeriod为0时是无限大的timeout时间,那么我岂不是不能设置为0把,我发现设为0和不设为0都一样,系统起来以后经过个20几分钟才重启,可能还有那个参数没设对。
今天又上网查了一下,看到有这么描述的

Hi,
I have a syatem which has a hardware watchdog.
I have few queries on the API exposed by windows CE 5.0 for watchdogs.
1) Do the API's like CreateWatchdogTimer, StartWatchdogTimer create
software watchdogs?
2) If a create function to refresh my hardware watchdog and hook it up
to the pfnOEMRefreshWatchDog function pointer then willthe API
mentioned in point 1 manipulate my hardware dog??
3) Also there are no functions wh?hich start or shutdown the hardware
watchdog, do I need to write a driver for it and then create API's
above it?

回复:
1) yes, you could use them even if you have no HW watchdog
2) tipically the HW watchdog is refreshed every dwWatchDogPeriod
milliseconds using pfnRefreshWatchDog (pfnOEMRefreshWatchDog is a wrong name
reported in the docs).if you call CreateWatchdogTimer with the
WDOG_RESET_DEVICE
flag and you do not refresh it, the kernel will not call pfnRefreshWatchDog
and the HW watchdog will reset your device

3)There are no functions which start the hardware watchdog: you have to
write some code in the OAL to configure it not to elapse before
dwWatchDogPeriod then assign the pfnRefreshWatchDog function and the kernel
will refresh it: if this shoul not happen it means that the OS is freezed and
the HW watchdog must be triggered: you do not need to write any driver
Luca Calligariswww.eurotech.it

既然这样那我就不用动那些设置了,只需在应用程序里调用CreateWatchdogTimer函数就行了,可是对老是出现undeclared identifier这个函数,说是Trusted APIs,要用CeGetCurrentTrust函数来取得信任级,整了一下也是出现没定义的错误,请教如何使用这些Trusted APIs呢?
此帖出自ARM技术论坛
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

9
 
引用 7 楼 th007sw 的回复:
既然g_dwWatchdogPeriod为0时是无限大的timeout时间,那么我岂不是不能设置为0把,我发现设为0和不设为0都一样,系统起来以后经过个20几分钟才重启,可能还有那个参数没设对。
今天又上网查了一下,看到有这么描述的

Hi,
I have a syatem which has a hardware watchdog.
I have few queries on the API exposed by windows CE 5.0 for watchdogs.
1) Do the API's like CreateWatchdogTimer, StartWatchdogTimer create
software watchdogs?
2) If a create function to refresh my hardware watchdog and hook it up
to the pfnOEMRefreshWatchDog function pointer then willthe API
mentioned in point 1 manipulate my hardware dog??
3) Also there are no functions wh?hich start or shutdown the hardware
watchdog, do I need to write a driver for it and then create API's
above it?

回复:
1) yes, you could use them even if you have no HW watchdog
2) tipically the HW watchdog is refreshed every dwWatchDogPeriod
milliseconds using pfnRefreshWatchDog (pfnOEMRefreshWatchDog is a wrong name
reported in the docs).if you call CreateWatchdogTimer with the
WDOG_RESET_DEVICE
flag and you do not refresh it, the kernel will not call pfnRefreshWatchDog
and the HW watchdog will reset your device
3)There are no functions which start the hardware watchdog: you have to
write some code in the OAL to configure it not to elapse before
dwWatchDogPeriod then assign the pfnRefreshWatchDog function and the kernel
will refresh it: if this shoul not happen it means that the OS is freezed and
the HW watchdog must be triggered: you do not need to write any driver
Luca Calligariswww.eurotech.it

既然这样那我就不用动那些设置了,只需在应用程序里调用CreateWatchdogTimer函数就行了,可是对老是出现undeclared identifier这个函数,说是Trusted APIs,要用CeGetCurrentTrust函数来取得信任级,整了一下也是出现没定义的错误,请教如何使用这些Trusted APIs呢?

即便timeout是无限大,但是watchdog初始化的会刷一次watch dog,这样等到watchdog时间用完的时候,一样会reset
trusted apis没有用过,也看到帮助文档中这么说,期待你的结果
此帖出自ARM技术论坛
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

10
 
楼主,上面代码就是我现在9260里面的代码。如果不让内核来刷,系统起来后16秒肯定会重启的。至于你说的20的多分钟,我估计也不是看门狗导致的吧。926x一样,看门狗最大为16秒。建议再查下bsp。
另外,我没有让你把g_dwWatchdogPeriod设为零。这个是我自己定义,方便外面应用程序获得真正周期。我是让你将返回值设为零,这将导致dwOEMWatchDogPeriod也为零。 dwOEMWatchDogPeriod是微软定义的,可以在PB上看到介绍。
此帖出自ARM技术论坛
 
 
 

回复

90

帖子

0

TA的资源

一粒金砂(初级)

11
 
恩,两种方法都要研究研究,我也觉得只要不初始化pfnOEMRefreshWatchDog指针就可以了,但是希望确实能起得来,而且还运行蛮久一段时间才会重启一次,继续努力~
此帖出自ARM技术论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表