gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 15:49:37 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com