写入I / O地址

时间:2017-11-02 14:03:15

标签: c

我正在使用VersaLogic Osprey Board,我正在使用GCC编译器6.2.0运行Lubuntu 16.04 Xenial。用C语言编写,我无法编译C ++。

我试图从看门狗定时器的I / O地址读取,以便稍后启用它。根据{{​​3}},I / O地址为1CA8(WDT_CTL是此地址的标识符)

我到目前为止的代码如下:

#define WDT_CTL 0x1CA8

int main(void)
{

char *p_CTL = (char*) WDT_CTL;

printf("Attempting to print contents %c\n"),*p_CTL); 


}

代码编译,但是当我到达重要的一行时,我得到一个分段错误(核心转储),没有其他错误或警告。据我所知,seg故障是“你无法访问该内存位置”错误,但我试图从我在数据表中找到的地址中读取。

我做了一些研究,根据数据表,我的地址是I / O地址,这似乎与普通地址不同。当我查看自定义变量(char a)的地址时,该地址长度为12位,而不是我为监视程序计时器提供的4位。

我错过了什么吗?我不能再直接写入I / O地址,这是Lubuntu的限制吗?我是否需要使用某些特定命令来执行此操作?我需要启用某些内容还是更改设置?

请注意,此线程与data sheet的线程不同,因为这是在Windows 7中完成的,而不是Lubuntu,并且此修复程序在此处不起作用。

1 个答案:

答案 0 :(得分:0)

这就是我通常访问看门狗硬件的方式:

这适用于多台不同的计算机。

#include "watchdog.h"
#include <fcntl.h>      /* open() */
#include <stdio.h>      /* printf() */
#include <unistd.h>     /* write() */
#include <string.h>     /* strerror() */
#include <errno.h>      /* errno */

#define APP_VERSION     "1.1.0"

/* Look for the device in two places */
#define WD_KICK_DEV_NAME_1       "/dev/cs5535/gpio/5"
#define WD_KICK_DEV_NAME_2       "/dev/gpio/5"

#define WD_ENABLE_DEV_NAME_1     "/dev/cs5535/gpio/27"
#define WD_ENABLE_DEV_NAME_2     "/dev/gpio/27"

#define TEXT_WDOG_KICK           "Ot0101"
#define TEXT_WDOG_ENABLE         "1TO"
#define TEXT_WDOG_DISABLE        "0TO"

static INT32 wd_kick_fd;
static INT32 wd_enable_fd;


/**
 * Return the version
 */
const char *wd_get_version(void)
{
   return(APP_VERSION);
}


/**
 * Open GPIO-5 and GPIO-27
 */
INT32 wd_init(void)
{
   if (((wd_kick_fd = open(WD_KICK_DEV_NAME_2, O_WRONLY)) < 0) &&
       ((wd_kick_fd = open(WD_KICK_DEV_NAME_1, O_WRONLY)) < 0))
   {
      printf("Failed to open '%s' or '%s': %s (%d)\n",
             WD_KICK_DEV_NAME_1, WD_KICK_DEV_NAME_2, strerror(errno), errno);
      return(FAILURE);
   }

   if (((wd_enable_fd = open(WD_ENABLE_DEV_NAME_2, O_WRONLY)) < 0) &&
       ((wd_enable_fd = open(WD_ENABLE_DEV_NAME_1, O_WRONLY)) < 0))
   {
      printf("Failed to open '%s' or '%s': %s (%d)\n",
             WD_ENABLE_DEV_NAME_1, WD_ENABLE_DEV_NAME_2, strerror(errno), errno);
      return(FAILURE);
   }
   return(SUCCESS);
}


/**
 * Disabled via GPIO-27
 */
void wd_disable(void)
{
   (void)write(wd_enable_fd, TEXT_WDOG_DISABLE, strlen(TEXT_WDOG_DISABLE));
}


/**
 * Enabled via GPIO-27
 */
void wd_enable(void)
{
   (void)write(wd_enable_fd, TEXT_WDOG_ENABLE, strlen(TEXT_WDOG_ENABLE));
}

/**
 * Kick the watchdog by toggling GPIO 5
 */
void wd_kick(void)
{
   (void)write(wd_kick_fd, TEXT_WDOG_KICK, strlen(TEXT_WDOG_KICK));
}

并且watchdog.h文件包含:

#ifndef WATCHDOG_H_INCLUDED
#define WATCHDOG_H_INCLUDED


/**
 * Grab the version of the kicker stuff
 */
const char *wd_get_version(void);


/**
 * Do any initialization needed for the watchdog.
 *
 * @return SUCCESS or FAILURE
 */
INT32 wd_init(void);


/**
 * Disables the watchdog.
 * If watchdog cannot be disabled, then calls wd_kick()
 */
void wd_disable(void);


/**
 * Enables the watchdog.
 * If watchdog cannot be disabled, do nothing.
 */
void wd_enable(void);


/**
 * Kicks the watchdog
 */
void wd_kick(void);


#endif /* WATCHDOG_H_INCLUDED */