Advertisement

在MDK中如何防止变量在复位时被初始化

  • 5星
  •     浏览量: 0
  •     大小:None
  •      文件类型:PDF


简介:
本文介绍了在MDK开发环境中,通过配置链接器设置和使用#pragma语句等方法来避免或控制程序变量在系统复位时被重新初始化的技术。 在最近的一个项目中,我们遇到了需要保存临时数据的需求,并且产品容易受到干扰导致复位的问题。因此,在系统复位时不重新初始化某些变量成为了解决方案的关键所在。 使用MDK(Keil)开发环境时,若想让单片机(如STM32)在复位后保持特定变量的值不变,则需防止这些全局或静态变量被默认设置为零。通常情况下,在项目中启用“Generate Debug Information”下的“Initialize Variables”选项会导致所有变量在每次系统启动或者复位时都被初始化为0,这与我们的需求相违背。 为了实现这一目标,请按照以下步骤操作: 1. 进入MDK项目的属性设置界面。 2. 选择CC++或Target选项卡,并转到Output类别下找到“Initialize Variables”选项。取消勾选它以禁止编译器在复位时对变量进行初始化处理。 此外,代码层面的调整也至关重要。使用`__noinit__`宏(该宏定义为`__attribute__((zero_init))`)来声明不需要自动初始化的变量: ```c #define __noinit__ __attribute__((zero_init)) // 使用示例: __noinit__ int tmp; // 这个变量在复位时不会被重置为0。 ``` 或者直接使用标准语法: ```c __attribute__((zero_init)) int tmp; ``` 需要注意的是,采用这种做法后,在程序启动前必须确保这些特殊声明的变量已经被正确初始化。如果未进行适当的赋值,则可能面临不确定的数据状态和潜在的功能异常。 这种方法在单片机应用中常用于保存中断计数器、设备配置等关键信息,以保证复位后的系统行为一致性。然而对于需要高度可靠性的应用场景(例如金融或医疗设备),则建议考虑使用非易失性存储器如EEPROM来更安全地保存重要数据。 综上所述,在MDK环境下通过项目选项和代码修改相结合的方法可以实现特定变量在单片机复位时保持不变的目标,从而满足项目的特殊需求。

全部评论 (0)

