c - 如何用 C 语言实现包含 PIC 函数调用的堆栈

标签 c stack interrupt pic

我目前正在使用 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
}

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

最佳答案

如果我没记错的话,那么那个编译器相当原始,我认为你不能使用 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);
}

关于c - 如何用 C 语言实现包含 PIC 函数调用的堆栈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16172657/

相关文章:

c - 创建多个具有互斥锁和不同生命周期的线程

c++ - pcm_plug.c :67: snd_pcm_plug_close: Assertion `plug->gen.slave == plug->req_slave' failed

c - 从函数返回 char 指针的问题

c - 什么是 "Clang-Tidy: Function is within a recursive call chain"?如何解决?

c - 你如何测试你的中断处理模块?

linux - 为什么 softirq 用于高度线程化和高频使用?

c - 没有内存泄漏的堆栈的 Pop 实现

java - 如何获取特定缓冲图像的路径?

java - java中的栈是如何实现的?

compiler-construction - 系统调用如何工作?