Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
GPIO
请教对结构体中函数指针赋值失败的问题
发布于 2019-06-20 23:31:58 浏览:2234
订阅该版
对照着官方例程试着写了一下gpio的驱动,但是过程中遇到了一个关于对结构体中指针函数赋值的问题,希望有大佬可以解惑。 对于结构体 struct pin_ops { rt_err_t (*a)(int m,int n); rt_err_t (*b)(int m,int n); }; 定义 struct pin_ops ops= { a, b }; struct pin_ops *ops_t; 对结构体对象ops_t赋值时 1)通过取ops的地址给ops_t赋值 ops_t=&ops; √ 此时可以通过ops_t来调用结构体中的函数,例如 ops_t->a(); √ ops_t->b(); √ 这里结构体中的函数是可以成功调用的。 2)对结构体中的函数指针逐个进行赋值 ops_t->a=ops->a; ops-t->b=ops->b; 此时不能通过ops_t来调用结构体中的函数,如下面操作都是错误的 ops_t->a(); × ops_t->b(); × 这里即使给ops_t分配了内存也不能成功调用函数,有大佬知道是什么原因吗? 在stm32中调用2)中的函数时会进入硬fault中的INVSTATE错误,查阅fault手册知道这个错误是因为内核试图转换为ARM模式导致的错误,请教这里为什么内核会试图转为ARM模式。
查看更多
9
个回答
默认排序
按发布时间排序
来一颗糖
2019-06-21
这家伙很懒,什么也没写!
[i=s] 本帖最后由 来一颗糖 于 2019-6-21 08:54 编辑 [/i] ops_t->a 不是地址指针。
还没想好
2019-06-21
这家伙很懒,什么也没写!
ops_t 是一个指针,用于保存一片内存的地址。不是 struct pin_ops 类型的结构体变量。
mrking
2019-06-21
这家伙很懒,什么也没写!
>ops_t->a 不是地址指针。 --- 为什么直接用一个函数可以直接对ops_t->a赋值 ops_t->a=fun;
mrking
2019-06-21
这家伙很懒,什么也没写!
>ops_t 是一个指针,用于保存一片内存的地址。不是 struct pin_ops 类型的结构体变量。 ... --- 那为什么给ops_t分配了内存之后还是不能用?
还没想好
2019-06-21
这家伙很懒,什么也没写!
>那为什么给ops_t分配了内存之后还是不能用? --- 你是怎么分配内存的?
mrking
2019-06-21
这家伙很懒,什么也没写!
>你是怎么分配内存的? --- 用 rt_malloc函数分配的,也是不行,一调用函数就进hard fault
还没想好
2019-06-21
这家伙很懒,什么也没写!
>用 rt_malloc函数分配的,也是不行,一调用函数就进hard fault --- 代码贴一下
来一颗糖
2019-06-21
这家伙很懒,什么也没写!
>为什么直接用一个函数可以直接对ops_t->a赋值 >ops_t->a=fun; --- 你那是 执行 fun 函数,然后函数返回值 赋给 ops_t->a 。
mrking
2019-06-21
这家伙很懒,什么也没写!
刚才用vs写了一下分配完内存是可以调用函数的,但是在单片机里是报错的,可能是编译器的问题吧 ``` #include
#include
using namespace std; struct pin_ops { int (*a)(int m, int n); int (*b)(int m, int n); }; int fun1(int m,int n) { cout <<"fun1"<<" m: "<< m <<" n: "<< n << endl; return m * n; } int fun2(int m, int n) { cout << "fun2" << " m: " << m << " n: " << n << endl; return m * n; } struct pin_ops ops = { fun1, fun2 }; struct pin_ops *ops_t; int main() { struct pin_ops *opsbuf=&ops; ops_t = (struct pin_ops *)malloc(sizeof(struct pin_ops)); //ops_t->a = fun1; //ops_t->b = fun2; //ops_t->a = opsbuf->a; //ops_t->b = opsbuf->b; ops_t = opsbuf;//上面的赋值方式均可以 cout << "fun1 retuen " << ops_t->a(1, 2) << endl; cout << "fun2 retuen " << ops_t->b(1, 2) << endl; return 0; } ```
撰写答案
登录
注册新账号
关注者
0
被浏览
2.2k
关于作者
mrking
这家伙很懒,什么也没写!
提问
4
回答
8
被采纳
0
关注TA
发私信
相关问题
1
drivers- pin
2
bsp 里面的drivers/gpio.c 少了一个功能
3
stm32f407移植RTT中gpio设备驱动问题
4
config PB4(NJTRST) to GPIO
5
RT-Thread的GPIO设备驱动问题
6
关于pin.c文件中语句可能出现的bug
7
RT-Thread学习笔记--线程创建与官方Pin设备驱动调用
8
【应用笔记】小白也能玩转RT-Thread之通用GPIO设备【官方出品
9
串口引脚定义中的GPIO_Pin_sources是社么意思?
10
RTT -GPIO 使用例程
推荐文章
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
简单两步配置RTT源码阅读环境 vsc+clangd
2
恩智浦[FRDM-MCXN947]初探 之 ADC与DAC
3
LVGL使用字库IC芯片显示中文
4
基于STM32H750和Rt-Thread的CANFD通信实现的记录(一)
5
freemodbus主机在freertos的适配,参考rtthread例程
热门标签
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
UART
ota在线升级
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
SFUD
msh
rt_mq_消息队列_msg_queue
keil_MDK
ulog
MicroPython
C++_cpp
本月问答贡献
出出啊
1517
个答案
342
次被采纳
小小李sunny
1443
个答案
289
次被采纳
张世争
805
个答案
174
次被采纳
crystal266
547
个答案
161
次被采纳
whj467467222
1222
个答案
148
次被采纳
本月文章贡献
出出啊
1
篇文章
4
次点赞
小小李sunny
1
篇文章
1
次点赞
张世争
1
篇文章
1
次点赞
crystal266
2
篇文章
2
次点赞
whj467467222
2
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部