gpt4 book ai didi

c - 如何用 C 语言为 PIC24 编写与硬件无关的函数

转载 作者:行者123 更新时间:2023-12-02 05:35:07 28 4
gpt4 key购买 nike

我正在编写一些实现各种功能的代码,例如 PID Controller 、信号发生器等。

我的硬件提供各种输入和输出。刚才我有一大堆 SWITCH 语句来确定我的计算源和目标。

例如,对于 PID Controller ,每 100 毫秒有一个开关命令决定将哪个输入传递给 pid_calculate 函数,然后是另一个开关来决定如何处理返回值。由于我有 32 个模拟输入,以及 can、lin 和 serial 作为可能的输入,switch 语句非常庞大!

我想引用一个物理示例,说明如何将某些东西编码为独立于硬件(在图片的范围内)的功能。我确信答案在于指针,但我是 C 的新手,不太确定从哪里开始使用指针。

我设想函数原型(prototype)是这样的 int pid_init(*源,*目标)其中,源是指向输入的指针,例如 ADC 缓冲区,目标可以是 pwm 占空比寄存器。刚才我必须切换每个可能的条件,然后将数据加载到寄存器中。

所以澄清一下,我将如何实现一个允许它独立于输入和输出的函数,以及我将如何取消对指针的引用(假设指针是执行此操作的正确方法)

我希望这是有道理的,提前致谢。

最佳答案

只要您稍加注意,您就可以在 C 中实现一种面向对象的编程。在我完成它的方式中,我使用了函数指针以及以函数指针作为成员的结构。

例如要有一种数据独立性,你可能有一个像quick sort (qsort) function这样的函数。为 data long 提供了一个指向对数据进行操作的函数的指针。通常,使用这种方法,您最终会使用各种类型的 void 指针,以允许使用指向任何数据类型的指针。

我使用的另一种方法是为各种类型的设备支持的常见操作创建一个抽象接口(interface),然后创建一个结构,为这些操作提供函数指针模板。然后,我将创建一个包含这些结构的数组,并通过使用指向为特定设备实现该操作的特定函数的函数指针来填充数组元素。

例如,这个非常简单的示例就是我用来为多种不同设备提供标准接口(interface)的示例。该接口(interface)通过提供标准接口(interface)来隐藏设备差异。

// I create a struct that specifies what the function
// interface looks like for each of these operations for the
// devices that we are supporting.
typedef struct {
int (*pInput)(int iValue);
char *(*pName) (void);
int (*pDance) (int iTune, char *aszName);
} HardwareInterface;

// next I provide the function prototypes for the various devices.
// we have two different devices, Device_01 and Device_02 which
// have a common set of operations with the same interface.
int Device_01_Input (int iValue);
char *Device_01_Name (void);
int Device_01_Dance (int iTune, char *aszName);

int Device_02_Input (int iValue);
char *Device_02_Name (void);
int Device_02_Dance (int iTune, char *aszName);

// now I define my array of the device operation interfaces.
// this is where I provide the link between a specific operation
// on a specific device. I will number my devices beginning with
// zero to the number of devices supported minus one.
HardwareInterface HardwareList [] = {
{Device_01_Input, Device_01_Name, Device_01_Dance},
{Device_02_Input, Device_02_Name, Device_02_Dance},
};

此时我可以调用一个函数来获取我实际想要使用的设备。此函数返回硬件列表的索引。所以它可能会像这样。

int DeviceStdInput (int iValue)
{
int i = GetDeviceType ();
return HardwareList[i].pInput (iValue);
}

或者我可能会使用句柄方法,这样我就可以调用一个函数,该函数为传递给该函数的某些描述中指定的设备提供句柄。然后对我的标准接口(interface)的任何调用都将指定句柄。在下面,句柄只是不同设备数组的索引。

{
int iHandle = GetDeviceHandle ("Device_01");
int iXvalue = DeviceStdInput (iHandle, iValue);
}

DeviceStdInput() 函数看起来像这样:

int DeviceStdInput (int iHandle, int iValue)
{
return HardwareList[iHandle].pInput (iValue);
}

您仍然需要实现用于每个设备的实际功能,但是这提供了一种方法,可以为具有通用操作的多个设备提供标准接口(interface),然后您可以在其余代码中使用标准接口(interface)。

我用它来为输出提供标准接口(interface),其中输出设备是文件、打印机和 Web 服务。实际的接收器或输出设备由用户选择。使用接口(interface)的代码没有改变。只要界面不变,添加更多设备非常容易。在某些情况下,我会拥有不支持特定操作的设备,并且该函数会在不执行任何操作的情况下直接返回。

关于c - 如何用 C 语言为 PIC24 编写与硬件无关的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11821115/

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