Advertisement

KEIL警告:段的多重调用问题

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


简介:
本文章主要讨论在使用Keil进行程序开发时遇到的一个常见问题——段的多重调用错误,并提供了解决方案和预防措施。 KEIL警告:MULTIPLE CALL TO SEGMENT是KEIL编译器中的一个提示,表明检测到某个函数可能在主程序及至少一个中断服务例程中被调用,或者同时由多个不同的中断服务例程进行调用。 这个警告源于重入性问题,在多线程操作系统环境中较为常见。尽管这通常不会导致运行时错误,但若出现问题,则可能导致难以解决的冲突情况。 为避免此类问题,有两种策略: 一、使用reentrant使函数可重复进入。关于reentrant的说明如下: 1. 重入口函数不能传递位类型参数和变量; 2. 重入函数建立的是模拟堆栈区,在默认存储模式空间之外分配非覆盖式堆栈; 3. 使用大量堆栈空间,因此应尽量减少使用这种模式; 4. 同一程序中可以定义不同存储器模式的重入口函数,但是不能调用相同模式下未标记为可重入属性的间接调用函数。但可以调用普通函数。 5. 实际参数可以传递给间接调用的重入函数。 二、创建两个功能相同的副本,并分别在中断和非中断环境下调用它们。 默认情况下,KEIL编译器中的任何未特别指定为可重复进入的函数都是不可重入性的。这是因为这些函数局部变量存储于一个覆盖式段中而非堆栈上。 警告L15: MULTIPLE CALL TO SEGMENT表明连接器检测到有函数可能同时被主程序和中断服务例程(或调用该服务例程的其他函数)所访问,或者由多个不同的中断服务例程同时进行访问。这可能导致数据冲突及变量丢失。 原因可能是此函数为不可重入性,并在运行中可能会因中断而被打断,导致内存覆盖问题。解决方法包括:如果确定两个调用不会在同一时间发生(即主程序执行该函数时禁止所有可能的中断),并且该函数不使用任何存储空间,则可以忽略此警告;若其占用内存资源,则应利用连接器OVERLAY指令将函数排除在覆盖分析之外,确保其不可重入性。

全部评论 (0)

