zoukankan      html  css  js  c++  java
  • 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----------------------------------------------------------------------------

  • 相关阅读:
    JNDI 是什么
    RuntimeException和非RuntimeException的区别
    dynamicinsert,dynamicupdate能够性能上的少许提升
    Session,有没有必要使用它?[转]
    c# textbox中光标所在行命令及选中命令移动到最后一行且光标提前[转]
    C#分布式事务(TransactionScope )
    .net中的分布式事务
    大道至简,职场上做人做事做管理[转]
    C#中TreeView的CheckBox的两种级联选择
    C# winform TreeView中关于checkbox选择的完美类[转]
  • 原文地址:https://www.cnblogs.com/zhihui-3669/p/10921461.html
Copyright © 2011-2022 走看看