Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

EXC_RETURN_HANDLERの二重定義 #3

Open
takasehideki opened this issue Jan 3, 2021 · 2 comments
Open

EXC_RETURN_HANDLERの二重定義 #3

takasehideki opened this issue Jan 3, 2021 · 2 comments

Comments

@takasehideki
Copy link
Contributor

ビルド時に多めの警告が表示されます.

arm-none-eabi-gcc -c -o objs/cfg1_out.o -MD -MP -MF objs/cfg1_out.d -O2 -Wall -g    -ffunction-sections -fdata-sections -mlittle-endian -nostartfiles -mthumb -mcpu=cortex-m7 -mfloat-abi=softfp -mfpu=fpv5-d16  -DSTM32F767ZITx -DSTM32F767xx -DUSE_TIM_AS_HRT -DTOPPERS_CORTEX_M7 -D__TARGET_ARCH_THUMB=4 -D__TARGET_FPU_FPV5_DP -DTOPPERS_FPU_ENABLE -DTOPPERS_FPU_LAZYSTACKING -DTOPPERS_FPU_CONTEXT  -I. -I../include  -I../target/nucleo_f767zi_gcc -I../target/nucleo_f767zi_gcc/stm32fcube -I../arch/arm_m_gcc/stm32f7xx_stm32cube -I../arch/arm_m_gcc/stm32f7xx_stm32cube/STM32F7xx_HAL_Driver/Inc -I../arch/arm_m_gcc/stm32f7xx_stm32cube/CMSIS/Device/ST/STM32F7xx/Include -I../arch/arm_m_gcc/stm32f7xx_stm32cube/CMSIS/Include -I../arch/arm_m_gcc/common -I../arch/gcc -I.. -I../sample -I./gen -I../tecs_kernel -DTOPPERS_CB_TYPE_ONLY  cfg1_out.c
In file included from ../arch/arm_m_gcc/common/core_insn.h:51:0,
                 from ../arch/arm_m_gcc/common/core_kernel_impl.h:66,
                 from ../arch/arm_m_gcc/stm32f7xx_stm32cube/chip_kernel_impl.h:62,
                 from ../target/nucleo_f767zi_gcc/target_kernel_impl.h:97,
                 from ../kernel/kernel_impl.h:82,
                 from ../kernel/kernel_int.h:53,
                 from cfg1_out.c:3:
../arch/arm_m_gcc/common/arm_m.h:69:0: warning: "EXC_RETURN_HANDLER" redefined
 #define EXC_RETURN_HANDLER      0x0
 
In file included from ../arch/arm_m_gcc/stm32f7xx_stm32cube/CMSIS/Device/ST/STM32F7xx/Include/stm32f767xx.h:185:0,
                 from ../arch/arm_m_gcc/stm32f7xx_stm32cube/CMSIS/Device/ST/STM32F7xx/Include/stm32f7xx.h:134,
                 from ../arch/arm_m_gcc/stm32f7xx_stm32cube/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_def.h:30,
                 from ../arch/arm_m_gcc/stm32f7xx_stm32cube/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_rcc.h:29,
                 from ../target/nucleo_f767zi_gcc/stm32fcube/stm32f7xx_hal_conf.h:269,
                 from ../arch/arm_m_gcc/stm32f7xx_stm32cube/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal.h:30,
                 from ../target/nucleo_f767zi_gcc/stm32fcube/stm32f7xx_nucleo_144.h:51,
                 from ../target/nucleo_f767zi_gcc/nucleo_f767zi.h:69,
                 from ../target/nucleo_f767zi_gcc/target_kernel_impl.h:50,
                 from ../kernel/kernel_impl.h:82,
                 from ../kernel/kernel_int.h:53,
                 from cfg1_out.c:3:
../arch/arm_m_gcc/stm32f7xx_stm32cube/CMSIS/Include/core_cm7.h:1848:0: note: this is the location of the previous definition
 #define EXC_RETURN_HANDLER         (0xFFFFFFF1UL)     /* return to Handler mode, uses MSP after return                               */

ASP3とSTM32Cubeの両者で定義されているためのようです.

#define EXC_RETURN_HANDLER 0x0

#define EXC_RETURN_HANDLER (0xFFFFFFF1UL) /* return to Handler mode, uses MSP after return */


