のねのBlog

パソコンの問題や、ソフトウェアの開発で起きた問題など書いていきます。よろしくお願いします^^。

STM32CubeIde HardFault その18 Stackの最後の位置+1に書き込めるようにしてみる。

STM32F429ZITX_FLASH.ld

STACKの最後に+1した領域に、値を書きにいっているため、HardFaultになっているのでは?と思った。

リンカのファイルを以下のように変更して、最後の位置+1に書き込んでも問題ないようにしてみた。 すると、HardFaultがでなくなった。

/* Highest address of the user mode stack */
/*_estack = 0x20030000;*/   /* end of "RAM" Ram type memory */
_estack = 0x20020000;  /* end of "RAM" Ram type memory */

_Min_Heap_Size = 0x100 ;   /* required amount of heap  */
_Min_Stack_Size = 0x100 ;  /* required amount of stack */

/* Memories definition */
MEMORY
{
    FLASH   (rx)    : ORIGIN = 0x8000000,  LENGTH = 2048K
    CCMRAM  (rwx)   : ORIGIN = 0x10000000, LENGTH = 64K
/*    RAM  (rwx)   : ORIGIN = 0x20000000,  LENGTH = 192K */
    RAM (rwx)   : ORIGIN = 0x20000000, LENGTH = 128K
}

こうすると、1KByte無駄にするだけですむ。

/* Highest address of the user mode stack */
/*_estack = 0x20030000;*/   /* end of "RAM" Ram type memory */
/*_estack = 0x20020000;*/   /* end of "RAM" Ram type memory */
_estack = 0x2002FC00;  /* end of "RAM" Ram type memory */

_Min_Heap_Size = 0x100 ;   /* required amount of heap  */
_Min_Stack_Size = 0x100 ;  /* required amount of stack */

/* Memories definition */
MEMORY
{
    FLASH   (rx)    : ORIGIN = 0x8000000,  LENGTH = 2048K
    CCMRAM  (rwx)   : ORIGIN = 0x10000000, LENGTH = 64K
/*    RAM  (rwx)   : ORIGIN = 0x20000000,  LENGTH = 192K */
/*    RAM  (rwx)   : ORIGIN = 0x20000000,  LENGTH = 128K*/
    RAM (rwx)   : ORIGIN = 0x20000000, LENGTH = 191K
}

f:id:none53:20190718034825p:plain
Build Analyzerの表示

STM32CubeIde HardFault その17

cantwriteの中で、__swsetup_rを呼んでいる。

/* Return true and set errno and stream error flag iff the given FILE
   cannot be written now.  */

#define    cantwrite(ptr, fp)                                     \
  ((((fp)->_flags & __SWR) == 0 || (fp)->_bf._base == NULL) && \
   __swsetup_r(ptr, fp))
/*
 * Write the given string to stdout, appending a newline.
 */

int
_puts_r (struct _reent *ptr,
       const char * s)
{
#ifdef _FVWRITE_IN_STREAMIO
(略)
#else
  int result = EOF;
  const char *p = s;
  FILE *fp;
  _REENT_SMALL_CHECK_INIT (ptr);

  fp = _stdout_r (ptr);
  CHECK_INIT (ptr, fp);
  _newlib_flockfile_start (fp);
  ORIENT (fp, -1);
  /* Make sure we can write.  */
  if (cantwrite (ptr, fp)) <==cantwite
    goto err;

  while (*p)
    {
      if (__sputc_r (ptr, *p++, fp) == EOF)
    goto err;
    }
  if (__sputc_r (ptr, '\n', fp) == EOF)
    goto err;

  result = '\n';

err:
  _newlib_flockfile_end (fp);
  return result;
#endif
}

#ifndef _REENT_ONLY

int
puts (char const * s)
{
  return _puts_r (_REENT, s);
}

#endif
#ifdef __GNUC__
    _ELIDABLE_INLINE int __sputc_r(struct _reent *_ptr, int _c, FILE *_p) {
    #ifdef __SCLE
        if ((_p->_flags & __SCLE) && _c == '\n')
      __sputc_r (_ptr, '\r', _p);
    #endif
    if (--_p->_w >= 0 || (_p->_w >= _p->_lbfsize && (char)_c != '\n'))
        return (*_p->_p++ = _c);
    else
        return (__swbuf_r(_ptr, _c, _p));
        }
#else
/*
 * This has been tuned to generate reasonable code on the vax using pcc
 */
#define       __sputc_raw_r(__ptr, __c, __p) \
   (--(__p)->_w < 0 ? \
       (__p)->_w >= (__p)->_lbfsize ? \
           (*(__p)->_p = (__c)), *(__p)->_p != '\n' ? \
               (int)*(__p)->_p++ : \
               __swbuf_r(__ptr, '\n', __p) : \
           __swbuf_r(__ptr, (int)(__c), __p) : \
       (*(__p)->_p = (__c), (int)*(__p)->_p++))
    #ifdef __SCLE
    #define __sputc_r(__ptr, __c, __p) \
            ((((__p)->_flags & __SCLE) && ((__c) == '\n')) \
              ? __sputc_raw_r(__ptr, '\r', (__p)) : 0 , \
            __sputc_raw_r((__ptr), (__c), (__p)))
    #else
    #define __sputc_r(__ptr, __c, __p) __sputc_raw_r(__ptr, __c, __p)
    #endif
#endif