• 已解决 73482 个问题
  • 已帮助 5993 位优秀工程师

C语言变量复位问题

hehung 2018-03-22 浏览量:1220

最近写51单片机程序的时候遇到一个问题,如下:

我定义了一个变量:unsigned char insert_id = 0;

然后有一定条件下就会加上1,这是我的程序的目的。但是真正下载到单片机中运行时却出现了条件一触发就变量自动变成0,这个问题困扰了我几个小时。

随后想到的一个办法是再在设个变量下面定义了一个变量:unsigned char insert_id1 = 0;

然后执行与上面变量一样的操作却没有出现复位变成0的情况。之后我就把上面的变量与相关操作全部删除了,结构是新定义的变量也出现了上面的情况。无奈,只能在这个新定义的变量上面再定义一个上面都不做的变量。

这可能是内存的原因,但是有没有哪位大神遇到过类似的请情况,是怎么解决的?


有一些回答的小伙伴没有仔细看我的问题:我说明一下:

简单而言就是我定义了两个一样的变量,但是一个执行时会复位,一个正常。

代码就不贴了,几百行,贴了你们也不看

0 0 收起

我来回答

上传资料:
选择文件 文件大小不超过15M(格式支持:doc、ppt、xls、pdf、zip、rar、txt)
最佳答案
  • 看样子像是变量所在内存被覆盖了,应该有其他地方的出现内存溢出了,溢出后操作了变量所在的内存导致异常。
    • 发布于 2018-03-22
    • 举报
    • 评论 1
    • 0
    • 0
电子老工程师 回复了 :需要确认客户的具体频率是多大,规格书是系列资料 回复

其他答案 数量:12
  • 51芯片复位,ram状态未知, STARTUP.A51文件有内存清零配置,这个配置是上电后进入main()之前软件清零的设置
    • 发布于2018-03-22
    • 举报
    • 评论 1
    • 0
    • 0
电子老工程师 回复了  :功率和峰值正向电流不同 LTST-C171GKT 75mW 80mA LTST-C171KGKT 100mW 120mA 回复

  • 你定义的是全局变量吗,理论上不会出现这种情况,贴下代码看看吧
    • 发布于2018-03-22
    • 举报
    • 评论 2
    • 0
    • 0
hehung 回复了 lichangle :是全局变量,代码太多,几百行呢。我的操作就是我描述的一样 回复
电子老工程师 回复了  :生产地问一下采购渠道。 回复

  • 你是定义的全局变量还是局部变量,代码抛出来看看
    • 发布于2018-03-22
    • 举报
    • 评论 3
    • 0
    • 0
hehung 回复了 skawu :是全局变量,代码太多,几百行呢。我的操作就是我描述的一样 回复
skawu 回复了 skawu :全局变量建议做成static,然后对外抛出set和get方法,有问题好查,代码的可读性也高 回复
电子老工程师 回复了  :https://www.molex.com/webdocs/datasheets/pdf/en-us/0039281183_PCB_HEADERS.pdf 回复

  • 可能其它地方有赋值操作,最好将代码贴出来看看。
    • 发布于2018-03-22
    • 举报
    • 评论 5
    • 0
    • 0
hehung 回复了 捷波 :是全局变量,代码太多,几百行呢。我的操作就是我描述的一样。我可以保证没有再其他地方赋值,我定义了两个一样的变量,执行一样的操作,但就是有一个会复位,一个正常执行 回复
捷波 回复了 捷波 :工程编译链接有出现警告吗? 回复
hehung 回复了 捷波 :没有警告 回复
捷波 回复了 捷波 :那只有设置断点跟踪下这个变量的变化,看运行到哪里被置零了。 回复
电子老工程师 回复了  :不能以包装数量去选型替代。包装原厂定义。 回复

  • 一个文件里面操作的话,前面加上static试试看,
    • 发布于2018-03-22
    • 举报
    • 评论 3
    • 0
    • 0
hehung 回复了 chownn :我试了static还是不行 回复
chownn 回复了 chownn :变量前后是不是有数组之类的。没有的话,可以试试和别的变量交换下位置看看,可能出现越界或者非法访问了。 回复
电子老工程师 回复了  :https://item.szlcsc.com/70885.html 回复

  • 听描述不是全局和局部的问题,可能是内存溢出,一般可能是数组越界,这些问题,往这个方向找一找


    • 发布于2018-03-22
    • 举报
    • 评论 1
    • 0
    • 0
电子老工程师 回复了  :DMTH6016LSDQ-13,STMicroelectronics,这个有货但是电流低了点,需要确认 回复

  • 估计是数组或字符串之类的变量写操作超出了定义的长度,改写了后面的内存空间,恰好覆盖了这个变量的位置。前面定义一个什么都不做的变量,实际是把有用的变量后移了一个位置,可能正好避免了被改写。
    • 发布于2018-03-22
    • 举报
    • 评论 2
    • 0
    • 0
hehung 回复了 846ed4e9e9f1a3e1 :我也怀疑是内存的原因 回复
电子老工程师 回复了  :尾缀25代表包装数是25 回复

  • 你是怎么判断前者是0的?

    是直接仿真查看变量值,还是用条件语句判断的?

    条件语句判断有时候并不一定正确,编译器过度优化的话得加上 volatile

    不然的话,就有可能是其他地方修改了这个数据。

    • 发布于2018-03-22
    • 举报
    • 评论 2
    • 0
    • 0
hehung 回复了 我是爆米花啊 :我是用液晶显示出来的 回复
电子老工程师 回复了  :非原厂型号,请提供参数选型替代。 回复

  • 楼主还是上一下代码吧,这种问题好诡异啊。

    最好是在程序的不同地方都加一些LED的控制指令,看看大约是执行到哪里时会为0.

    再缩小bug范围,直到找到问题。

    • 发布于2018-03-22
    • 举报
    • 评论 1
    • 0
    • 0
电子老工程师 回复了  :MIC4576-5.0WT,Microchip Technology,供参考 回复

  • 诡异的情况通常都是因为代码逻辑有问题,有可能是id变量在哪被调用了而id1变量没有调用(用搜索命令全局搜索一下id和id1)。如果真的怀疑是编译器问题可以加上取消优化。建议使用可以调试的stc15系列单片机开发吧,架构也同样是增强型51,程序开发后一直到不可调试的51核其他单片机开发难度会大大下降。
    • 发布于2018-03-23
    • 举报
    • 评论 1
    • 0
    • 0
电子老工程师 回复了  :FC0402E50R0BST0,Vishay Dale Thin Film,供参考 回复

  • 可以通过仿真或是串口输出当前变量地址中的值,看看是不是被非法赋值了。
    • 发布于2018-03-26
    • 举报
    • 评论 1
    • 0
    • 0
电子老工程师 回复了  :问一下供应商渠道,SPQ包装重量。 回复

  • 楼主最好把操作这个变量的函数语句也放上来给大家看看。另外,需要频繁修改的变量最好加volatile关键字。

    • 发布于2018-03-29
    • 举报
    • 评论 1
    • 0
    • 0
电子老工程师 回复了  :制造商 onsemi 制造商产品编号 CAT24C128WIGT3JN 回复

相关问题

问题达人换一批

C语言变量复位问题