Advertisement

子函数被中断函数和主函数共同调用

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


简介:
本文探讨了编程中子函数在被中断函数与主函数同时调用时可能出现的问题及解决方案。通过实例分析,帮助读者理解不同场景下的调用机制及其影响。 在单片机系统中,中断函数与主函数可能会同时调用同一个子函数,这可能导致一些问题。 这些问题的根源在于该子函数可能是不可重新进入(reentrant)的。这意味着当此函数正在执行时,另一个ISR(Interrupt Service Routine, 中断服务程序)可能试图调用它。这种情况下结果是不确定性的,并且有可能导致参数错误等问题出现。 例如,在某些代码中,`WRITE_GMVLX1_REG` 函数被多个地方所引用:既有中断服务程序也有主函数中的其他部分会使用到这个功能。如果该子函数不可重新进入,则可能会在同一时间点上执行两次,从而引发问题。 解决这些问题的方法包括: - 如果可以确定两个调用不会同时发生,并且此函数仅依赖寄存器而不访问内存时,你可以忽略这些警告。 - 对于需要使用内存的函数,请利用`OVERLAY` 指令来排除该函数被覆盖分析的可能性。例如: ``` OVERLAY (?PR?_WRITE_GMVLX1_REG?D_GMVLX1 ! *) ``` 如果这个子程序在执行期间可以被调用,那么解决起来会更加复杂: - 当从主程序中调用此函数时关闭中断。 - 使用`#pragma disable`来禁止对其他地方的函数进行覆盖分析。 - 将该子程序排除于overlay analysis之外。 此外还可以通过以下方式处理: - 创造两个独立版本,分别用于ISR和main部分; - 修改代码使其可重新进入。例如使用这样的定义: ``` void myfunc(void) reentrant { ... } ``` 这种方法会生成一个用来存储参数及局部变量的栈,并且需要在`STARTUP.A51` 中配置该重入式堆栈,这将消耗更多RAM并减缓可重新进入函数的速度。

全部评论 (0)

还没有任何评论哟~
客服
客服
  • 优质
    本文探讨了编程中子函数在被中断函数与主函数同时调用时可能出现的问题及解决方案。通过实例分析,帮助读者理解不同场景下的调用机制及其影响。 在单片机系统中,中断函数与主函数可能会同时调用同一个子函数,这可能导致一些问题。 这些问题的根源在于该子函数可能是不可重新进入(reentrant)的。这意味着当此函数正在执行时,另一个ISR(Interrupt Service Routine, 中断服务程序)可能试图调用它。这种情况下结果是不确定性的,并且有可能导致参数错误等问题出现。 例如,在某些代码中,`WRITE_GMVLX1_REG` 函数被多个地方所引用:既有中断服务程序也有主函数中的其他部分会使用到这个功能。如果该子函数不可重新进入,则可能会在同一时间点上执行两次,从而引发问题。 解决这些问题的方法包括: - 如果可以确定两个调用不会同时发生,并且此函数仅依赖寄存器而不访问内存时,你可以忽略这些警告。 - 对于需要使用内存的函数,请利用`OVERLAY` 指令来排除该函数被覆盖分析的可能性。例如: ``` OVERLAY (?PR?_WRITE_GMVLX1_REG?D_GMVLX1 ! *) ``` 如果这个子程序在执行期间可以被调用,那么解决起来会更加复杂: - 当从主程序中调用此函数时关闭中断。 - 使用`#pragma disable`来禁止对其他地方的函数进行覆盖分析。 - 将该子程序排除于overlay analysis之外。 此外还可以通过以下方式处理: - 创造两个独立版本,分别用于ISR和main部分; - 修改代码使其可重新进入。例如使用这样的定义: ``` void myfunc(void) reentrant { ... } ``` 这种方法会生成一个用来存储参数及局部变量的栈,并且需要在`STARTUP.A51` 中配置该重入式堆栈,这将消耗更多RAM并减缓可重新进入函数的速度。
  • C语言
    优质
    本文介绍了C语言中主函数与子函数的基本概念及其相互调用机制,帮助读者理解程序执行流程。 C语言函数包括主函数和子函数。在编程过程中,可以通过调用子函数来实现代码的模块化设计,使得程序更加清晰易懂且便于维护。主函数负责整个程序流程的控制,并可以调用其他定义好的子函数以完成特定任务。这种结构有助于提高代码复用性和可读性。
  • MATLAB指南-.pdf
    优质
    本手册详细介绍了如何在MATLAB中编写和调用子函数,帮助用户掌握子函数的基本概念及其实现技巧,提高编程效率。 今天查看了有关MATLAB子函数调用的资料,《子函数调用.pdf》内容详细且说明清晰。这里与大家分享这份文档,它对理解如何正确使用和编写MATLAB中的子函数非常有帮助。
  • ARM汇编SWIC
    优质
    本文介绍了如何在ARM架构下使用SWI指令进行中断调用,并详细讲解了从汇编代码中调用C语言编写的目标函数的过程和方法。 在汇编语言中设置软中断以调用C语言函数,实现系统调用的模拟。
  • Python的阶跃、SigmoidReLU
    优质
    本文章介绍了Python编程中常用的三种激活函数:阶跃函数、Sigmoid函数及ReLU函数,解释了它们的工作原理及其在神经网络中的应用。 用Python实现阶跃函数、sigmoid函数和ReLU函数,并绘制它们的图形。
  • C51的
    优质
    C51的中断函数介绍了在C51编译环境下,如何编写和使用中断服务程序来处理实时事件或信号。通过详细解析中断向量表与编程技巧,帮助开发者实现高效的任务调度和响应机制。 C51的中断函数格式为:void FuncIr(void) interrupt x [using y]。本段落主要分析了C51的中断函数。
  • matlab的anyall
    优质
    本文介绍了MATLAB编程语言中用于逻辑操作的重要函数——any和all。any函数用来检测数组中是否存在非零元素;all函数则检查所有元素是否均为非零值。两者在数据处理及条件判断中应用广泛,是掌握MATLAB的基础技能之一。 在MATLAB编程中,`any`函数和`all`函数的使用方法如下: - `all` 函数:用于检测矩阵中的所有元素是否均为非零值。如果全部为非零,则返回1;否则返回0。 - `any` 函数:检查矩阵内是否存在至少一个非零元素。如果有任何一个元素是非零,那么就返回1;如果没有找到任何非零元素,则返回0。 这两个函数的使用方式是一样的。
  • C#Python
    优质
    本文将介绍如何在C#程序中集成并调用Python编写的函数或脚本,结合.NET框架与Python环境,实现跨语言编程应用。 开发环境使用的是VS2017和Framework 4.7.2。Python可以在VS2017内安装,也可以选择在外部单独安装。调试流程如下:首先打开源码并运行调试程序;观察并确认Python文件路径是否正确,如有必要,请根据您机器硬盘的具体位置进行相应调整。如果觉得框架版本过高,则可以自行修改项目所使用的Framework版本。