200kBあるはずのメモリが、20kBと表示されます。new すると、out of memory が表示されます。

mbed studio の方の話題かもしれませんが、間違っていたら許してください。
どうも、mbed LPC1768の生産が終わったようなので、手に入れることができた、
L-Tek FF-LPC546XX ( L-Tek FF-LPC546XX | Mbed )
に今まで LPC1768で作ってきたソフトウェア資産を LPC546XXに移行しようとしています。
そこで以下のような問題に遭遇しました。どなたか解決方法を教えていただけると幸いです。
(OSは mbed-os 6.15.1 です。開発環境は、arm keil studio です)

〇 実行時、プログラム中で new すると、out of memory のエラーが発生します。いままで、オンラインコンパイラでLPC1768のプログラムを作成していましたが、ほぼ、同じプログラムは動いていました。

〇 このとき、コンパイル結果をみると、200kBあるはずのメモリが20kBしか見えていません。

LPC5466の説明ページをもう一度確認してみると、ちゃんと200kBある、と書いてあります。
https://os.mbed.com/platforms/L-TEK-FF-LPC546XX/

ソースプログラム
main.cpp
#include “mbed.h”
#include “AudioString.h”
#include <stdio.h>

#define LineSize 256
#define BAUD96 9600
#define BAUD11 115200

#define OneDuration 2000 //msec. per one wave file.

//UART_I2C_ex7

#define BufferSize 1000

Ticker tick;
//DigitalOut led1(LED1);
//DigitalOut led2(LED2);
DigitalOut rst1(p11); //Digital reset for the XBee, 200ns for reset

//AnalogIn ain(p20);
//AnalogOut aout(p18);
BufferedSerial pc(USBTX,USBRX);
//Serial xbee(p9, p10);
AudioString *audioString;
char *str1,*str2,*strx,*sxx;

void setup(){
audioString=new AudioString();
//Mount the filesystem
int maxStrLength=maxWaveLength*3+1;
printf(“maxStrLength=%d\r\n”,maxStrLength);
str1=new char[maxStrLength+2];
printf(“new str1 end.\r\n”);
str2=new char[maxStrLength+2];
printf(“new str2 end.\r\n”);
strx=str2;
}

int main() {
printf(“main start\n\r”);
setup();
printf(“setup() end\n\r”);

// spin in a main loop. flipper will interrupt it to call flip
while(1) {
    int times=(OneDuration*1000)/(maxWaveLength*samplingInterval);

// printf(“times=%d\r\n”,times);
for(int i=0;i<times;i++){
char *x=audioString->startRecord();
//fprintf(fp, “%s\r\n”,x);
printf(“%s\r\n”,x);
}
// led1 = !led1;
//wait(0.2);
thread_sleep_for(200);
}
}

AudioString.h

#include “mbed.h”
#define maxWaveLength 1000 // max sampling number for a audio string. 1000 … if 2000, over flow.
#define samplingInterval 100 // 100 micro sec. sampling… 10Khz sampling

class AudioString{
private:
// void initI2a();
// void initA2i();

public:
AudioString();
int string2wave(char *x);
char * getString();
char * startRecord();
void startPlay(char *x);

};

AudioString.cpp

/*
Audio2String
String2Audio

timer, tick:
void audioSampling()
void audioPlay()

*/
#include “AudioString.h”

//AnalogOut aout(p18);
AnalogIn ain(p20);
DigitalOut led1(LED1);
DigitalOut led2(LED2);
Ticker aticker;
int maxStrLength;
int p2wave;
int p2audioStr;
int waveLength;
int strLength;
int interval_us;
const int oneLineLength = 60; // 60 chars + head / line for twe-lite communication

//char i2a[65];
char *i2a;
//int a2i[256];
int *a2i;
unsigned short *wave;
char *audioStr;
char *audioStr2;
char *audioStrX1;
char *audioStrX2;
int currentString;

