找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 59|回复: 1
打印 上一主题 下一主题
收起左侧

keil封装lib库时,把函数指针做参数传到lib库的问题

[复制链接]
跳转到指定楼层
楼主
ID:726109 发表于 2024-10-18 10:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
keil封装lib库时,想把函数指针做参数传到lib库中,并在lib库中赋给另一个函数,使得在lib库中通用使用。下面是写的主要代码,不知道有什么问题?或者正确应该怎样做,请高手指点一下。

lib库中的函数接口和内容:
uint8_t(*SPIRead)(uint8_t addr);
void(*SPIWrite)(uint8_t addr,uint8_t Data);
uint16_t(*GetTimems)(void);

void FHSS_Init(uint8_t(*SPI_Read)(uint8_t),void(*SPI_Write)(uint8_t,uint8_t), uint16_t(*Get_Time_ms)())
{
SPIRead=SPI_Read;
SPIWrite=SPI_Write;
GetTimems=Get_Time_ms;
}

应用中调用代码:
/***********************************
**名字:SPI_Read
**功能:SPI读取
**入参:地址
**出参:数据
************************************/
uint8_t SPI_Read(uint8_t addr)
{
SPI_3_Write_Byte(addr|0x80);
return(SPI_3_Read_Byte());
}

/***********************************
**名字:Write_SPI
**功能:SPI写入
**入参:地址,数据
**出参:无
************************************/
void SPI_Write(uint8_t addr,uint8_t Data)
{
SPI_3_Write_Byte(addr&0x7F);
SPI_3_Write_Byte(Data);
CSB_H();
}

uint16_t Get_Time_ms(void)
{
return TimesCount;
}

FHSS_Init(SPI_Read,SPI_Write, Get_Time_ms);
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:404160 发表于 2024-10-18 15:16 | 只看该作者
为确保函数指针传递和使用没有问题:

函数指针的声明和使用: 在你的库函数 FHSS_Init 中,确保函数指针的声明和定义在库和应用代码中完全一致,特别是参数类型和返回类型必须匹配。

函数指针赋值: 在 FHSS_Init 中,赋值函数指针时,确保它们的类型正确匹配。如果库函数定义和传入的函数指针类型不匹配,可能会导致编译或运行时错误。

函数指针为空检查: 为了安全性,在函数指针赋值时可以增加空指针检查。避免传入空指针引发不可预知的行为。

优化: 如果库函数 FHSS_Init 需要长期调用 SPI 读写函数,你可以通过函数指针进行抽象,这样就可以更方便地调用不同的 SPI 实现。

改进后的 FHSS_Init 可能会如下所示:

c
复制代码
void FHSS_Init(uint8_t(*SPI_Read)(uint8_t), void(*SPI_Write)(uint8_t, uint8_t), uint16_t(*Get_Time_ms)(void)) {
    if (SPI_Read && SPI_Write && Get_Time_ms) {  // 确保传入函数指针有效
        SPIRead = SPI_Read;
        SPIWrite = SPI_Write;
        GetTimems = Get_Time_ms;
    } else {
        // 处理空指针的情况
    }
}
这种方式运行时更加稳定。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表