还没有任何评论哟~
客服
客服
  • KEIL
    优质
    本文章主要讨论在使用Keil进行程序开发时遇到的一个常见问题——段的多重调用错误,并提供了解决方案和预防措施。 KEIL警告:MULTIPLE CALL TO SEGMENT是KEIL编译器中的一个提示,表明检测到某个函数可能在主程序及至少一个中断服务例程中被调用,或者同时由多个不同的中断服务例程进行调用。 这个警告源于重入性问题,在多线程操作系统环境中较为常见。尽管这通常不会导致运行时错误,但若出现问题,则可能导致难以解决的冲突情况。 为避免此类问题,有两种策略: 一、使用reentrant使函数可重复进入。关于reentrant的说明如下: 1. 重入口函数不能传递位类型参数和变量; 2. 重入函数建立的是模拟堆栈区,在默认存储模式空间之外分配非覆盖式堆栈; 3. 使用大量堆栈空间,因此应尽量减少使用这种模式; 4. 同一程序中可以定义不同存储器模式的重入口函数,但是不能调用相同模式下未标记为可重入属性的间接调用函数。但可以调用普通函数。 5. 实际参数可以传递给间接调用的重入函数。 二、创建两个功能相同的副本,并分别在中断和非中断环境下调用它们。 默认情况下,KEIL编译器中的任何未特别指定为可重复进入的函数都是不可重入性的。这是因为这些函数局部变量存储于一个覆盖式段中而非堆栈上。 警告L15: MULTIPLE CALL TO SEGMENT表明连接器检测到有函数可能同时被主程序和中断服务例程(或调用该服务例程的其他函数)所访问,或者由多个不同的中断服务例程同时进行访问。这可能导致数据冲突及变量丢失。 原因可能是此函数为不可重入性,并在运行中可能会因中断而被打断,导致内存覆盖问题。解决方法包括:如果确定两个调用不会在同一时间发生(即主程序执行该函数时禁止所有可能的中断),并且该函数不使用任何存储空间,则可以忽略此警告;若其占用内存资源,则应利用连接器OVERLAY指令将函数排除在覆盖分析之外,确保其不可重入性。
  • Keil MDK常见解决方案
    优质
    本指南详细解析Keil MDK开发工具中常见的问题及警告信息,并提供有效的解决策略和技巧,帮助开发者提高编程效率。 本段落介绍了如何解决MDK几种常见的错误和警告。
  • 如何解决Anaconda中Python解释器时
    优质
    本文章主要讲解了在使用Anaconda环境中调用Python解释器时常遇到的一些警告问题,并提供了针对性的解决方案。读者将学会如何有效地管理和消除这些警告信息,以提高代码质量和开发效率。适合有一定编程基础且常用Anaconda进行数据分析和科学计算的专业人士阅读。 当在命令行输入python时出现“Warning: This Python interpreter is in a conda environment, but the environment has not been activated. Libraries may fail to load.”的提示,这是因为所使用的Python是Anaconda中自带的那个版本,并且当前处于一个未激活的conda环境中。为了使用这个环境中的库和功能,请确保先激活该环境。 可以在cmd中输入`conda activate 环境名`来激活相应的conda环境(请将“环境名”替换为实际的环境名称)。
  • Keil常见类型
    优质
    本文将介绍在使用 Keil 集成开发环境进行软件开发时常见的几种警告类型及其解决方法,帮助开发者提升代码质量。 Keil是一款广泛使用的集成开发环境(IDE),特别针对基于ARM和8051微控制器的嵌入式系统软件开发。它提供了编译器、调试器、模拟器以及硬件仿真等功能。尽管Keil功能强大,但在使用过程中可能会遇到各种警告和错误。这些警告和错误虽然不会阻止程序的编译,但可能在运行时导致不可预料的问题。因此,了解这些问题的原因及解决方法对于软件开发者来说至关重要。 以下是Keil中常见的几种警告及其相关知识点: 1. Warning 280: i: unreferenced local variable 这个警告表示变量i在函数声明后未使用。如果局部变量被声明但没有进行任何读写操作,则会导致编译器发出此警告。解决这个问题通常有两种方法:要么使用该变量以消除警告,要么从代码中删除未使用的变量声明。 2. Warning 206: Music3: missing function-prototype 这个警告意味着函数Music3()没有被正确地声明或外部声明,导致其他函数无法调用它。对于同一文件中的函数,可以在文件顶部声明其原型;而对于跨文件的函数,则应使用extern关键字来声明该函数。 3. Error: Can’t open file ‘beep.h’ 这个错误发生在编译过程中,因为找不到#include指令指定的头文件beep.h。解决方法是创建一个名为beep.h的文件并将其放置在正确的工作目录中。 4. Error 237: LedOn: function already has a body 此错误表明有两个或更多相同名称的函数定义,通常称为重复定义问题。为了解决这个问题,需要确保所有函数都有唯一的名称且没有重名的情况出现。 5. ***WARNING 16: UNCALLED SEGMENT 这个警告说明了存在未被调用的代码段占用了程序内存空间。可以通过移除这些未使用的函数或使用条件编译来控制其编译过程,从而节省存储空间。 6. ***WARNING 6: XDATA MEMORY OVERLAP 此警告表示外部数据内存中地址冲突。解决方法是检查并确保没有变量被错误地定义在同一地址上。 7. Warning 206: ‘DelayX1ms’: missing function-prototype 和 Error 267: ‘DelayX1ms’: requires ANSI-style prototype 这两个提示都指向同一个问题,即函数DelayX1ms()未正确声明或定义。解决方法是确保该函数在使用前已被正确定义,并且当从其他文件中调用时有正确的外部声明。 8. ***WARNING 1 & 2: UNRESOLVED EXTERNAL SYMBOLS 这些警告通常指出程序中存在对未定义的或者不在工程中的函数或变量进行调用的问题。解决方法是将相应的函数声明添加到头文件,并确保它们在编译过程中包含进来。 9. ***ERROR 107: ADDRESS SPACE OVERFLOW 和 ***ERROR 118: REFERENCE MADE TO ERRONEOUS EXTERNAL 这些错误通常与特定存储模式设置相关,如SMALL模式。在这种情况下,局部变量可能会消耗掉data空间导致溢出问题。可以通过将部分数据移到idata空间来避免这种情况。 10. ***WARNING L1 & L2: UNRESOLVED EXTERNAL SYMBOL 这类警告通常是由于项目配置不当或代码未被正确编译所引起的,例如没有添加C文件到项目中或者存在未调用的已定义函数。解决方法是仔细检查项目的设置并确保所有必要的文件都被包含进来。 以上就是对Keil常见问题和解决方案的一些介绍。理解这些问题可以帮助开发者更有效地使用该工具,并编写出更加稳定高效的程序代码。
  • 动态规划解决
    优质
    本文探讨了如何运用动态规划算法有效地解决多段图中的最短路径问题,通过分阶段优化策略实现高效计算。 使用动态规划求解多段图问题的算法可以用C语言实现。这种方法通过将复杂的问题分解为更小、更容易解决的子问题来优化计算效率,从而找到最优路径或解决方案。在处理多段图时,每个节点可以被视为一个阶段,而边上的权重则代表从一个阶段到另一个阶段的成本或距离。动态规划算法会存储并利用之前计算的结果来避免重复工作,这使得它特别适合于解决具有重叠子问题的优化问题。
  • MySQL登录解决方案
    优质
    本文提供了解决MySQL登录时遇到的各种警告和错误的有效方法,帮助用户顺利解决登录障碍,提高数据库安全性。 ### 前言 在使用MySQL进行登录操作时,经常会遇到以下警告: ``` Warning: Using a password on the command line interface can be insecure. ``` 这个提示让人感到不愉快,尤其是在编写脚本过程中看到这一行输出就更加令人烦恼。 ### 解决方法 该警告是由MySQL系统生成的,旨在提醒用户在命令行界面中直接输入密码是存在安全隐患的行为。 1. **解决办法一(仅供参考)** 此方案相对简单,在登录时将`-p`后面不紧跟任何字符串即可。虽然这种方法可以避免出现上述警告信息,但如果在此过程中输错密码,则需要重新键入或使用组合键删除已输入的内容。 需要注意的是,以上提供的方法仅能帮助用户避开安全提示,并不能从根本上解决潜在的安全问题。
  • C++中使红黑树解决线
    优质
    本文探讨了在C++编程语言环境中利用红黑树数据结构高效地解决线段重叠检测问题的方法与技巧。通过结合算法理论和实践操作,深入解析如何优化程序性能并简化代码实现过程。 本程序使用C++语言,并采用红黑树来解决线段重叠问题的查找任务。代码内包含详细的注释,便于读者理解和阅读。
  • Keil中常见错误与.pdf
    优质
    本PDF文件详细解析了使用Keil软件时可能遇到的各种常见错误和警告信息,提供了相应的解决方法和技术指导。适合嵌入式开发人员参考学习。 在使用Keil这款强大的嵌入式开发工具进行STM32开发的过程中,开发者可能会遇到各种错误与警告。这些问题是编译器根据C51编译规则检测到的源代码问题,并且理解并解决这些问题对于提高编程效率和保证代码质量至关重要。 以下是三种常见的错误类型: 1. 致命错误:这类最严重的错误包括伪指令、无效选项或找不到文件等,会导致编译过程立即停止而不生成目标文件。 2. 语法及语义错误:此类问题通常由于源码的结构不符合语言规范或者存在逻辑矛盾。尽管这些不会阻止后续代码被处理,但如果数量过多则会终止整个编译过程且不产生最终的目标文件。 3. 警告信息:虽然警告本身并不会阻碍目标文件生成或程序运行,但它们可能指示潜在问题需要关注。 接下来是几个常见错误及其原因的详细说明: - ERROR 100: 这个错误表示源代码中存在无法打印的字符,编译器不能处理。 - ERROR 101:字符串未正确闭合(缺少双引号)。 - ERROR 102:字符串长度超出限制(511字节),可以使用续行符`/`来解决此问题。 - ERROR 103: 尝试重复定义宏,应考虑用`#undef`取消先前的定义。但预定义的宏不能被删除。 - ERROR 104:缺少标识符(如在条件编译指令后)。 - ERROR 105:注释未正确结束(缺乏星号`)来关闭注释)。 - ERROR 106: 条件语句 (`#if`, `#ifdef`, 或` #ifndef`) 和终止标记(`#endif`)不匹配,确保每个条件开始都有对应的结束标志。 - ERROR 107:包含文件路径错误或缺失(在`#include`指令中)。 - ERROR 108: `#error` 指令需要一个字符串参数。 - ERROR 109:由自定义的`#error`消息引发的问题。 - ERROR 110:预处理命令行缺少伪指令,例如在使用`#define`, `#ifdef`, 等时必须提供有效的指令关键字。 - ERROR 111: 遇到了未被识别或不支持的预处理器指令。 - 错误码从ERROR 112到ERROR 114涉及条件语句块内错误,如`elif`, `else`, 和`endif`的位置不当问题。请确保它们位于正确的逻辑分支中。 - ERROR 117: 条件表达式(在`#if`, `#ifdef`, 或者` #ifndef`) 中存在语法错误。 - ERROR 118:宏调用缺少左括号(`()`),用于传递参数。 - ERROR 119:定义宏时形参名称重复使用。 - ERROR 120: 形式参数列表中不应出现字符 `c`(应改为逗号)。 - ERROR 121:实际参数列表缺失右括号 (`)。 - ERROR 122:宏调用的实际参数与定义中的形式参数不匹配。 - ERROR 123:缺少要定义的宏名称,通常在使用`#define`指令时发生。 - ERROR 124: 宏定义需要一个形参名(如`MACRO_NAME(arg)`)。 - 错误码从ERROR 125到ERROR 126涉及类型声明过于复杂的情况。这可能意味着过度使用的类型修饰符导致编译器无法处理的场景。 - ERROR 127: 使用了非法存储类,例如在函数外部使用`auto`或`register`关键字。 - 错误码从ERROR 128到上述所列:涉及内存空间定义错误。 理解这些错误信息及其原因有助于开发者快速定位和修复问题,并确保代码能顺利通过Keil编译器构建STM32项目。遵循良好的编程习惯,如合理命名、避免复杂的声明以及正确使用预处理指令等做法可以减少此类问题的发生频率。
  • 解决Keil试时J-Link弹窗
    优质
    本文介绍了解决在使用Keil进行程序调试时遇到的J-Link硬件调试器弹出烦人窗口的问题的方法和步骤。 在使用新版MDK调试STM32或其他ARM芯片的过程中,由于我使用的J-Link OB克隆版本的原因,经常会遇到“the connected J-Link is defective”的错误提示。