根据变量更改函数调用

时间:2014-02-28 19:28:51

标签: c

编辑:我只是使用案例陈述,我不知道是否有更简单的方法来做这件事

好的,所以我想调用47个不同的宏中的一个,这些宏只是名称更改而有所不同 如果输入0,则调用“macros”AD0_ADCOMP0,31为AD0_ADCOMP31

这将是一个汇编程序,我想设置一定数量的寄存器号。

说明AD0_ADCOMP0 = 0x000;但是如何将变量添加到宏中?

我试图做

Storelocation = &AD0_ADCOMP0 + offset
Storelocation = 0x000

但它的功能与原版不同。

AD0_ADCOMP0  = 0x000;

在寄存器的内存位置存储0x000.i感觉这很简单,我无法看到它。

stuct是

typedef union
{
  struct
  {
    __HWORD hword;
  } ADCOMP;
  struct
  {
    __HWORD hword;
  } ADCOMPB;
} __ADCOMP;



#ifdef __IO_DEFINE
#pragma segment     DATA=IO_AD0,attr=IO,locate=0x1304
#endif


#define AD0_ADCOMP0         (IO_AD0._ADCOMP0.ADCOMP.hword)

3 个答案:

答案 0 :(得分:0)

int input = ...;

switch(input)
case 0:
  MACRO0;
  break;

case 1:
  MACRO1;
  break;

  ...

case 46:
  MACRO46;
  break;

default:
  break;
}

答案 1 :(得分:0)

您写道:

Storelocation = &AD0_ADCOMP0 + offset
Storelocation = 0x000

这有点荒谬。由于您没有提供更完整的代码,我必须假设Storelocation被定义为__HWORD *。分配给它时,您需要分配指向的内容而不是指针本身:

*Storelocation = 0x000;

但是,根据您显示的示例代码,我必须假设这是针对某种类型的嵌入式CPU或微控制器,__HWORD是一个12位半字。您应该知道,通过指针进行的赋值可能无法正常工作,因为编译器可能不会像直接赋值给寄存器映射的__HWORD那样处理它。

答案 2 :(得分:0)

提升可以为您生成多个case

#include <boost/preprocessor/repetition/repeat.hpp>
#define DECL(z, n, _data) case n: AD0_ADCOMP ## n = 0x000; break;

...

int input = ...;

switch(input) {
    BOOST_PP_REPEAT(47, DECL,)
}

变成:

switch(input) {
case 0:
  AD0_ADCOMP0 = 0x000;
  break;

case 1:
  AD0_ADCOMP1 = 0x000;
  break;

...
case 46:
  AD0_ADCOMP46 = 0x000;
  break;

}