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 }
configUSE_NEWLIB_REENTRANT
configUSE_NEWLIB_REENTRANT
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