在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
1.由于LUA需要至少50K的RAM(经验值),所以stack和heap设置的尽量大,当前分别都设置为了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_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, 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----------------------------------------------------------------------------
|
请发表评论