ASP3側はarch依存部の共通部分なので悩ましいところですが,他で参照してなさそうなので,ASP3のほうをコメントアウトするのが良さそうな気がします.ただし思わぬ副作用が発生するかもしれません(つまりまるでわからん

なお他でも調べてみたところ,NuttXはSTM32Cubeと同じ定義のようです.FreeRTOSはSTMにベッタリ同梱されているかと.
https://github.com/projectara/nuttx/blob/master/nuttx/arch/arm/src/armv7-m/exc_return.h#L86-L90

@yurie
Copy link
Owner

yurie commented Jan 3, 2021

ご指摘ありがとうございます!
これは、terget_user.txt の

./arch/arm_m_gcc/stm32f4xx_stm32cube/ 以下に
STM32Cube_FW_F4_V1.9.0\Drivers 以下の必要なファイルをコピー.面倒な場合は全てコピーしてかまわない.

面倒とか以前に必要なファイルってどれよ?状態だったので、全てコピーしてしまった弊害だと思います。
(F401REの方は被っていないので)

Makefileへのcppの追加のチケットを見てはじめて気がついたのですが、trunkに入っているASP(非依存部としてリリースされているもの?)はarm_gccですが、こちらは、arm_m_gccなんですね。

「\Drivers 以下の必要なファイル」以外の不要なファイルまでコピーしたから整合性が取れなくなっているように思いますが、違う値で定義されているのがちょっと気持ち悪いです…。
ASP3で定義しているものが何を想定して作ったものかわからないので、もうちょっと調べてみます。

@takasehideki
Copy link
Contributor Author

こちらでも調べてみました.( @exshonda さんのご意見も伺いたいところですが,,, ^^;

まず,arm_m_gccは3.5まであるけど3.6のBranchesには無い状態のようです.どういうポリシーになったのかは分かりません.
https://dev.toppers.jp/trac/asp3/browser/branches/3.5/arch/arm_m_gcc


F401REでは,V4.10のCMSIS libraryが使われているようです.

/**************************************************************************//**
* @file core_cm4.h
* @brief CMSIS Cortex-M4 Core Peripheral Access Layer Header File
* @version V4.10
* @date 18. March 2015
*
* @note
*
******************************************************************************/

ドンピシャのもののオリジナルを見つけることはできませんでしたが,某RTEMSで見つけたV4.30のものだと,まだ EXC_RETURN_HANDLER の定義は無かったようです.
https://devel.rtems.org/browser/rtems/c/src/lib/libbsp/arm/shared/CMSIS/Include/core_cm4.h?rev=2916a33057afb015e86cdd4cbd9955a3351682ad

それで,F767ZI向けに持ってきたV5.0.8では,

/**************************************************************************//**
* @file core_cm4.h
* @brief CMSIS Cortex-M4 Core Peripheral Access Layer Header File
* @version V5.0.8
* @date 04. June 2018
******************************************************************************/

core_cm4 でも _cm7 でも同じく定義があるようです.(つまりF401REでもライブラリをアップデートしたら同じ競合が発生することになるかと)

/* The following EXC_RETURN values are saved the LR on exception entry */
#define EXC_RETURN_HANDLER (0xFFFFFFF1UL) /* return to Handler mode, uses MSP after return */
#define EXC_RETURN_THREAD_MSP (0xFFFFFFF9UL) /* return to Thread mode, uses MSP after return */
#define EXC_RETURN_THREAD_PSP (0xFFFFFFFDUL) /* return to Thread mode, uses PSP after return */
#define EXC_RETURN_HANDLER_FPU (0xFFFFFFE1UL) /* return to Handler mode, uses MSP after return, restore floating-point state */
#define EXC_RETURN_THREAD_MSP_FPU (0xFFFFFFE9UL) /* return to Thread mode, uses MSP after return, restore floating-point state */
#define EXC_RETURN_THREAD_PSP_FPU (0xFFFFFFEDUL) /* return to Thread mode, uses PSP after return, restore floating-point state */

/* The following EXC_RETURN values are saved the LR on exception entry */
#define EXC_RETURN_HANDLER (0xFFFFFFF1UL) /* return to Handler mode, uses MSP after return */
#define EXC_RETURN_THREAD_MSP (0xFFFFFFF9UL) /* return to Thread mode, uses MSP after return */
#define EXC_RETURN_THREAD_PSP (0xFFFFFFFDUL) /* return to Thread mode, uses PSP after return */
#define EXC_RETURN_HANDLER_FPU (0xFFFFFFE1UL) /* return to Handler mode, uses MSP after return, restore floating-point state */
#define EXC_RETURN_THREAD_MSP_FPU (0xFFFFFFE9UL) /* return to Thread mode, uses MSP after return, restore floating-point state */
#define EXC_RETURN_THREAD_PSP_FPU (0xFFFFFFEDUL) /* return to Thread mode, uses PSP after return, restore floating-point state */


EXC_RETURNについてはこのへんの情報を見つけました.
例外発生から復旧する時に参照するテーブルの位置,だと思って良いのだろうか,,,

https://www.sciencedirect.com/topics/engineering/exception-return-mechanism
http://idken.net/posts/2017-12-11-arm_asm2/
https://www.aps-web.jp/academy/cm/258/


TOPPERS側では昔から EXC_RETURN_HANDLER の定義があったけど,CMSISのアップデートで競合することになったと推察します.
どっちを残せばいいか?は,相変わらず分かりません,,, いずれにせよTOPPERSは別で例外ハンドラの処理をしていることを考えたら/そもそもこの定義を参照してなさそうなことを考えたら,TOPPERS側の定義を削除すればよいだけかもしれません.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants