STM32メモリの最適化

これらの問題は、私の問題は、最初のメモリの問題は、これが私の初めての書き込みブログ通信プロトコルで実装している次回の使用コードを言う方法を、言うために大ヒットプロジェクトに遭遇している、私をたくさん修正してください。

先生の助けを借りて、学校の先生や企業の前に言うと、彼らの助けなしに、それは試運転実施することに感謝します。

私はSTM32F103C8T6を使用し、FLASHは128Kであり、RAMは少し不十分なの関与アルゴリズムと通信する限り、20Kです

#1。Aメモリ不足
私は、コードを変更し、正常STM32は、時には非常にカトンも死んでパワーカードをオンにし、スムーズに実行することができ、時にはた良いにダウンロードしてコンパイルするために、私はちょうどそれは、コードが間違っている場合は、ブロックされた場所だと思いました;デバッグモードkeil5で始まった、コードはコードのデバッグであり、後時々なくなっ割り込みハードウェアエラーに行ったことが判明し、ST-LINKを接続します。

500 2の配列に使用されたアルゴリズムと結合され、私は、メモリの問題があると思われます。

uint32_t aun_ir_buffer[500]; //IR LED sensor 
int32_t n_ir_buffer_length;    //data length
uint32_t aun_red_buffer[500];    //Red LED sensor data
int32_t n_sp02; //SPO2 value
int8_t ch_spo2_valid;   //indicator to show if the SP02 calculation is valid
int32_t n_heart_rate;   //heart rate value
int8_t  ch_hr_valid;    //indicator to show if the heart rate calculation is valid
uint8_t uch_dummy;

私は見つけるためにコンパイルされ、自動的に生成されたファイルフォルダ.MAPファイルのリストを開くので、Image component sizes

我々は見つけるTotal RW Size (RW Data + ZI Data)ことが、電力FLASH RAMの書き込みデータの後に行くこと、である、より多くの31K、20K以上に達します。不思議私は、パワーオンクラッシュです。

#2.ソリューション

ビュー変数#2.1

すべてのローカル変数とグローバル変数を含むアプリケーションコード内の変数、.MAPのこぎりにすることができ、変数Image Symbol Tableを見つけるためにダウンし、ローカル変数Local Symbols、グローバル変数Global Symbols

グローバル変数
私は、ローカル変数の私の2 500の完全な配列を発見し、スタックに書き込まれたとき、私はこれらの2つのグローバル変数を置くので、破裂することが、同じ問題を防ぐために、我々はより大きな対応するスタックのサイズを調整する必要があります。

変数は、カトンを引き起こしたり、クラッシュすることが大きすぎるか小さすぎる場合STM32一般的には、最初の書き込み変数スタック、スタックにあります。

#2.2は、スタックサイズを変更します

アセンブラファイルを起動するSTM32の設定があります。

Stack_Size      EQU     0x00001FFF

                AREA    STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem       SPACE   Stack_Size
__initial_sp
                                                  
; <h> Heap Configuration
;   <o>  Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
; </h>

Heap_Size       EQU     0x00000000

                AREA    HEAP, NOINIT, READWRITE, ALIGN=3
__heap_base
Heap_Mem        SPACE   Heap_Size
__heap_limit

                PRESERVE8
                THUMB

;Stack_Size是栈大小的设置
;Heap_Size一般用于malloc函数,如果代码里没有malloc函数,建议清零

#2.3スタックサイズを変更するには、コンパイル・エラー・ソリューションであります

もちろん、特定のStack_Size限りコンパイラがライン上に与えられていないとして、私はここに0x00001FFFを移し、独自のデバッグを行うためのサイズ、大きなコンパイラは、このようなエラーを報告します。
ここに画像を挿入説明最後に、すべてがデバッグされている場合、正常にコンパイルし、.MAPファイルを開き、最後のビューに変わりTotal RW Size (RW Data + ZI Data)
ここに画像を挿入説明、長いライン上で、しかしので私のコード未満の20Kなどとして、コード遅延検出フラグがたくさんある、それはまだ非常に遅いデイトンを感じています。

あなたは必ずプログラムが実行されていないされていない場合、あなたは光の心を追加することができ、彼は再び点滅し、プログラムを実行してみましょう。

		LED1( ON );			  
		Delay(0x4000);
		LED1( OFF );		
		Delay(0x4000);	

遅延コード

void Delay(__IO u32 nCount)
{
  for(; nCount != 0; nCount--);
} 

出版元の記事 ウォンの賞賛1 ビュー101

おすすめ

転載: blog.csdn.net/qq_37870032/article/details/104553119