Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
PIN_GPIO通用驱动
AT32F437-START开发板采用RT-Thread5.0.0版本,发现PIN设备驱动操作方法与实现函数参数不匹配的问题?
发布于 2023-03-01 14:04:33 浏览:424
订阅该版
[tocm] #### 问题简述 下载2023-3-1日github仓库master分支的版本,在AT32F437-START开发板上使用IAR编译project工程会报“结构体类型不匹配的问题”,定位原因到drv_gpio.c与pin.h文件中。 #### 详细说明 下载github仓库上master最新分支,时间为2023年3月1日09:53。 ![screenshot_图片.png](https://oss-club.rt-thread.org/uploads/20230301/6f10675e9f7ac59fc7fc8e809962fefa.png.webp) ![screenshot_图片.png](https://oss-club.rt-thread.org/uploads/20230301/6f10675e9f7ac59fc7fc8e809962fefa.png.webp) 使用`scons --dist`生成工程,在env工具中设置好IAR和MDK5的路径,只开启了内核+shell+pin,如下图所示。设置好template工程的参数后,编译project工程。 ![screenshot_图片.png](https://oss-club.rt-thread.org/uploads/20230301/fafe9bd18186a0cba2ed431059ebcda2.png.webp) ![screenshot_图片.png](https://oss-club.rt-thread.org/uploads/20230301/62a99255ead17c5aae2e51a29f5de706.png) ![screenshot_图片.png](https://oss-club.rt-thread.org/uploads/20230301/16297520d6c676c84eca8159b7bd9231.png.webp) 产生如下报错。 ```Plain Error[Pe144]: a value of type "void (*)(rt_device_t, rt_base_t, rt_base_t)" cannot be used to initialize an entity of type "void (*)(struct rt_device *, rt_base_t, uint8_t)" C:\Users\JinHuan\Desktop\dist\project\libraries\rt_drivers\drv_gpio.c 482 ``` ![screenshot_图片.png](https://oss-club.rt-thread.org/uploads/20230301/322a4dc31480e4d36fac71abdd8a530a.png.webp) #### 问题定位 报错位于drv_gpio.c文件中,代码部分为: ```C const static struct rt_pin_ops _at32_pin_ops = { at32_pin_mode, at32_pin_write, at32_pin_read, at32_pin_attach_irq, at32_pin_dettach_irq, at32_pin_irq_enable, at32_pin_get, }; ``` 查看pin.h文件中`struct rt_pin_ops` 原型: ```C struct rt_pin_ops { void (*pin_mode)(struct rt_device *device, rt_base_t pin, rt_uint8_t mode); void (*pin_write)(struct rt_device *device, rt_base_t pin, rt_uint8_t value); rt_int8_t (*pin_read)(struct rt_device *device, rt_base_t pin); rt_err_t (*pin_attach_irq)(struct rt_device *device, rt_base_t pin, rt_uint8_t mode, void (*hdr)(void *args), void *args); rt_err_t (*pin_detach_irq)(struct rt_device *device, rt_base_t pin); rt_err_t (*pin_irq_enable)(struct rt_device *device, rt_base_t pin, rt_uint8_t enabled); rt_base_t (*pin_get)(const char *name); }; ``` 查看drv_gpio.c文件,上述操作方法中的实现函数原型如下: ```C static void at32_pin_mode(rt_device_t dev, rt_base_t pin, rt_base_t mode) static void at32_pin_write(rt_device_t dev, rt_base_t pin, rt_base_t value) static int at32_pin_read(rt_device_t dev, rt_base_t pin) static rt_err_t at32_pin_attach_irq(struct rt_device *device, rt_int32_t pin, rt_uint32_t mode, void (*hdr)(void *args), void *args) static rt_err_t at32_pin_dettach_irq(struct rt_device *device, rt_int32_t pin) static rt_err_t at32_pin_irq_enable(struct rt_device *device, rt_base_t pin, rt_uint32_t enabled) static rt_base_t at32_pin_get(const char *name) ``` 可以看到有以下不匹配的地方: 2. `at32_pin_mode`其中的`mode`参数类型不一致,一个是`rt_uint8_t` ,一个是`rt_base_t`。 3. `at32_pin_write`其中的`value`参数类型不一致,一个是`rt_uint8_t` ,一个是`rt_base_t`。 4. `at32_pin_read`返回值不一样,一个是`rt_int8_t`,一个是`int`。 5. `at32_pin_attach_irq` 其中的`pin`参数类型不一致,一个是`rt_base_t`,一个是`rt_int32_t`。其中的`mode`参数类型不一样,一个是`rt_uint8_t` ,一个是`rt_uint32_t` 。 6. `at32_pin_dettach_irq`其中的`pin`参数类型不一样,一个是`rt_base_t`,一个是`rt_uint32_t` 。 7. `at32_pin_irq_enable`其中的`enabled参数`类型不一样,一个是`rt_uint8_t` ,一个是`rt_uint32_t` 。 rt_def.h文件中有关RT-Thread变量类型定义如下: ```C /* RT-Thread basic data type definitions */ typedef int rt_bool_t; /**< boolean type */ typedef signed long rt_base_t; /**< Nbit CPU related date type */ typedef unsigned long rt_ubase_t; /**< Nbit unsigned CPU related data type */ typedef signed char rt_int8_t; /**< 8bit integer type */ typedef signed short rt_int16_t; /**< 16bit integer type */ typedef signed int rt_int32_t; /**< 32bit integer type */ typedef unsigned char rt_uint8_t; /**< 8bit unsigned integer type */ typedef unsigned short rt_uint16_t; /**< 16bit unsigned integer type */ typedef unsigned int rt_uint32_t; /**< 32bit unsigned integer type */ ``` #### 问题解决 目前把drv_gpio.c中下列函数的形参或返回值修改为跟`rt_pin_ops`操作方法中的成员形参与返回值一致。重新修改之后的drv_gpio.c中函数原型如下: ```C static void at32_pin_mode(rt_device_t dev, rt_base_t pin, rt_uint8_t mode) static void at32_pin_write(rt_device_t dev, rt_base_t pin, rt_uint8_t value) static rt_int8_t at32_pin_read(rt_device_t dev, rt_base_t pin) static rt_err_t at32_pin_attach_irq(struct rt_device *device, rt_base_t pin, rt_uint8_t mode, void (*hdr)(void *args), void *args) static rt_err_t at32_pin_dettach_irq(struct rt_device *device, rt_base_t pin) static rt_err_t at32_pin_irq_enable(struct rt_device *device, rt_base_t pin, rt_uint8_t enabled) static rt_base_t at32_pin_get(const char *name) ``` #### 工程源码 project_0为未修改的工程,project_1为修改drv_gpio.c中相关函数类型的工程。 - [project_0.7z](https://club.rt-thread.org/file_download/b19564e53172970d) - [project_1.7z](https://club.rt-thread.org/file_download/08df2d5f2ef79e01)
查看更多
0
个回答
默认排序
按发布时间排序
暂无答案,快来添加答案吧
撰写答案
登录
注册新账号
关注者
0
被浏览
424
关于作者
JinHuan
这家伙很懒,什么也没写!
提问
1
回答
0
被采纳
0
关注TA
发私信
相关问题
1
PIN绑定引脚中断回调函数没有反应
2
rtthread PIN设备
3
关于引脚宏定义的一些疑惑
4
关于gpio引脚实在不懂了,求大家帮助
5
GET_PIN(A, 1) 提示 'A' 未定义
6
关于4.0.2版本中STM32的PIN设备外部中断的相关问题
7
自己按照官方手册 在drv_gpio.c里面找不到PIN脚信息
8
关于多个PIN设备同时读写的问题
9
翻车在一个GPIO上 开启pin中断 导致程序卡死
10
外部中断回调函数执行问题
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
使用百度AI助手辅助编写一个rt-thread下的ONVIF设备发现功能的功能代码
2
RT-Thread 发布 EtherKit开源以太网硬件!
3
rt-thread使用cherryusb实现虚拟串口
4
《C++20 图形界面程序:速度与渲染效率的双重优化秘籍》
5
《原子操作:程序世界里的“最小魔法单位”解析》
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
WIZnet_W5500
ota在线升级
UART
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
msh
SFUD
keil_MDK
rt_mq_消息队列_msg_queue
at_device
ulog
C++_cpp
本月问答贡献
踩姑娘的小蘑菇
7
个答案
3
次被采纳
a1012112796
13
个答案
2
次被采纳
张世争
9
个答案
2
次被采纳
rv666
5
个答案
2
次被采纳
用户名由3_15位
11
个答案
1
次被采纳
本月文章贡献
程序员阿伟
7
篇文章
2
次点赞
hhart
3
篇文章
4
次点赞
大龄码农
1
篇文章
2
次点赞
ThinkCode
1
篇文章
1
次点赞
Betrayer
1
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部