void initI2a(){
i2a=new char[65];
i2a[0]=‘0’; i2a[1]=‘1’; i2a[2]=‘2’; i2a[3]=‘3’; i2a[4]=‘4’;
i2a[5]=‘5’; i2a[6]=‘6’; i2a[7]=‘7’; i2a[8]=‘8’; i2a[9]=‘9’;
i2a[10]=‘a’; i2a[11]=‘b’; i2a[12]=‘c’; i2a[13]=‘d’; i2a[14]=‘e’;
i2a[15]=‘f’; i2a[16]=‘g’; i2a[17]=‘h’; i2a[18]=‘i’; i2a[19]=‘j’;
i2a[20]=‘k’; i2a[21]=‘l’; i2a[22]=‘m’; i2a[23]=‘n’; i2a[24]=‘o’;
i2a[25]=‘p’; i2a[26]=‘q’; i2a[27]=‘r’; i2a[28]=‘s’; i2a[29]=‘t’;
i2a[30]=‘u’; i2a[31]=‘v’; i2a[32]=‘w’; i2a[33]=‘x’; i2a[34]=‘y’;
i2a[35]=‘z’; i2a[36]=‘!’; i2a[37]=‘#’; i2a[38]=‘$’; i2a[39]=‘%’;
i2a[40]=‘A’; i2a[41]=‘B’; i2a[42]=‘C’; i2a[43]=‘D’; i2a[44]=‘E’;
i2a[45]=‘F’; i2a[46]=‘G’; i2a[47]=‘H’; i2a[48]=‘I’; i2a[49]=‘J’;
i2a[50]=‘K’; i2a[51]=‘L’; i2a[52]=‘M’; i2a[53]=‘N’; i2a[54]=‘O’;
i2a[55]=‘P’; i2a[56]=‘Q’; i2a[57]=‘R’; i2a[58]=‘S’; i2a[59]=‘T’;
i2a[60]=‘U’; i2a[61]=‘V’; i2a[62]=‘W’; i2a[63]=‘X’; i2a[64]=‘Y’;

}
void initA2i()
{
a2i=new int[256];
puts(“initA2i-1\r\n”);
/* /
a2i[(int)‘0’]=0;a2i[(int)‘1’]=1;a2i[(int)‘2’]=2;a2i[(int)‘3’]=3; a2i[(int)‘4’]=4;
a2i[(int)‘5’]=5;a2i[(int)‘6’]=6;a2i[(int)‘7’]=7;a2i[(int)‘8’]=8; a2i[(int)‘9’]=9;
a2i[(int)‘a’]=10;a2i[(int)‘b’]=11;a2i[(int)‘c’]=12;a2i[(int)‘d’]=13;a2i[(int)‘e’]=14;
a2i[(int)‘f’]=15;a2i[(int)‘g’]=16;a2i[(int)‘h’]=17;a2i[(int)‘i’]=18;a2i[(int)‘j’]=19;
a2i[(int)‘k’]=20;a2i[(int)‘l’]=21;a2i[(int)‘m’]=22;a2i[(int)‘n’]=23;a2i[(int)‘o’]=24;
a2i[(int)‘p’]=25;a2i[(int)‘q’]=26;a2i[(int)‘r’]=27;a2i[(int)‘s’]=28;a2i[(int)‘t’]=29;
a2i[(int)‘u’]=30;a2i[(int)‘v’]=31;a2i[(int)‘w’]=32;a2i[(int)‘x’]=33;a2i[(int)‘y’]=34;
a2i[(int)‘z’]=35;a2i[(int)‘!’]=36;a2i[(int)‘#’]=37;a2i[(int)‘$’]=38;a2i[(int)‘%’]=39;
puts(“initA2i-2\r\n”);
a2i[(int)‘A’]=40;a2i[(int)‘B’]=41;a2i[(int)‘C’]=42;a2i[(int)‘D’]=43;a2i[(int)‘E’]=44;
a2i[(int)‘F’]=45;a2i[(int)‘G’]=46;a2i[(int)‘H’]=47;a2i[(int)‘I’]=48;a2i[(int)‘J’]=49;
a2i[(int)‘K’]=50;a2i[(int)‘L’]=51;a2i[(int)‘M’]=52;a2i[(int)‘N’]=53;a2i[(int)‘O’]=54;
a2i[(int)‘P’]=55;a2i[(int)‘Q’]=56;a2i[(int)‘R’]=57;a2i[(int)‘S’]=58;a2i[(int)‘T’]=59;
a2i[(int)‘U’]=60;a2i[(int)‘V’]=61;a2i[(int)‘W’]=62;a2i[(int)‘X’]=63;a2i[(int)‘Y’]=64;
puts(“initA2i-3\r\n”);
/
*/
}

AudioString::AudioString(){
puts(“start AudioString()\r\n”);
puts(“initI2a()”);
initI2a();
puts(“initA2i()”);
initA2i();
puts(“end initI2a(),initA2i()\r\n”);
wave=new unsigned short[maxWaveLength];
puts(“end new wave\r\n”);
maxStrLength=maxWaveLength*3+1;
audioStrX1= new char[maxStrLength+2];
// audioStrX2= new char[maxStrLength+2];
audioStr=audioStrX2;
interval_us=samplingInterval;
puts(“end new audioStr\r\n”);
p2wave=0;
p2audioStr=0;
waveLength=0;
puts(“end AudioString()\r\n”);
}

void short2Char3(unsigned short x, char *a)
{
// int indexOfthisSubimg=0;
// printf("input x=%u ",x);
for(int j=0;j<3;j++){
char c=i2a[x & 0x003F];
*a=c; a++;
x=x>>6;
}
// printf(“output %c%c%c\r\n”,(a-3)[0],(a-3)[1],(a-3)[2]);
}

unsigned short char32Short(char x)
{
unsigned short rtn=0;
// printf(“input %c%c%c”,x[0],x[1],x[2]);
/
/
rtn=a2i[(int)(x[2])];
rtn=rtn<<6|a2i[(int)(x[1])];
rtn=rtn<<6|a2i[(int)(x[0])];
/
*/
// printf(“return %u\r\n”,rtn);
return rtn;
}

