|
发表于 2014-11-4 15:04:58
11634 浏览 8 回复
关于看门狗的问题
在使用贵公司的开发板测试看门狗的时候,发现一个问题。我写了个最简单的应用程序做测试,测试看门狗的问题,在这个代码当中,我只有做了两件事,一个是打开看门狗,一个关闭看门狗。
然而发现我在这段简单代码中间加入过得调试语句,全部没有在串口输出,当我把打开和关闭看门狗代码去掉以后,测试打印信息,打印输出正常。
所以想问一下,这个问题是什么导致的?我打印输出,用printf函数调用。
代码如下,这里截图的时候,少了最后一句,关闭看门狗的代码close();
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|
|
|
|
|
|
|
楼主|
发表于 2014-11-4 15:29:32
这个代码会重启系统,但关键是为什么它打印信息不能正常重串口输出,难道是在其他地方有重定向? |
|
|
|
|
|
|
|
楼主|
发表于 2014-11-4 15:40:19
这个代码会重启系统,但关键是为什么它打印信息不能正常重串口输出,难道是在其他地方有重定向? |
|
|
|
|
|
|
|
楼主|
发表于 2014-11-4 16:07:32
经过测试以后,发现,只要你们的看门狗一打开就会立马重启,所以导致打印信息来不及输出。这种一打开就重启系统的方法,个人觉得应该是不行的,打开以后,应该需要一段时间以后,判断是否我有喂狗再重启系统。 |
|
|
|
|
|
|
|
楼主|
发表于 2014-11-4 19:46:27
unsigned long freq = clk_get_rate(wdt_clock);函数返回0,导致只要一打开就会出现立即启动的情况。 |
|
|
|
|
|
|
|
楼主|
发表于 2014-11-6 11:59:22
之前在用A8的内核时,S5PV210看门狗是能正常,但我看了下这方面的驱动,仅仅看门狗这部分的驱动,感觉是三星做的,两个驱动是一样的,所以感觉应该是在前面的时钟初始化地方,哪里有不同导致的,然后个人分析了CMU部分源码和技术手册,目前还未能找到原因,希望有高手能一同解决问题。 |
|
|
|
|
|
|
|
发表于 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;
}
|
|
|
|
|
|
|
登录或注册
扫一扫关注迅为公众号
|