Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
全志_F1C100S
touch_屏幕触摸
使用touch设备出现异常
发布于 2021-01-24 02:38:53 浏览:1528
订阅该版
我在上一个提问中说觉得我自己的工程似乎出现异常,一直存在奇怪的问题,但是似乎没人相信,让我拆分问题解决,可是我也是一个个认真排查过去,一段一段的注释代码,但问题实在是太奇怪了,否则我也不会发出工程有异常的质疑。正好我最新重建的工程又出现奇怪的问题,于是求助各位一下。 #软硬件环境 我使用的soc是全志的f1c100s,arm9内核,使用的板子是荔枝派nano,用bsp文件夹下的allwinner_tina进行开发,ide是vscode,使用scons编译,rtthread版本为4.0.3 #问题 我注册了一个touch设备,在使用rt_device_find找到设备地址并且判断他不为空的情况下,调用rt_device_set_rx_indicate(touch_dev, touch_callback)来注册我的接受回调,程序百分百卡死或者进入undefined instruction的异常中断。 ###注册touch设备部分代码 ```c rt_err_t rt_hw_gt9147_init(char *dev_name, char *bus_name, rt_uint16_t irq_pin, rt_uint16_t rst_pin) { struct touch_config_user_data *user_data = RT_NULL; rt_touch_t touch_dev = RT_NULL; user_data = (struct touch_config_user_data *)rt_malloc(sizeof(struct touch_config_user_data)); if(user_data == RT_NULL) { LOG_E("Request failed"); goto error; } user_data->i2c_client.bus = (struct rt_i2c_bus_device *)rt_device_find(bus_name); if(user_data->i2c_client.bus == RT_NULL) { LOG_E("Cannot find bus, name: %s", bus_name); goto error; } user_data->i2c_client.client_addr = GT9147_DEVICE_ADDR; touch_dev = (rt_touch_t)rt_malloc(sizeof(struct rt_touch_device)); if(touch_dev == RT_NULL) { LOG_E("Request failed"); goto error; } touch_dev->config.user_data = user_data; touch_dev->config.dev_name = bus_name; touch_dev->config.irq_pin.pin = irq_pin; touch_dev->config.irq_pin.mode = PIN_MODE_INPUT_PULLDOWN; touch_dev->ops = &touch_ops; if(touch_get_info(touch_dev) != RT_EOK) { LOG_E("Can not get gt9147 information"); goto error; } rt_pin_write(rst_pin, PIN_LOW); rt_pin_mode(rst_pin, PIN_MODE_OUTPUT); //Write irq pin low to select address 0xBA rt_pin_write(irq_pin, PIN_LOW); rt_pin_mode(irq_pin, PIN_MODE_OUTPUT); rt_thread_mdelay(15);//> 10ms + 100us rt_pin_write(rst_pin, PIN_HIGH); rt_thread_mdelay(100);//> 5ms + 50ms rt_pin_mode(irq_pin, PIN_MODE_INPUT); rt_thread_mdelay(100); if(drv_gt9147_init(touch_dev) != RT_EOK) { LOG_E("GT9147 init failed"); goto error; } if(rt_hw_touch_register(touch_dev, dev_name, RT_DEVICE_FLAG_INT_RX, RT_NULL) != RT_EOK) { LOG_E("Register touch device failed,name=%s", dev_name); goto error; } LOG_I("Touch device register successful"); return RT_EOK; error: rt_free(user_data); rt_free(touch_dev); return RT_ERROR; } int rt_hw_touch_init(void) { return rt_hw_gt9147_init("touch", "i2c0", 40, 39); } INIT_ENV_EXPORT(rt_hw_touch_init); ``` ###出错部分代码 ```c static rt_err_t touch_callback(rt_device_t dev, rt_size_t size) { // rt_kprintf("irq\n"); return RT_EOK; } static int app_touch_init(void) { touch_dev = rt_device_find("touch"); if (touch_dev == RT_NULL) { LOG_E("Cannot find touch device"); return RT_ERROR; } if (rt_device_open(touch_dev, RT_DEVICE_FLAG_INT_RX) != RT_EOK) { LOG_E("Open touch device failed!"); return RT_ERROR; } rt_kprintf("add:%#x\n", &touch_dev->rx_indicate); rt_device_set_rx_indicate(touch_dev, touch_callback);//程序运行到rt_device_set_rx_indicate(),控制台卡死或者提示进入undefined instruction的异常中断 return RT_EOK; } ``` ###控制台输出信息 ![image.png](https://oss-club.rt-thread.org/uploads/20210124/226c6850b48c1ae6e242fb0f4509997e.png) 控制台卡死,后面信息没有输出,也不再响应命令 ![image.png](https://oss-club.rt-thread.org/uploads/20210124/c65d60a258fd8a73010d300d8a1b9d59.png) 提示进入异常中断,可以确定的是我的i2c通讯正常,gt9147也能获取到信息,并且最终注册也是成功的。 #做过的尝试 我察觉到了事情的不对劲,于是我一段一段的注释代码,逐步缩小范围,最后发现,只要对touch_dev->rx_indicate赋非0值就会报错,于是我断开irq引脚,并且注释掉touch.c中的中断处理函数对这个接受函数的调用,仍然卡死,然后我打印了一下我注册时的touch设备地址,以及通过rt_device_find获得的地址,发现地址一样没有问题,都是0x8021304c,然后我尝试对这个设备结构体的其他成员,比如tx_complete赋值,不会出现异常,只有刚好对rx_indicate赋值才会出现异常,但是我都已经对这个接受函数被调用的地方都注释掉了。之后我又怀疑是不是mmu导致的,于是失能掉mmu,和cache,但并没有用。又尝试修改优化等级,没有用。使用scons -c清楚执行文件,重新生成bin文件,仍然没有用,到这里,我感觉这个程序我已经调不下去了,完全不能信任这个工程的任何东西,于是我把lcd,pwm,i2c之类的外设统统关闭,touch设备注册也不初始化芯片,就只注册个空设备,cpu降频,修改main栈大小,仍然卡死,到这里我就完全绝望了。
查看更多
iamyhw
2021-01-24
这家伙很懒,什么也没写!
我使用的ilitek的触摸屏,不过我没有用rx的回调接口,是在中断管脚收到中断后,设置一个标志,然后再一个循环中根据标志去读触摸屏。 由于处理方式不一样,可能帮不上你。 建议先将lvgl关闭,单独调试touch.等通了再一个个的开启其它应用。 你的代码写的很好。
3
个回答
默认排序
按发布时间排序
salalei
2021-01-24
这家伙很懒,什么也没写!
问题我自己解决了,是个比较低级的错误(汗),特此记录一下,以免再犯。 ##问题: 在注册好touch设备后,使用rt_device_set_rx_indicate注册我的接受回调函数时出现卡死或者进入异常中断。 ##解决办法: 使用动态堆注册touch设备,需要使用将申请的touch_dev->irq_handle = RT_NULL或者干脆使用rt_memset全部清空 ##原因: 在touch.c中有这么一个中断函数, static void irq_callback(void *args) { rt_touch_t touch; touch = (rt_touch_t)args; if (touch->parent.rx_indicate == RT_NULL) { return; } if (touch->irq_handle != RT_NULL) { touch->irq_handle(touch); } touch->parent.rx_indicate(&touch->parent, 1); } 如果不将touch_dev->irq_handle清空,很显然会访问非法地址,之前不调用rt_device_set_rx_indicate就不会错误,是因为判断rx_indicate为空直接就返回了,而最重要的使用rt_device_open打开touch设备,就会直接开启外部中断,所以会出现还没调用rt_device_control(touch_dev, RT_TOUCH_CTRL_ENABLE_INT, RT_NULL)就进入中断的情况,太坑了。 好在算是找到问题了,之前以为工程bug差点放弃了,不能在线仿真,没有像keil一样的ide,调试确实太难了。
RiceChen
认证专家
2021-01-26
内核/软件架构/开源
建议以后有类似的问题,大部分软件包都实例代码,可以先从实例代码确定是否有问题。
撰写答案
登录
注册新账号
关注者
0
被浏览
1.5k
关于作者
salalei
这家伙很懒,什么也没写!
提问
3
回答
2
被采纳
0
关注TA
发私信
相关问题
1
荔枝派nano如何从spiflash启动rt-thread
2
全志的F1C100S有没有支持USB
3
lv7_rtthread_f1c100s编译问题
4
f1c100s 运行时提示错
5
f1c100s调试出现各种莫名其妙的问题
6
F1C100S 串口读取除了uart_getc 还有其他方法码
7
有大佬分享一下F1C100S上跑RT-Thread的详细一点的教程吗?
8
f1c100s_tina项目添加lvgl软件包一直编译错误
9
F1C100S LittleVgl+RTT增加了触摸驱动
10
env中 使用scans命令报错
推荐文章
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
UART
WIZnet_W5500
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
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部