打印
[ZLG-MCU]

关于ZLG的启动代码

[复制链接]
3031|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xiaoxin1986|  楼主 | 2009-8-22 16:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
关于周立功的工程模版LPC2100的启动代码有些疑问,请大家指点,谢谢各位了!

1,__main这个函数是依赖于ADS1.2的吗?如果是的话,程序下载到目标板中还能不能脱机运行呢?
2,__user_initial_stackheap
            LDR   r0,=bottom_of_heap
       ;    LDR   r1,=StackUsr
             MOV   pc,lr

    不明白这个几条语句是什么作用。__user_initial_stackheap是被__main调用的吗?为什么还要显示的写出来呢?
3,target.c文件中
     #pragma import(__use_no_semihosting_swi)  以及以下的代码是做什么用的呢?

小弟菜鸟,怎么也想不明白,望大虾指点迷津!

相关帖子

沙发
xiaoxin1986|  楼主 | 2009-8-23 15:39 | 只看该作者
__user_initial_stackheap是semihosting默认需要的库函数,



脱机运行在目标板上的代码不能有semihosting的SWI操作,



所以为了确保用户在没有semihosting支持的环境中运行应用程序时没有用到semihosting功能,



在汇编程序中使用IMPORT __use_no_semihosting_swi,



在C程序中使用#pragma import(__use_no_semihosting_swi),



这时,如果程序中仍然用到了semihosting功能,会报告如下错误Error :L6200E:Symbol __semihosting_swi_guard multiply defined (by use_semi.o and use_no_semi.o)



所以周立功的代码中重实现了__user_initial_stackheap函数

使用特权

评论回复
板凳
xiaoxin1986|  楼主 | 2009-8-23 15:40 | 只看该作者
这样理解对吗?



但是还有问题

;    LDR   r1,=StackUsr

这句为什么有分号注释了呢?

#pragma import(__use_no_semihosting_swi)

这句以下的代码是做什么用的呢?



__main调用的其他库函数并没有重实现,下载到目标板以后能正常完成初始化工作吗?

使用特权

评论回复
地板
xiaoxin1986|  楼主 | 2009-8-23 15:40 | 只看该作者
int __rt_div0(int a)
{
    a = a;
    return 0;
}

        int fputc(int ch,FILE *f)
{
    ch = ch;
    f = f;
    return 0;
}

    int fgetc(FILE *f)
{
    f = f;
    return 0;
}


        int _sys_close(FILEHANDLE fh)
{
    fh = fh;
    return 0;
}

        int _sys_write(FILEHANDLE fh, const unsigned char * buf,
                      unsigned len, int mode)
{
    fh = fh;
    buf = buf;
    len =len;
    mode = mode;
    return 0;
}
        int _sys_read(FILEHANDLE fh, unsigned char * buf,
                     unsigned len, int mode)
{
    fh = fh;
    buf = buf;
    len =len;
    mode = mode;
   
    return 0;
}

       void _ttywrch(int ch)
{
    ch = ch;
}

        int _sys_istty(FILEHANDLE fh)
{
    fh = fh;
    return 0;
}
        int _sys_seek(FILEHANDLE fh, long pos)
{
    fh = fh;
    return 0;
}
        int _sys_ensure(FILEHANDLE fh)
{
    fh = fh;
    return 0;
}

        long _sys_flen(FILEHANDLE fh)
{
    fh = fh;
    return 0;
}
       int _sys_tmpnam(char * name, int sig, unsigned maxlen)
{
    name = name;
    sig = sig;
    maxlen = maxlen;
    return 0;
}

        void _sys_exit(int returncode)
{
    returncode = returncode;
}

        char *_sys_command_string(char * cmd, int len)
{
    cmd = cmd;
    len = len;
    return 0;
}





这些代码是不是就是重实现semihosting需要的函数的代码呢?

使用特权

评论回复
5
xiaoxin1986|  楼主 | 2009-8-23 15:40 | 只看该作者
真的被semihosting这个东西搞崩溃了,我本来觉得semihosting是纯调试用的,真正要放在目标机上跑的,当然不能指望semihosting,但是似乎有太多的运行库函数使用semihosting,到底该如何保证最终程序里没有semihosting呢?如果要用__main这个函数,应该重实现哪些函数才能脱机运行?

使用特权

评论回复
6
xiaoxin1986|  楼主 | 2009-8-23 15:41 | 只看该作者
希望达人能尽快帮我解决问题,先谢过了

使用特权

评论回复
7
linhai1986| | 2009-8-23 15:52 | 只看该作者
其实您问的问题都可以在网上搜索到答案。

使用特权

评论回复
8
xiaoxin1986|  楼主 | 2009-8-24 15:20 | 只看该作者
恩,问题解决了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

176

主题

1487

帖子

0

粉丝