打印
[AVR单片机]

疑问探讨

[复制链接]
3847|18
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
电子学习员|  楼主 | 2013-4-1 20:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
今天调试门控器系统,在main函数中定义了一个20字节大小的数组,然后调用了strcpy,复制了一个字符串给这个数组。系统运行后,测试障碍物探测功能,好像门控器失控了,并且门控器还复位。  我把数组定义成全局的就没事了,定义成局部的,测试几次就会出现失控问题。怎么去理解这个问题呢?各位高手怎么看?
char version[20];
strcopy(version, "VER");/*VER是软件版本号*/

相关帖子

沙发
电子学习员|  楼主 | 2013-4-1 20:09 | 只看该作者
今年刚毕业没多少经验,实在是想不出什么原因,难道是main函数一直没法释放这个空间,程序运行一段时间后就乱了。。。。怎么回事。。。

使用特权

评论回复
板凳
hyhmh| | 2013-4-1 20:29 | 只看该作者
首先要了解 编译系统对 strcopy()函数的声明,即调用该函数的接口定义。
在main()内定义的变量,对其它源文件的函数而言 应该是不可见的。而全局变量则就完全不同了

使用特权

评论回复
评分
参与人数 1威望 +6 收起 理由
qin552011373 + 6 很给力!
地板
电子学习员|  楼主 | 2013-4-1 21:49 | 只看该作者
hyhmh 发表于 2013-4-1 20:29
首先要了解 编译系统对 strcopy()函数的声明,即调用该函数的接口定义。
在main()内定义的变量,对其它源文 ...

你讲的意思我知道,这个比较诡异,想不通

使用特权

评论回复
5
huangxz| | 2013-4-1 22:25 | 只看该作者
很明显是栈有问题,对于内存小的单片机请不要随意使用库函数

使用特权

评论回复
评分
参与人数 1威望 +6 收起 理由
qin552011373 + 6 很给力!
6
qin552011373| | 2013-4-1 22:44 | 只看该作者
avr不轻易使用库函数

使用特权

评论回复
7
电子学习员|  楼主 | 2013-4-1 22:58 | 只看该作者
qin552011373 发表于 2013-4-1 22:44
avr不轻易使用库函数

您好版主,那为什么我把这个char version【20】;定义成全局的就不会出现问题,还是不太明白

使用特权

评论回复
8
电子学习员|  楼主 | 2013-4-1 23:00 | 只看该作者
huangxz 发表于 2013-4-1 22:25
很明显是栈有问题,对于内存小的单片机请不要随意使用库函数

您是说库函数会占用很大的栈空间吗?

使用特权

评论回复
9
电子学习员|  楼主 | 2013-4-1 23:02 | 只看该作者
qin552011373 发表于 2013-4-1 22:44
avr不轻易使用库函数

现在出现的问题是:
1.如果我定义了这个局部数组,而不调用strcpy,不会出现问题
2.如果我把这个数组定义成全局的(放在main的外面),调用strcpy,也不会出现问题

使用特权

评论回复
10
perry_peng| | 2013-4-2 08:43 | 只看该作者
电子学习员 发表于 2013-4-1 23:02
现在出现的问题是:
1.如果我定义了这个局部数组,而不调用strcpy,不会出现问题
2.如果我把这个数组定义 ...

这个跟库函数strcpy没有关系,应该是栈溢出了,C语言中函数内定义的局部变量放在栈空间。而全局变量应该会被分配到用户RAM空间。

使用特权

评论回复
11
yiucing| | 2013-4-2 09:28 | 只看该作者
定义成局部变量,再赋值为0看看。。

使用特权

评论回复
12
qin552011373| | 2013-4-2 09:49 | 只看该作者
电子学习员 发表于 2013-4-1 22:58
您好版主,那为什么我把这个char version【20】;定义成全局的就不会出现问题,还是不太明白 ...

全局数组应该是保存在flash中,在程序保存空间中的,局部应该是保存在RAM中,RAM空间不够大

使用特权

评论回复
13
qin552011373| | 2013-4-2 09:52 | 只看该作者
局部变量-----栈 stack
全局变量,静态变量-----初始化的存在数据段,未初始化的存在bss段,上电后统一清0,我们一般都说存在全局静态数据区
常量----常量数据区
动态申请的---堆

使用特权

评论回复
14
电子学习员|  楼主 | 2013-4-2 12:21 | 只看该作者
qin552011373 发表于 2013-4-2 09:52
局部变量-----栈 stack
全局变量,静态变量-----初始化的存在数据段,未初始化的存在bss段,上电后统一清0 ...

版主,你说的局部变量、全局变量、静态变量存储的位置我知道,
void main()
{

    .........
    ...........
    char version[20];
    strcpy(version, VER);
    .....
   ......
   ......

}

如果我仅仅定义了这个局部数组,而不调用后面的strcpy,也不会出现问题

使用特权

评论回复
15
jiabin1024| | 2013-4-2 12:26 | 只看该作者
你把数组长度定义为1个字节或则是2个字节看看还会不会出现问题

使用特权

评论回复
16
huangxz| | 2013-4-2 12:35 | 只看该作者
看来楼主知道的不少,就是懒.这种问题软仿都能找的到问题在哪里

使用特权

评论回复
17
yiucing| | 2013-4-2 13:24 | 只看该作者
这样试一下啊。。
void main()
{

    .........
    ...........
    char version[20];
   
    memset(version, 0, 20); //清0
    strcpy(version, VER);
    .....
   ......
   ......

}

使用特权

评论回复
18
qin552011373| | 2013-4-2 16:39 | 只看该作者
电子学习员 发表于 2013-4-2 12:21
版主,你说的局部变量、全局变量、静态变量存储的位置我知道,
void main()
{

那就应该是那个函数的问题了,尽量自己写函数

使用特权

评论回复
19
foshan| | 2013-4-3 00:02 | 只看该作者
应该是栈溢出,

需要仔细检查存储空间的使用情况。

使用特权

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

本版积分规则

6

主题

150

帖子

0

粉丝