0

我目前正在使用 MPLAB X(+ 编译器 XC8)用 C 语言编写 PIC

在我的代码中,我有一些中断(inter1、inter2、..),每个中断都由紧急和非紧急操作(urg1、urg2、..、n_urg1、n_urg2、..)组成。

所以我想要一个具有以下结构的代码:

stack s; // FIFO or other
main() {
   while (true) {
      if (!isEmpty(s)) {
         doNextFunction(s);
      }
   }
 }

void interrupt inter1() {
   urg1(); // urgent code
   addStack(n_urg1);
}

void n_urg1() {
   // non-urgent code
}

我怎样才能实现那种堆栈?标准库中有什么东西吗?

4

1 回答 1

1

如果我没记错的话,那么那个编译器相当原始,我认为你不能使用 std 库。

如果你需要自己实现它,你可以使用一个函数指针数组:

#include <string.h> // for memmove()

#define STACK_MAX   10

typedef enum
{
    Int,
    Boolean
} VariantType;

typedef struct
{
    VariantType type;
    union {
        int intValue;
        bool booleanValue;
    } value;
} Variant;

typedef bool (*FunctionPtr)(Variant data);

typedef struct
{
    FunctionPtr ptr;
    Variant var;
} FunctionCall;

FunctionCall functionStack[STACK_MAX];
int functionStackUse = 0;

bool addStack(FunctionPtr ptr, Variant var)
{
    if (functionStackUse >= STACK_MAX)
        return false; // stack full
    functionStack[functionStackUse].ptr = ptr;
    functionStack[functionStackUse].var = var;
    functionStackUse++;
    return true;
}

bool callNextFunction(void)
{
    // TODO: disable inter1
    if (functionStackUse > 0)
    {
        // get first function on stack
        FunctionCall functionCall = functionStack[0];
        functionStackUse--;
        // remove first function from stack
        memmove((void*)functionStack, (void*)(functionStack + 1), functionStackUse * sizeof(functionStack[0]));
        // TODO: re-enable inter1
        // call function with arguments
        return (*functionCall.ptr)(functionCall.var);
    }
    else
    {
        // TODO: re-enable inter1
        return false; // no more functions
    }
}

void main()
{
    while (1)
    {
        callNextFunction();
        // TODO add some delay otherwise you're constantly disabling inter1 (in doNextFunction)
    }
}


bool n_urg1(Variant var)
{
    if (var.type == Int)
    {
        int i = var.value.intValue;
        // do something
        return true;
    }
    return false;
}

void inter1(void)
{
    Variant var;
    var.type = Int;
    var.value.intValue = 45;
    addStack(n_urg1, var);
}
于 2013-04-23T15:32:08.020 回答