打印
[ZLG-ARM]

ADS1.2库函数应用问题请教:

[复制链接]
3297|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
sjpu|  楼主 | 2008-7-7 10:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我在程序中调用了ADS1.2的库中:strlen()、strcpy()、sprintf
()、等函数,在调试的时候发现,调用sprintf
()后会改写与他没关系 的其它变量的值。我不清楚为什么? 有清楚的大虾给分析一下,调用这些库函数有什么需要注意的地方吗?

相关帖子

沙发
sjpu|  楼主 | 2008-7-8 17:34 | 只看该作者

ADS1.2 继续

仔细调程序,发现,并不是库函数改变了其它全局变量的值,发现在一个函数中申明的局部变量,其空间被分配到了全局变量的空间中,造成了对局部变量的操作直接改写了全局变量的值。但一直找不出为什么会这样,全局变量的空间与局部变量的空间重叠。以前从没遇到过这种事,有知道原因的朋友,别忘了告诉我一声,谢谢。

使用特权

评论回复
板凳
我学MCU| | 2008-7-9 10:10 | 只看该作者

查一下对sprintf目标缓冲区开的够不够大

1byte会被修改成2bytes的ASCII码

使用特权

评论回复
地板
sjpu|  楼主 | 2008-7-10 15:00 | 只看该作者

这不是缓冲区过界问题。

就好像连接器在连接时,把局部变量直接分配到全局变量的空间内部了。

使用特权

评论回复
5
btiger2000| | 2008-7-11 08:52 | 只看该作者

ads下有时候有这问题,不一定是调用库函数造成的!

可能是RAM空间不够了,或者局部变量太大等

使用特权

评论回复
6
寒雨飞扬| | 2008-7-11 18:46 | 只看该作者

你是不是使用了操作系统啊?

如果使用了操作系统,一定要注意为每一个任务分配足够的堆栈空间,防止堆栈空间不够用,任务中声明的变量就可以覆盖到其他任务的堆栈,这样就会出错,甚至造成系统崩溃。
把该任务的堆栈放大一点试试。

使用特权

评论回复
7
sjpu|  楼主 | 2008-7-14 09:21 | 只看该作者

谢谢上面两位的解答!!谢谢!

我的局部变量确实比较大,是一个129字节数组变量,我也用了操作系统uCOSII,
1、任务本身的堆栈我设置在2048字节;
2、将局部变量缩小到32字节,
3、RAM空间足够大(LPC2292,RAM:4MB),在分散加载文件里设置应该没什么问题
ROM_LOAD 0x80000000
{
    ROM_EXEC 0x80000000 0x80000
    {
        Startup.o (vectors, +First)
        * (+RO)
    }

    IRAM 0x40000000
    {
        Startup.o (MyStacks)
    }

    STACKS_BOTTOM +0 UNINIT
    {
        Startup.o (StackBottom)
    }

    STACKS 0x40004000 UNINIT
    {
        Startup.o (Stacks)
    }
    ERAM 0x80080000
    {
        * (+RW,+ZI)
    }

    HEAP +0 UNINIT
    {
        Startup.o (Heap)
    }

    HEAP_BOTTOM 0x80400000 UNINIT
    {
        Startup.o (HeapTop)
    }
}

调试时问题依然这样,局部变量直接被分配到全局变量空间了。

使用特权

评论回复
8
sjpu|  楼主 | 2008-7-14 09:36 | 只看该作者

再次谢谢上面两位的解答!!谢谢!

问题查出来了,确实是任务堆栈出问题了。在堆栈加大时忘改建立任务函数的栈顶指针。

使用特权

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

本版积分规则

22

主题

62

帖子

2

粉丝