RT1502移植LUA成功的总结

1.由于LUA需要至少50KRAM(经验值),所以stackheap设置的尽量大,当前分别都设置为了64K。在文件rt1052_flexspi_scf.scf里面改动:

 #define Stack_Size                   0x10000  

 #define Heap_Size                    0x10000

2.LUA解释器代码的__stdout和本体程序的__stdout重复定义,如下:

..\OBJ\test.axf: Error: L6200E: Symbol __stdout multiply defined (by stdio_streams.o and lpuart.o).

 

解决过程:

 

2.1单纯的把多处定义的__stdout前面加extern,会报如下错误:

 

..\OBJ\test.axf: Error: L6915E: Library reports error: __use_no_semihosting was requested, but _sys_open was referenced

 

嵌入式程序编译时如果出现sys_openprintffopenfclose等文件操作,因程序中并没有对这些函数的底层实现,使得设备运行时会进入软件中断BAEB处,程序一直死在这里不能运行。这时就需要__use_no_semihosting 个声明,使程序遇到这些文件操作函数时不停在此中断处,具体操作如下,将下列程序加入你的工程中:

 

#if 1

 

 

 

#pragma import(__use_no_semihosting)//_swi

 

#pragma import(_main_redirection)

 

 

 

 

 

const char __stdin_name[150];

 

const char __stdout_name[150];

 

const char __stderr_name[150];

typedef int FILEHANDLE;

typedef unsigned int clock_t;    /* cpu time type */

typedef unsigned int time_t;     /* date/time in unix secs past 1-Jan-70 */

 extern FILE __stdout; 

//重写标准库函数,这时printffopenfclose等文件操作函数运行时就会调用你的重写函数,这些重写函数只是几个简单的例子,并没有重写所有的文件操作函数

void _sys_exit(int status)

{

    while(1);

}

FILEHANDLE _sys_open(const char *name, int openmode)

{

    return 0;

}

 

int _sys_close(FILEHANDLE fh)

{

    return 0;

}

int _sys_write(FILEHANDLE fh, const unsigned char *buf, unsigned len, int mode)

{

    return 0;

}

 

int _sys_read(FILEHANDLE fh, unsigned char*buf, unsigned len, int mode)

{

    return 0;

}

int _sys_istty(FILEHANDLE fh)

{

    return 0;

}

 

int _sys_seek(FILEHANDLE fh, long pos)

{

    return 0;

}

 

int _sys_ensure(FILEHANDLE fh)

{

    return 0;

}

long _sys_flen(FILEHANDLE fh)

{

    return 0;

}

 

int _sys_tmpnam(char *name, int fileno, unsigned maxlength)

{

    return 0;

}

 

void _ttywrch(int ch)

{

 

}

time_t time(time_t *t)

{

    return 0;

}

int remove(const char *filename)

{

    return 0;

}

 int rename(const char *oldname, const char *newname)

 {

   return 0;

 }

 int system(const char *command)

 {

    return 0;

 }

char *_sys_command_string(char *cmd, int len)

{

    return 0;

}

 

clock_t clock(void)

{

    return 0;

}

//重定义fputc函数 

int fputc(int ch, FILE *f)

{

while((LPUART1->STAT&LPUART_STAT_TDRE_MASK)==0);

LPUART1->DATA=(u8)ch;

 

return ch;

}

#endif 

 

---------------------------------------------------------END----------------------------------------------------------------------------

 

你可能感兴趣的:(RT1502移植LUA成功的总结)