【问题标题】:Function not being executed at all or doesn't execute properly函数根本没有执行或没有正确执行
【发布时间】:2012-04-30 08:50:53
【问题描述】:

我正在开发一个嵌入式 C 程序,其中即使调用 killnoise 函数并且程序总是到达它,它也不会执行,但是当我检查该函数输出的值时,我发现没有发生任何事情:

void KillNoise( int* array, int size )
{
  int k;

    for (k=0;k<size;k++)
    {
       if (array[k] < 20)
           array[k] = 0;
    }

}

这是我在哪里以及如何称呼它的:

void UX_zswDecide( void )
{
    float __xdata centerOfMass[UX_NUM_SENSORS];
    float __xdata vectx, vecty, module, tg;
    int __xdata i,j;

    KillNoise( UX_bigUpArray,    NUMPOINTS );
    KillNoise( UX_bigDownArray,  NUMPOINTS );
    KillNoise( UX_bigLeftArray, NUMPOINTS );
    KillNoise( UX_bigRightArray,  NUMPOINTS );

/* the rest of the function */ 
}

其中 NUMPOINTS、biguparray、bigleftarray ... 是之前声明的全局变量:

int   __xdata UX_bigUpArray[100];

int   __xdata UX_bigDownArray[100] ;

int   __xdata UX_bigLeftArray[100];
int   __xdata UX_bigRightArray[100] ;

#define NUMPOINTS 100 

非常感谢您的帮助,(我在使用另一个函数时遇到了同样的问题)

【问题讨论】:

  • 这看起来不错。你能提供一个minimal test-case吗?
  • 如果数组中的所有值都等于或大于 20,则不会发生任何事情。
  • 你确定 UX_zswDecide(() 正在执行吗?如果没有执行,就不会调用 KillNoise()
  • 这是来自您的来源的剪切粘贴吗?如果没有,请检查您的 for 循环后是否有分号!
  • @Nick ahh 太棒了,你是我被开除工作的救星,hhhhhh

标签: c embedded firmware 8051 sdcc


【解决方案1】:

我认为KillNoisearray参数的声明中需要__xdata

void KillNoise( int* __xdata array, int size )

或类似的东西。

【讨论】:

  • 是的,如果我在没有 __xdata 的情况下编译我会得到一个链接错误(没有足够的内存空间)
  • @TarikMokafih:但是你的示例代码只是说void KillNoise( int* array, int size ) 我认为你需要void KillNoise( int* __xdata array, int size ) 或类似的
  • 我刚试了一下,没什么区别,可能是调试器的问题,可能一切正常,只是调试器不刷新它的值,并且每次显示killnoise函数之前的值如果它应该在每次停止后刷新它的值,当我逐步运行程序时,我还注意到一些奇怪的东西,似乎当它到达 FOR 循环的末尾时,逐步调试器光标只是当它应该返回到 FOR 循环的开头时消失了
  • 您不需要,但代码会更小更快。
猜你喜欢
  • 2018-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-12
相关资源
最近更新 更多