int AudioString::string2wave(char *x){
// printf(“start string2wave()\r\n”);
int di=0;
char sub3[3];
for(int i=0;i+2<strLength;i+=3){
if(di>=maxWaveLength) break;
if(x[i]==0) break;
if(x[i+1]==0) break;
if(x[i+2]==0) break;
sub3[0]=x[i];
sub3[1]=x[i+1];
sub3[2]=x[i+2];
unsigned short xi=char32Short(sub3);
// printf(“%u “,xi);
wave[di]=xi;
di++;
}
// printf(”\r\n…end string2wave() di=%d\r\n”,di);
return di;
}

char *AudioString::getString(){
return audioStr;
}

void audioSampling();
void audioPlay();

int recording;
char * AudioString::startRecord(){
// printf(“startRecord()\r\n”);
/*
if(audioStr==audioStrX1){
audioStr=audioStrX2;
}
else{
audioStr=audioStrX1;
}
*/
audioStr=audioStrX1;
p2audioStr=0;
// led1=0;
audioStr[p2audioStr]=‘w’; p2audioStr++;
audioStr[p2audioStr]=‘-’; p2audioStr++;
audioStr[p2audioStr]=0;
recording=1;
aticker.attach(audioSampling,interval_us);
while(recording){
led1=~led1;
}
led1=0;
// printf(“end startRecord() p2wave=%d\r\n”,p2wave);
return audioStr;
}

int playing;
void AudioString::startPlay(char *x){
// printf(“start startPlay(%s)\r\n”,x);
audioStr2=x;
p2audioStr=0;
if(audioStr2[p2audioStr]!=‘w’) return;
p2audioStr++;
if(audioStr2[p2audioStr]!=‘-’) return;
p2audioStr++;
// printf(“playing %s\r\n”,(audioStr2+p2audioStr));
led2=0;
playing=1;
aticker.attach_us(audioPlay, interval_us);
while(playing){
led2=~led2;
}
led2=0;
// printf(“end startPlay()\r\n”);
}

void audioSampling() {
unsigned short aind;
if(p2audioStr+1>=maxStrLength) {
// printf(“end audioSampling()…p2wave=%d\r\n”,p2wave);
aticker.detach();
recording=0;
return;
}
aind=ain.read_u16();
// aind=outNext();
// printf(“%x\n\r”,aind);
char subs[3];
short2Char3(aind,subs);
audioStr[p2audioStr]=subs[0];
audioStr[p2audioStr+1]=subs[1];
audioStr[p2audioStr+2]=subs[2];
audioStr[p2audioStr+3]=0;
p2audioStr+=3;

}

void audioPlay() {
unsigned short aoutd;
char sub3[3];
if(p2audioStr+1>=maxStrLength) {
// printf(“\r\n…”);
aticker.detach();
playing=0;
return;
}
if(audioStr2[p2audioStr]==0) {aticker.detach(); playing=0; return;}
if(audioStr2[p2audioStr+1]==0) {aticker.detach(); playing=0; return;}
if(audioStr2[p2audioStr+2]==0) {aticker.detach(); playing=0; return;}
sub3[0]=audioStr2[p2audioStr];
sub3[1]=audioStr2[p2audioStr+1];
sub3[2]=audioStr2[p2audioStr+2];
unsigned short xi=char32Short(sub3);
// printf("%u ",xi);
//aout.write_u16(xi);
p2audioStr+=3;
}

new による、out of memoryについてはQuestionsで話題に上がっているのを見つけましたが、リンク先が消えていたりしてまだどうすれば良いかよくわかりません。
https://os.mbed.com/questions/77508/operator-new-out-of-memory/?fbclid=IwAR1pXuSNnS0swSjLBw5ccJ6jMvXy_n01skcxDGpxZeuMAJvMp8-U50547Z0

LPC546xxでは、ARM Compilerをつかったら、ヒープのサイズは0x400 bytesに決定されそうです。ここで。あれを上げたらどう?

ありがとうございます! やってみます。

#define を使って、heap size, stack size, ram sizeを変えてみたつもりなのですが、どうもうまくいかないです。LPC542628J512.sct ファイルの値を直接書き換えてみようとしましたが、変更できませんでした。


山之上さん、こんにちは。

オンライン版のArm Keil Studioでは、リンカスクリプト(LPC542628J512.sct ファイル)の変更は出来ないようです。オフライン版のMbed Studioであれば、可能だと思います。

で、Arm Keil Studioですが、mbed_app.jsonのマクロ機能を使うと、定義が出来そうな気がしましたが、実際にやってみたら期待通りには動作しませんでした。

定義は出来ていますが、リンカスクリプト側でハンドリング出来ていない感じです。

可能であれば、Mbed Studioで試してみてください。
https://os.mbed.com/studio/

渡会さん、こんにちは。ご無沙汰しています。
お忙しいところ、返信、ありがとうございました。
了解しました。
オフラインの mbed studioを試してみます。

山之上

渡会さん、mbed studio、試してみました。
sctファイルを直接書き換えてコンパイルしたところ、
該当のout of memoryのエラーはなくなりました!
ありがとうございました!

山之上さん、ご連絡ありがとうございます。
無事に動作したようで、良かったです。