• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

RT1502移植LUA成功的总结

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

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

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
lua5.1中的setfenv使用发布时间:2022-07-22
下一篇:
0基础lua学习(十八)C调用Lua----02Lua堆栈发布时间:2022-07-22
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap