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