搜索

3

主题

11

帖子

47

积分

新手上路

Rank: 1

积分
47
发表于 2014-11-4 15:04:58 11634 浏览 8 回复

关于看门狗的问题

在使用贵公司的开发板测试看门狗的时候,发现一个问题。我写了个最简单的应用程序做测试,测试看门狗的问题,在这个代码当中,我只有做了两件事,一个是打开看门狗,一个关闭看门狗。
然而发现我在这段简单代码中间加入过得调试语句,全部没有在串口输出,当我把打开和关闭看门狗代码去掉以后,测试打印信息,打印输出正常。
所以想问一下,这个问题是什么导致的?我打印输出,用printf函数调用。
代码如下,这里截图的时候,少了最后一句,关闭看门狗的代码close();

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

151

主题

508

帖子

3567

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3567
发表于 2014-11-4 15:13:47
这个代码实现重启动了吗?
回复 点赞

使用道具 举报

3

主题

11

帖子

47

积分

新手上路

Rank: 1

积分
47
 楼主| 发表于 2014-11-4 15:29:32
这个代码会重启系统,但关键是为什么它打印信息不能正常重串口输出,难道是在其他地方有重定向?
回复 点赞

使用道具 举报

3

主题

11

帖子

47

积分

新手上路

Rank: 1

积分
47
 楼主| 发表于 2014-11-4 15:40:19
admin 发表于 2014-11-4 15:13
这个代码实现重启动了吗?

这个代码会重启系统,但关键是为什么它打印信息不能正常重串口输出,难道是在其他地方有重定向?
回复 点赞

使用道具 举报

3

主题

11

帖子

47

积分

新手上路

Rank: 1

积分
47
 楼主| 发表于 2014-11-4 16:07:32
admin 发表于 2014-11-4 15:13
这个代码实现重启动了吗?

经过测试以后,发现,只要你们的看门狗一打开就会立马重启,所以导致打印信息来不及输出。这种一打开就重启系统的方法,个人觉得应该是不行的,打开以后,应该需要一段时间以后,判断是否我有喂狗再重启系统。
回复 点赞

使用道具 举报

3

主题

11

帖子

47

积分

新手上路

Rank: 1

积分
47
 楼主| 发表于 2014-11-4 19:46:27
admin 发表于 2014-11-4 15:13
这个代码实现重启动了吗?

unsigned long freq = clk_get_rate(wdt_clock);函数返回0,导致只要一打开就会出现立即启动的情况。
回复 点赞

使用道具 举报

151

主题

508

帖子

3567

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3567
发表于 2014-11-5 11:00:19
也就是说这个函数返回错误,现在什么情况了呢
回复 点赞

使用道具 举报

3

主题

11

帖子

47

积分

新手上路

Rank: 1

积分
47
 楼主| 发表于 2014-11-6 11:59:22
admin 发表于 2014-11-5 11:00
也就是说这个函数返回错误,现在什么情况了呢

之前在用A8的内核时,S5PV210看门狗是能正常,但我看了下这方面的驱动,仅仅看门狗这部分的驱动,感觉是三星做的,两个驱动是一样的,所以感觉应该是在前面的时钟初始化地方,哪里有不同导致的,然后个人分析了CMU部分源码和技术手册,目前还未能找到原因,希望有高手能一同解决问题。
回复 点赞

使用道具 举报

0

主题

2

帖子

29

积分

新手上路

Rank: 1

积分
29
发表于 2015-2-14 15:27:13
本帖最后由 Laxiyan 于 2015-2-14 15:31 编辑

我也遇到这个问题,发现unsigned long freq = clk_get_rate(wdt_clock);函数返回0所以我怀疑是看门狗时钟没有初始化。最后通过修改内核源码,看门狗正常了。
解决方法:
1、在clock-exynos4.c的数组static struct clk exynos4_init_clocks[]中添加

{
  .name         = "watchdog",
  .parent         = &exynos4_clk_pclk_acp,
  .enable         = exynos4_clk_ip_perir_ctrl,
  .ctrlbit        = (1 << 14),
}

2、然后在s3c2410_wdt.c中将
ifdef CONFIG_CPU_FREQ 改成 #if 0

3、然后在s3c2410_wdt.c中将
if (get_user(new_margin, p))
    return -EFAULT;
if (s3c2410wdt_set_heartbeat(new_margin))
改成
if (s3c2410wdt_set_heartbeat(argp))
最终使看门狗正常工作。

看门狗测试程序:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <linux/types.h>
#include <linux/watchdog.h>
int main(void)
{
int fd = open("/dev/watchdog", O_WRONLY);
int* timeout = 0;
int count = 0;

if (fd == -1)
{
  perror("watchdog");
  exit(EXIT_FAILURE);
}
ioctl(fd, WDIOC_SETTIMEOUT, 5);
while (1)
{
  //ioctl(fd, WDIOC_KEEPALIVE, 0);
  printf("feel dog %d\r\n",count++);
  sleep(1);
}
close(fd);
return 0;
}


回复 点赞

使用道具 举报

返回列表
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

登录或注册

官方客服

QQ:2551456065

官方QQ群

195631883

扫一扫关注迅为公众号

群号652692981

 
快速回复 返回顶部 返回列表