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

私の記憶が正しければ、そのコンパイラはかなり原始的であり、標準ライブラリを使用できないと思います。

すべてを自分で実装する必要がある場合は、関数ポインターの配列を使用できます。

#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 に答える