• Keil仿真闪退问题


    关注 码龄 粉丝数 原力等级 -- 被采纳 被点赞 采纳率 code() 2024-04-03 12:29 采纳率: 0% 浏览 12 首页/ 嵌入式 / Keil仿真闪退问题 单片机51单片机 keil5 仿真 【51单片机 】闪退如果在main函数外初始化赋值【定义写在外面没问题】,点击调试仿真就会闪退;但是把初始化赋值写在main函数外面build后hex文件烧录到单片机运行却没有问题,这是为什么 收起 写回答 好问题 0 提建议 追加酬金 关注问题 微信扫一扫 点击复制链接 分享 邀请回答 编辑 收藏 删除 结题 收藏 举报 追加酬金 (90%的用户在追加酬金后获得了解决方案) 当前问题酬金 ¥ 0 (可追加 ¥500) ¥ 15¥ 20¥ 50¥ 100¥ 200 支付方式 扫码支付 二维码出错 点击刷新 支付金额 15 元 提供问题酬金的用户不参与问题酬金结算和分配 支付即为同意 《付费问题酬金结算规则》 结题 再想想 删除 再等等

    2条回答 默认 最新

    • 码农阿豪 Java领域优质创作者 2024-04-03 12:29
      关注
      让阿豪来帮你解答,本回答参考chatgpt3.5编写提供,如果还有疑问可以评论或留言
      这个问题可能是由于keil5编译器的一些特性导致的。在keil5中,当我们定义全局变量时,编译器会把它放在内存的静态存储区,而这个区域初始化时是以零值进行的。如果我们在定义全局变量时对它进行了赋值,编译器会把代码放在内存中的程序区域,并在main函数执行之前执行这些代码。 在调试仿真时,当我们尝试从静态存储区读取变量的值时,由于该区域中存储的值都是默认的零值,读取到的值可能会出现异常,从而导致程序出现错误。 解决这个问题的方法是在外部初始化全局变量时,将赋值操作放在函数内部,以确保执行顺序正确。 以下是一些可行的代码示例: 例1:
      int myVar = 0;
      int main()
      {
          myVar = 1;
          //其他代码
      }
      

      这里,全局变量myVar在定义时赋值为0,然后在main函数中将其赋值为1。这种方法可能导致程序出现错误。 例2:

      int myVar;
      void init()
      {
          myVar = 1;
      }
      int main()
      {
          init();
          //其他代码
      }
      

      这里,全局变量myVar被定义但未被初始化。然后,在init函数中将myVar赋值为1。在main函数中调用init函数以初始化myVar,然后执行其他代码。 通过这种方法,我们可以确保myVar的初始化发生在main函数执行之前,这可以确保myVar的值在程序正常执行期间是正确的。 注:如果您使用C++,则可以使用构造函数来解决这个问题。在这种情况下,全局变量myVar将自动初始化为零值,并在程序开始时使用构造函数进行初始化赋值。 例3:

      class MyClass
      {
      public:
          int myVar;
          MyClass()
          {
              myVar = 1;
          }
      };
      MyClass myObject;
      int main()
      {
          myObject.myVar = 2;
          //其他代码
      }
      

      这里,我们定义了一个包含一个整数成员变量的类MyClass。我们创建了一个全局对象myObject,在程序开始时使用MyClass构造函数初始化myVar。在main函数中,我们将myVar赋值为2,然后执行其他代码。

      展开全部

      评论
    • GISer Liu 2024-04-03 12:40
      关注

      该回答引用自GPT-3.5,由博主GISer Liu编写:

      根据你的描述,问题可能出现在全局变量的初始化赋值上。在Keil中,全局变量的初始化会在main函数执行之前完成,这意味着如果你的全局变量初始化过程中有复杂的逻辑或者依赖于特定硬件状态的部分,可能会导致仿真时的不稳定性,甚至闪退。
      解决方案可能包括:

      1. 将全局变量的初始化赋值尽量简化,避免依赖于其他外部状态。
      2. 在初始化赋值中,避免使用可能导致硬件访问的操作,如访问外设寄存器等。
      3. 将需要在main函数执行前完成的初始化逻辑,移至main函数内部,在main函数开始执行时再进行初始化。
        另外,建议在Keil中查看仿真时的日志或者错误信息,可能会有更详细的提示和信息,有助于进一步排查问题。

      如果该回答解决了您的问题,请采纳!如果没有,请私信联系或评论您的疑惑

      评论
    编辑
    预览

    报告相同问题?

  • 相关阅读:
    Canvas图形编辑器-数据结构与History(undo/redo)
    科目二试题
    五个编程原则:Rob Pike‘s 5 Rules of Programming
    【CCF】第30次csp认证——202305-1重复局面
    15.状态模式(State)
    数据分析与Excel(三)
    【6.824】分布式lab1 mapReduce
    spring整合influxdb
    PDF文件怎么转换成Word?这几种方法原来这么简单
    Linux_理解程序地址空间和页表
  • 原文地址:https://ask.csdn.net/questions/8083142