RT1502移植LUA成功的总结
1.由于LUA需要至少50K的RAM(经验值),所以stack和heap设置的尽量大,当前分别都设置为了64K。在文件rt1052_flexspi_scf.scf里面改动: ?#define Stack_Size ??????????????????0x10000 ? ?#define Heap_Size ???????????????????0x10000 2.LUA解释器代码的__stdout和本体程序的__stdout重复定义,如下: “..OBJtest.axf: Error: L6200E: Symbol __stdout multiply defined (by stdio_streams.o and lpuart.o).” ? 解决过程: ? 2.1单纯的把多处定义的__stdout前面加extern,会报如下错误: ? “..OBJtest.axf: Error: L6915E: Library reports error: __use_no_semihosting was requested,but _sys_open was referenced ? ” 嵌入式程序编译时如果出现sys_open,printf、fopen、fclose等文件操作,因程序中并没有对这些函数的底层实现,使得设备运行时会进入软件中断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;? //重写标准库函数,这时printf、fopen、fclose等文件操作函数运行时就会调用你的重写函数,这些重写函数只是几个简单的例子,并没有重写所有的文件操作函数 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,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---------------------------------------------------------------------------- (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |