加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

RT1502移植LUA成功的总结

发布时间:2020-12-14 21:46:41 所属栏目:大数据 来源:网络整理
导读:1. 由于 LUA 需要至少 50K 的 RAM (经验值),所以 stack 和 heap 设置的尽量大,当前分别都设置为了 64K 。在文件 rt1052_flexspi_scf.scf 里面改动: ?#define Stack_Size ??????????????????0x10000 ? ?#define Heap_Size ???????????????????0x10000 2.

1.由于LUA需要至少50KRAM(经验值),所以stackheap设置的尽量大,当前分别都设置为了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_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,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----------------------------------------------------------------------------

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读