编辑:我只是使用案例陈述,我不知道是否有更简单的方法来做这件事
好的,所以我想调用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)
答案 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;
}