• RT1502移植LUA成功的总结


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

     #define Stack_Size                   0x10000  

     #define Heap_Size                    0x10000

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

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

    解决过程:

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

    ..OBJ est.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----------------------------------------------------------------------------

  • 相关阅读:
    设计模式-策略模式
    java8 流式编程
    《JAVA8开发指南》使用流式操作
    linux如何查看端口被哪个进程占用?
    mac 启动php-fpm报错 failed to open configuration file '/private/etc/php-fpm.conf': No such file or direc
    Mac home 目录下创建文件夹
    UML由浅入深
    PHP扩展Swoole的代码重载机制
    Gedit中文乱码
    linux 内核源码arch/ 目录的前世今生
  • 原文地址:https://www.cnblogs.com/zhihui-3669/p/10921461.html
Copyright © 2020-2023  润新知