0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

STM32F407のCCMRAMを使う〜続編

Posted at

背景

前回、STM32F407のCCMRAMを使うを投稿し、無事CCRAMを使うことができました。
めでたし、めでたし...と思いきや、由々しき状況に気づきました。

スクリーンショット 2025-07-27 16.10.31.png

CCMRAM上に不定の初期値をゼロフィルするセクションbbbを作ったのですが、なんとLoad addressの欄に内蔵フラッシュのアドレスが記載されています。
どうやら初期値付きの変数として認識されているようです。

初期値を確める

確認のため、0x08014c90のフラッシュの中身を見てみます。

スクリーンショット 2025-07-27 16.16.01.png

0x08014c90以降がCCMRAM上の変数の初期値として0が内蔵フラッシュに書き込まれていました。

しかも、アセンブラのスタートアップではこのエリアのデータを使わず、CCMRAMをゼロフィルしているので、使わないデータが内蔵フラッシュに鎮座しているということです

プログラムの動作に影響はありません...だから気づくのにも時間がかかりました。

リンカスクリプトではフラッシュに初期化データを置くような書き方はしていません...

初期値付きCCMRAM変数
  .ccmram :
  {
    . = ALIGN(4);
    _sccmram = .;       /* create a global symbol at ccmram start */
    *(.ccmram)
    *(.ccmram*)

    . = ALIGN(4);
    _eccmram = .;       /* create a global symbol at ccmram end */
  } >CCMRAM AT> FLASH
初期値ゼロのCCMRAM変数
 .bbb :
  {
    /* This is used by the startup in order to initialize the .bss section */
    _sbbb = .;         /* define a global symbol at bss start */
    __bbb_start__ = _sbbb;
    *(.bbb)
    *(.bbb*)

    . = ALIGN(4);
    _ebbb = .;         /* define a global symbol at bss end */
    __bbb_end__ = _ebbb;
  } >CCMRAM

初期値付きのセクションは、>CCMRAM AT> FLASHとしており、スタートアップでゼロフィルするセクションは>CCMRAMと記載しています。
これがうまく効いてないみたいです。

答えはこちら...

答えに辿り着くのは大変でした...
STのコミュニティサイトで解決策が見つかりました!
Prevent zero-initialized arrays in CCMRAM from being stored in FLASH.

初期値不定のCCMRAM変数は(NOLOAD)指定が必要
.bbb(NOLOAD) :
{
  /* This is used by the startup in order to initialize the .bss section */
  _sbbb = .;         /* define a global symbol at bss start */
  __bbb_start__ = _sbbb;
  *(.bbb)
  *(.bbb*)

  . = ALIGN(4);
  _ebbb = .;         /* define a global symbol at bss end */
  __bbb_end__ = _ebbb;
} >CCMRAM

早速(NOLOAD)を追記してコンパイル〜リンクしてみます。

スクリーンショット 2025-07-27 16.25.40.png

このように、Load addressの欄は空欄になり、初期値は不定という設定にできるので、あとはスタートアップでゼロフィルすればOKです。

いやぁ、ここまで来るのに時間がかかりましたが、これでスッキリしました。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?