如何基于循环迭代器选择函数
Posted
技术标签:
【中文标题】如何基于循环迭代器选择函数【英文标题】:How to Choose Function Based on Loop Iterator 【发布时间】:2019-12-25 12:46:01 【问题描述】:我在这里找到解决方案的部分问题可能是我不知道我所要求的正确术语。为此,请提前原谅。
对于微控制器,我有一个我希望同时启动的引脚列表。每个都有自己的 ISR,并为每个实例调用同一个类的成员,但使用 pin 号作为参数。
我正在尝试将阵列中的每个引脚附加到其相应的 ISR,但我想通过引脚的索引选择哪个 ISR。这是 Mailer Code™,可能无法编译,但我相信这足以理解:
#define PIN1 4
#define PIN2 9
#define PIN3 10
#define PIN4 8
#define PIN5 12
PinAct *pPinact; // Pointer to Counter class
static ICACHE_RAM_ATTR void HandleInterruptsStatic1(void)
pPinact->handleInterrupts(1);
static ICACHE_RAM_ATTR void HandleInterruptsStatic2(void)
pPinact->handleInterrupts(2);
static ICACHE_RAM_ATTR void HandleInterruptsStatic3(void)
pPinact->handleInterrupts(3);
static ICACHE_RAM_ATTR void HandleInterruptsStatic4(void)
pPinact->handleInterrupts(4);
static ICACHE_RAM_ATTR void HandleInterruptsStatic5(void)
pPinact->handleInterrupts(5);
class PinAct
public:
PinAct() ;
void handleInterrupts(int);
void PinAct::PinAct()
int actPins[] = PIN1, PIN2, PIN3, PIN4, PIN5;
for (int i = 0; i <= sizeof(actPins); i++)
pinMode(actPin[i], INPUT)
attachInterrupt(digitalPinToInterrupt(KEG1), HandleInterruptsStatic + i, FALLING);
void PinAct::handleInterrupts(int pin) // Bubble Interrupt handler
// Do something with pin
目标是真正让attachInterrupt(digitalPinToInterrupt(KEG1), HandleInterruptsStatic + i, FALLING);
工作,根据索引 i 选择哪个 ISR。
我需要就是否分配 ISR 做出其他决定,因此需要连接要分配的 ISR 名称。
【问题讨论】:
hm ...不确定我是否完全理解您的问题。部分可以用函数指针数组解决 这正是我要找的@DanielJour。我无法将评论标记为答案 - 但确实如此。 【参考方案1】:attachInterrupt(/* ... */, HandleInterruptsStatic + i, /* ... */);
// ^^^^^
为了根据一些整数索引i
选择你想在运行时调用的函数,你可以使用一个函数指针数组:
typedef void (*FunctionPointer_t)(void);
FunctionPointer_t functions[] =
HandleInterruptsStatic1,
HandleInterruptsStatic2,
// ...
;
// to use:
functions[i]();
【讨论】:
谢谢,丹尼尔。完美。以上是关于如何基于循环迭代器选择函数的主要内容,如果未能解决你的问题,请参考以下文章