Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
PIN_GPIO通用驱动
[已解决]pin驱动设置回调函数出现问题
发布于 2020-01-28 18:28:20 浏览:1927
订阅该版
```c #define DW1000_IRQ 16 rt_pin_attach_irq(DW1000_IRQ, PIN_IRQ_MODE_RISING, func_dw1000_irq, RT_NULL); rt_pin_irq_enable(DW1000_IRQ, 1); ``` 其中func_dw1000_irq是我的中断回调函数,这样就出现问题了,烧到板子上debug时,可以一步一步根下去,能正常进入中断函数func_dw1000_irq里,但烧板子上直接运行跑不起来,点rtthread的logo都打印不出来,说明起码没执行到rtthread_startup函数里的rt_show_version这个地方,很是费解。 同时加上上面的attach和enable函数后调试会有一个现象和以往正常调试不同:正常时不加任何断点的情况下点调试,程序首次断在main函数开头,但加上上面两句后是断在这里 `LDR R0, =SystemInit` 而且要多次点击run按钮才会进入main函数,其后就可以正常单步运行了。 由于代码量比较大,就不贴出来了,需要哪些代码我再贴。
查看更多
6
个回答
默认排序
按发布时间排序
pedro
2020-01-29
这家伙很懒,什么也没写!
干了6个小时,还是自己解决了问题,这是官网论坛怎么就没人出来帮个忙说个话呢。 本人代码水平有限没有根本解决问题,只是找到了不出问题的办法。 先是把rtthread裁剪到最简态,然后在main里使用attach IRQ函数,还是出现上述问题,基于rtthread本身的稳定性我猜测是驱动调用出来问题,虽然官网上和网上一些帖子都是这么使用的,于是我打算用rt_device_control系统调用来实现,cmd参数用来指示是添加中断功能的,args指向构建好的struct rt_pin_irq_hdr结构,到pin里再解开该结构,调用下层的gpio接口即rt_pin_attach_irq和rt_pin_irq_enable。如此就可以正常跑起来了。 虽然没有查到根本问题所在(1M多的反汇编看起来真的头大),但起码问题不再了,只是改了下pin,下面贴出改动后的代码 ```c static rt_err_t _pin_control(rt_device_t dev, int cmd, void *args) { struct rt_device_pin_mode *mode; struct rt_device_pin *pin = (struct rt_device_pin *)dev; /* check parameters */ RT_ASSERT(pin != RT_NULL); mode = (struct rt_device_pin_mode *) args; if (mode == RT_NULL) return -RT_ERROR; if(cmd == PIN_IRQ_ENABLE) { struct rt_pin_irq_hdr* irq = (struct rt_pin_irq_hdr*)args; pin->ops->pin_attach_irq(dev, irq->pin, irq->mode, irq->hdr, irq->args); pin->ops->pin_irq_enable(dev, irq->pin, PIN_IRQ_ENABLE); } else { pin->ops->pin_mode(dev, (rt_base_t)mode->pin, (rt_base_t)mode->mode); } return 0; } ```
pedro
2020-01-29
这家伙很懒,什么也没写!
有哪位代码功底牛逼得大神找找原因贴上来呗,我把问题重现的方法也贴出来 rtthread裁剪最简后在main里添加 ```c struct rt_pin_irq_hdr irq_s; irq_s.hdr = func_dw1000_irq; ``` 其实任何地方添加这两句都会有问题, ```c void func_dw1000_irq(void *args) { printf("i'm in interrupt\n"); } ``` 回调函数里只有一个打印,这样问题就重现了。 有请各位大神
pedro
2020-01-29
这家伙很懒,什么也没写!
额,又进一步定位了问题,是回调函数里,习惯性的用了printf函数,正确的应该使用rt_kprintf函数打印,把printf换掉就没问题,但我功底差,想问一句为什么
aozima
2020-01-29
调网络不抓包,调I2C等时序不上逻辑分析仪,就像电工不用万用表!多用整理的好的文字,比截图更省流量,还能在整理过程中思考。
所以,最终问题在哪? 能直接发个补丁吗?没看懂。 因为最开始就使用了 printf 吗?改掉就好了? printf 只能在线程中使用,不能在中断里面使用。 rt_kprintf 可以在中断里面调用,直接打印。 所以中断里面打印请使用 rt_kprintf 前面的那堆改动其实没有实际作用吧?只是换了个位置,换了个方式。 把 printf 修改为 rt_kprintf 后,上面的修改再恢复回去也可以的吧?
pedro
2020-01-29
这家伙很懒,什么也没写!
>所以,最终问题在哪? 能直接发个补丁吗?没看懂。 对的,前面对_pin_control的修改只是换个了位置,换了个实现方式,不用直接操作驱动框架层的东西,根本原因是在中断中习惯性的用了printf,把printf换成rt_kprintf就OK了。 刚知道printf只能在线程中使用,再去官网看看资料去...
1050267770
2021-10-29
这家伙很懒,什么也没写!
我也遇到过在中断中使用printf出问题,水平有限,对其机制不太了解,但是这个坑确实记住了。 查网上说是因为printf是不可重入函数,中断中使用有风险。
撰写答案
登录
注册新账号
关注者
0
被浏览
1.9k
关于作者
pedro
这家伙很懒,什么也没写!
提问
9
回答
13
被采纳
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
EtherKit快速上手PROFINET
2
RTThread USB转串口无法接收数据
3
HC32F4A0 SD卡挂载及热插拔的实现
4
vscode插件 - RT-Thread Studio项目助手 | 跨平台开发
5
Console串口使用说明
热门标签
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
UART
WIZnet_W5500
ota在线升级
PWM
cubemx
flash
freemodbus
BSP
packages_软件包
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
编译报错
Debug
rt_mq_消息队列_msg_queue
SFUD
msh
keil_MDK
ulog
MicroPython
C++_cpp
本月问答贡献
出出啊
1517
个答案
342
次被采纳
小小李sunny
1444
个答案
290
次被采纳
张世争
812
个答案
177
次被采纳
crystal266
547
个答案
161
次被采纳
whj467467222
1222
个答案
148
次被采纳
本月文章贡献
出出啊
1
篇文章
2
次点赞
小小李sunny
1
篇文章
1
次点赞
张世争
1
篇文章
2
次点赞
crystal266
2
篇文章
2
次点赞
whj467467222
2
篇文章
2
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部