还没有任何评论哟~
客服
客服
  • MDK
    优质
    本文介绍了在MDK开发环境中,通过配置链接器设置和使用#pragma语句等方法来避免或控制程序变量在系统复位时被重新初始化的技术。 在最近的一个项目中,我们遇到了需要保存临时数据的需求,并且产品容易受到干扰导致复位的问题。因此,在系统复位时不重新初始化某些变量成为了解决方案的关键所在。 使用MDK(Keil)开发环境时,若想让单片机(如STM32)在复位后保持特定变量的值不变,则需防止这些全局或静态变量被默认设置为零。通常情况下,在项目中启用“Generate Debug Information”下的“Initialize Variables”选项会导致所有变量在每次系统启动或者复位时都被初始化为0,这与我们的需求相违背。 为了实现这一目标,请按照以下步骤操作: 1. 进入MDK项目的属性设置界面。 2. 选择CC++或Target选项卡,并转到Output类别下找到“Initialize Variables”选项。取消勾选它以禁止编译器在复位时对变量进行初始化处理。 此外,代码层面的调整也至关重要。使用`__noinit__`宏(该宏定义为`__attribute__((zero_init))`)来声明不需要自动初始化的变量: ```c #define __noinit__ __attribute__((zero_init)) // 使用示例: __noinit__ int tmp; // 这个变量在复位时不会被重置为0。 ``` 或者直接使用标准语法: ```c __attribute__((zero_init)) int tmp; ``` 需要注意的是,采用这种做法后,在程序启动前必须确保这些特殊声明的变量已经被正确初始化。如果未进行适当的赋值,则可能面临不确定的数据状态和潜在的功能异常。 这种方法在单片机应用中常用于保存中断计数器、设备配置等关键信息,以保证复位后的系统行为一致性。然而对于需要高度可靠性的应用场景(例如金融或医疗设备),则建议考虑使用非易失性存储器如EEPROM来更安全地保存重要数据。 综上所述,在MDK环境下通过项目选项和代码修改相结合的方法可以实现特定变量在单片机复位时保持不变的目标,从而满足项目的特殊需求。
  • C++使静态一次
    优质
    本文将介绍在C++编程语言中如何使用静态变量,并确保该静态变量在整个程序运行期间只进行一次初始化的方法。 在学习C++的过程中,同学们常常只是死记硬背书本上的内容,比如静态变量只初始化一次这样的特性。你们可能会默默提醒自己:“一定要记住,static只会初始化一次”,希望能牢牢记住这一点。然而,大家往往难以记得牢固的原因在于没有真正理解其背后的原理。 下面我将通过一段代码来解释这个概念: ```cpp #include using namespace std; int main() { int initNum = 3; for (int i=5; i > 0; --i) { static int n1 = initNum; cout << n1的值为: << n1++ << endl; } } ``` 在这个例子中,静态变量`n1`在第一次进入循环时会被初始化为`initNum`(即3),然后每次循环迭代过程中都会自增。由于它是静态类型,在整个程序执行期间只会被初始化一次,之后的每一次访问都不会重新赋值。 通过这种方式理解原理会更容易记住和应用相关特性。
  • Keil MDK怎样设置非零
    优质
    本文详细介绍了如何在Keil MDK开发环境中为C/C++程序中的全局变量设置非零初始值的具体步骤和方法。 在一些工控产品中,系统复位(非上电复位)后可能需要保留RAM中的数据以快速恢复现场或避免因瞬间复位而重启设备。然而,默认情况下,Keil MDK会在任何形式的复位时将RAM区内的未初始化变量清零。如何设置这些未初始化的数据变量不被零初始化是本段落探讨的主题。
  • STM32和喂看门狗
    优质
    本文将详细介绍如何在STM32微控制器中正确地初始化及维护看门狗定时器,以确保系统稳定运行。 本段落主要讲解了STM32如何初始化看门狗以及喂狗的过程,希望能对你学习相关内容有所帮助。
  • 用易语言进程关闭
    优质
    本文将详细介绍使用易语言编写代码来保护程序免受未经授权的关闭和干扰的方法与技巧,帮助开发者增强软件安全性。 易语言防止进程被关闭源码包括:防止进程被关闭、刷新进程信息、修改API首地址、还原API、安装全局钩子、修改虚拟保护、返回虚拟信息、取程序或DLL句柄、取DLL函数地址、写内存字节等操作。具体涉及到的API有api_ExitWindowsEx,以及创建和管理进程快照的相关方法如创建进程快照、开始进程快照和继续进程快照,并且包括获取当前进程伪句柄及释放内存的操作。
  • QT固定第一列,拖动遮挡
    优质
    本教程介绍如何在QT界面开发中固定表格的第一列,确保用户在进行横向滚动操作时始终可见,提供更好的用户体验。 在QT编程过程中,创建动态且用户友好的界面至关重要,尤其是在展示数据的场景下(例如使用QTableView或QTableWidget)。标题为“固定第一列”的需求指出了这样一个问题:确保表格中的关键信息始终可见,在滚动或者拖动时不会被遮挡。这尤其适用于处理大量数据或多列表格的情况,因为这样可以提高可读性和导航效率。 QT框架提供了丰富的API和工具来实现这种自定义行为。你需要创建一个继承自QTableView或QTableWidget的子类,并覆盖默认的行为。接着需要关注的是`horizontalHeader()`函数,它返回表格的水平表头视图(QHeaderView)。在这个表头视图上,我们可以设置各种属性和信号处理方法。 为了固定第一列,在重写`resizeEvent()`方法时确保在改变大小的情况下保持第一列宽度不变是必要的。同时需要通过处理`sectionResized()`信号来防止用户调整第一列的宽度。此外,可以使用`setSectionResizeMode()`函数设定自动调整模式为固定的宽度。 为了让拖动操作中不遮挡固定的第一列,我们需要关注水平表头视图的滚动行为,并重写`horizontalScrollbarValueChanged(int value)`方法,在改变滚动条值时更新表头的位置以确保第一列表始终可见。这通常涉及计算偏移量并相应地调整可视部分。 实际编码过程中可能还需要处理一些边缘情况,例如在表格内容不足以填充整个窗口的情况下保持固定的第一列。这需要对表格的几何属性进行额外检查。 实现这一功能要求深入了解QT事件处理、模型视图架构以及自定义组件的能力。通过深入理解QT框架和API,你可以创建出高效且用户体验优秀的应用,并根据具体需求定制UI元素来实现如固定列这样的高级特性。
  • Ubuntu禁用软键盘以caribou启动.rar
    优质
    本教程详细介绍了如何在Ubuntu系统中关闭自动弹出的软键盘功能,避免Caribou服务自启动,适用于遇到此问题的用户。 当您使用触摸屏时,可能会遇到屏幕键盘(caribou)弹出的问题。即使在无障碍服务菜单中将其禁用,这个问题也可能仍然存在。
  • Ubuntu 16.04设定root用户的密码
    优质
    本文将指导读者在Ubuntu 16.04系统中如何为root用户设置初始密码,确保系统的安全登录。 本段落主要介绍了在Ubuntu 16.04下如何设置root用户的初始密码。需要的朋友可以参考相关内容。
  • Python 字符串插入
    优质
    本文将介绍在Python字符串中使用格式化方法和f-string来嵌入变量的方法,帮助读者轻松实现动态文本构造。 本段落详细介绍了如何在Python字符串中插入变量,并通过代码示例帮助读者更好地理解和学习相关内容。对这一主题感兴趣的朋友可以参考这篇文章。
  • Web浏览器Java?
    优质
    本教程详细介绍了如何在不同的网络浏览器(如Chrome、Firefox等)中禁用Java插件或脚本的方法,以提高网页浏览的安全性和性能。 本段落讲解了如何在多种操作系统及浏览器上禁用Java,包括Solaris SPARC、Solaris x86、Red Hat Linux、SUSE Linux、Oracle Enterprise Linux、Windows 8、Windows 7、Vista、Windows XP、Windows 2008 Server和Macintosh OS X等平台以及Internet Explorer、Firefox、Chrome及Safari浏览器。此外,还介绍了如何在Java Version 7及以上版本中禁用Java功能。