Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
assert_断言
这个为什么会报错啊,一个RTT小白真的已经心累了
发布于 2025-03-10 02:27:13 浏览:131
订阅该版
```c \ | / - RT - Thread Operating System / | \ 4.1.1 build Mar 9 2025 23:39:05 2006 - 2022 Copyright by RT-Thread team (rt_object_g(rt_object_get_type(&event->parent.parent) == RT_Object_Class_Event) assertion failed at function:rt_event_send, line number:1 ``` 以上是报错信息,我怀疑问题出在以下代码上,但是不知道怎么修改,问题在哪里 ```c mian.c ALL_Init(); // 自动锁定定时器 unlock_timer = rt_timer_create("auto_lock", timer_callback, NULL, 5000, RT_TIMER_FLAG_ONE_SHOT); // 创建处理线程 rt_thread_t tid = rt_thread_create("fp_lock", mensuo_thread_entry, NULL, 2048, 9, 10); rt_thread_startup(tid); return 0; Lock.c #include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
//#include
#include
#define KEY_UP_NUM GET_PIN(C, 5) #define KEY_DOWN_NUM GET_PIN(C, 1) #define KEY_LEFT_NUM GET_PIN(C, 0) #define KEY_RIGHT_NUM GET_PIN(C, 4) #define AS60X_UART_NAME "uart2" #define AS60X_WAK_PIN GET_PIN(A, 1) #define EVENT_KEY_UP (1 << 0) #define EVENT_KEY_DOWN (1 << 1) #define EVENT_KEY_RIGHT (1 << 2) #define EVENT_FP_TOUCH (1 << 3) rt_uint16_t page_id = 0x02; rt_uint16_t mat_score = 0; extern sg90_cfg my_sg90_config; static struct rt_event key_event; // 按键事件 static rt_bool_t is_initialized = RT_FALSE; rt_timer_t unlock_timer; /* 上键中断处理 */ void key_up_handler(void *args) { rt_event_send(&key_event, EVENT_KEY_UP); } /* 下键中断处理 */ void key_down_handler(void *args) { rt_event_send(&key_event, EVENT_KEY_DOWN); } /* 右键中断处理 */ void key_right_handler(void *args) { rt_event_send(&key_event, EVENT_KEY_RIGHT); } void fp_touch_handler(void *args) { rt_event_send(&key_event, EVENT_FP_TOUCH); } void ALL_Init() { if (is_initialized) return; rt_err_t ret = rt_event_init(&key_event, "key_evt", RT_IPC_FLAG_FIFO); if (ret != RT_EOK) { LOG_E("Event init failed: %d", ret); return; } rt_pin_mode(KEY_UP_NUM, PIN_MODE_INPUT_PULLUP); rt_pin_mode(KEY_DOWN_NUM, PIN_MODE_INPUT_PULLUP); rt_pin_mode(KEY_LEFT_NUM, PIN_MODE_INPUT_PULLUP); rt_pin_mode(KEY_RIGHT_NUM, PIN_MODE_INPUT_PULLUP); rt_pin_mode(AS60X_WAK_PIN, PIN_MODE_INPUT_PULLUP); /* 绑定中断处理函数 */ rt_pin_attach_irq(KEY_UP_NUM, PIN_IRQ_MODE_FALLING, key_up_handler, RT_NULL); rt_pin_attach_irq(KEY_DOWN_NUM, PIN_IRQ_MODE_FALLING, key_down_handler, RT_NULL); rt_pin_attach_irq(KEY_RIGHT_NUM, PIN_IRQ_MODE_FALLING, key_right_handler, RT_NULL); rt_pin_attach_irq(AS60X_WAK_PIN, PIN_IRQ_MODE_RISING, fp_touch_handler, RT_NULL); /* 使能中断 */ rt_pin_irq_enable(KEY_UP_NUM, PIN_IRQ_ENABLE); rt_pin_irq_enable(KEY_DOWN_NUM, PIN_IRQ_ENABLE); rt_pin_irq_enable(KEY_RIGHT_NUM, PIN_IRQ_ENABLE); rt_pin_irq_enable(AS60X_WAK_PIN, PIN_IRQ_ENABLE); as60x_set_hand_shake_baud(57600); as60x_init(AS60X_UART_NAME); sg90_init(&my_sg90_config); /*// 自动锁定定时器 unlock_timer = rt_timer_create("auto_lock", timer_callback, NULL, 5000, RT_TIMER_FLAG_ONE_SHOT); // 创建处理线程 rt_thread_t tid = rt_thread_create("fp_lock", mensuo_thread_entry, NULL, 2048, 25, 10);*/ // rt_thread_startup(tid); is_initialized = RT_TRUE; } //按下按键,录入指纹 void UP_FINGER_STR() { rt_kprintf("Start fingerprint enrollment...\n"); rt_event_recv(&key_event, EVENT_FP_TOUCH, RT_EVENT_FLAG_OR, RT_WAITING_FOREVER, RT_NULL); as60x_ack_type_t ret1 = as60x_str_fp_to_flash(page_id); if (ret1 == AS60X_CMD_OK) { rt_kprintf("First press OK\n"); rt_kprintf("Place finger 2nd time\n"); rt_event_recv(&key_event, EVENT_FP_TOUCH, RT_EVENT_FLAG_OR, RT_WAITING_FOREVER, RT_NULL); as60x_ack_type_t ret2 = as60x_str_fp_to_flash(page_id); if (ret2 == AS60X_CMD_OK) { rt_kprintf("Enroll success!\n"); } } } void timer_callback(void *parameter) { lock(); rt_kprintf("Auto relock activated\n"); } rt_err_t verify_fingerprint(void) { // 调用指纹验证函数 as60x_ack_type_t ret = as60x_search_fp_in_flash(&page_id, &mat_score); /* rt_kprintf("Fingerprint verified! ID: %d\n", page_id); return RT_EOK;*/ if (ret == AS60X_CMD_OK) { rt_kprintf("Verify success! Score: %d\n", mat_score); return RT_EOK; } else { rt_kprintf("Verify failed! Code: 0x%04X\n", ret); return -RT_ERROR; } } //解锁,舵机转动90度 void jiesuo() { as60x_ack_type_t result = as60x_search_fp_in_flash(&page_id, &mat_score); rt_kprintf("Unlocking...\r\n"); if(result != AS60X_DAT_ERR) { sg90_set_angle(&my_sg90_config, 90.0); rt_kprintf("yi jie suo\r\n"); } } rt_err_t delete_fingerprint() { rt_kprintf("Now test delet the fingerprint..\r\n"); as60x_delet_fp_n_id(page_id, 1); return RT_EOK; } void lock() { sg90_set_angle(&my_sg90_config, 0.0); } /* 主处理线程 ------------------------------------------------------------*/ void mensuo_thread_entry(void *parameter) { rt_uint32_t recv; ALL_Init(); while (1) { if (rt_event_recv(&key_event, EVENT_KEY_UP | EVENT_KEY_DOWN | EVENT_KEY_RIGHT | EVENT_FP_TOUCH, RT_EVENT_FLAG_OR | RT_EVENT_FLAG_CLEAR, RT_WAITING_FOREVER, &recv) == RT_EOK) { if (recv & EVENT_KEY_UP) { UP_FINGER_STR(); // 录入到ID 1 } else if (recv & EVENT_KEY_RIGHT) { if (verify_fingerprint() == RT_EOK) { jiesuo(); rt_timer_start(unlock_timer); } } else if (recv & EVENT_KEY_DOWN) { delete_fingerprint(); // 删除ID. } } rt_thread_mdelay(10); } } ``` 如果有大佬看到了,麻烦回答一下,谢谢了
查看更多
聚散无由
9小时前
jswyll
假设指纹模块和舵机控制的代码没有问题,这段代码应该不会引发rt_event_send的断言。 建议试试: - 把调用as60x和sg90的地方注释掉,换成打印来模拟,我试了一下是可以正常模拟这块功能的。 - 检查其它地方rt_event_send的问题,有没有在初始化之前就调用了rt_event_send的? - 可能是别的地方内存溢出、指针用法不当等等原因破坏的?尝试屏蔽你其它地方的代码,排除其它地方的问题。 - 指纹模块和舵机控制的代码有没有可能有问题? --- 这块代码虽然不会引发提问的问题,但是: 1. 为什么多次调用ALL_Init然后用is_initialized去重?建议只调用一次ALL_Init,并且去除is_initialized的逻辑。 2. 为什么初始化AS60X_WAK_PIN用上拉,设置中断触发模式却用上升沿? 3. UP_FINGER_STR函数接收key_event事件后两处都没清除,不能实现放两次手指才录入。是不是应该去除mensuo_thread_entry的EVENT_FP_TOUCH,并且在UP_FINGER_STR添加清除标志? ```c void UP_FINGER_STR() { rt_kprintf("Start fingerprint enrollment...\n"); rt_event_recv(&key_event, EVENT_FP_TOUCH, RT_EVENT_FLAG_OR | RT_EVENT_FLAG_CLEAR, RT_WAITING_FOREVER, RT_NULL); // ... rt_kprintf("Place finger 2nd time\n"); rt_event_recv(&key_event, EVENT_FP_TOUCH, RT_EVENT_FLAG_OR | RT_EVENT_FLAG_CLEAR, RT_WAITING_FOREVER, RT_NULL); // ... } void mensuo_thread_entry(void *parameter) { rt_uint32_t recv; ALL_Init(); while (1) { if (rt_event_recv(&key_event, EVENT_KEY_UP | EVENT_KEY_DOWN | EVENT_KEY_RIGHT, RT_EVENT_FLAG_OR | RT_EVENT_FLAG_CLEAR, RT_WAITING_FOREVER, &recv) == RT_EOK) { // ... } } } ```
3
个回答
默认排序
按发布时间排序
张世争
11小时前
学以致用
代码看起来有几处是重复初始化的吗? `ALL_Init` 到底在哪里初始化? `unlock_timer` 有两处创建? 先确认 event 初始化的次序问题,也就是需要先初始化后再使用。如果初始化靠后,中断先到来,直接发送未初始化的事件,就会报错
踩姑娘的小蘑菇
12小时前
这家伙很懒,什么也没写!
 先把代码格式调一下
撰写答案
登录
注册新账号
关注者
0
被浏览
131
关于作者
zqdkxj
这家伙很懒,什么也没写!
提问
1
回答
0
被采纳
0
关注TA
发私信
相关问题
1
rt_object_init中报assertion failed错误?
2
串口中断读取信号量释放函数断言失败问题
3
请问在新建工程并且添加MAX30102的组件之后编译下载怎么为什么会报这种错呢
4
运行 tls_test 出现错误,这个是什么原因
5
使用ringbuffer时,自检到thread的type不匹配
6
webnet cgi 回调 出现assert
7
keil里面移植RT系统之后,上电直接assertation
8
使用max30102软件包时出现线程断言错误
9
进入到assert后,软看门狗仍在喂狗的问题
10
shall not be used in ISR
推荐文章
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
ART-PI2 上手记录(一)
2
【基于HPM6750+RW007的网页服务器】---rw007软件包添加
3
【FRDM-MCXA156 评测】RW007
4
RT-Thread内核:调度算法、性能优化与架构对比
5
usb host读取u盘偶尔才能加载成功,读写失败的问题
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
rt-smart
FAL
I2C_IIC
ESP8266
UART
cubemx
WIZnet_W5500
ota在线升级
PWM
BSP
flash
freemodbus
packages_软件包
潘多拉开发板_Pandora
ADC
定时器
GD32
flashDB
编译报错
socket
中断
Debug
rt_mq_消息队列_msg_queue
msh
keil_MDK
ulog
SFUD
C++_cpp
MicroPython
本月问答贡献
出出啊
1521
个答案
343
次被采纳
小小李sunny
1444
个答案
290
次被采纳
张世争
814
个答案
179
次被采纳
crystal266
554
个答案
162
次被采纳
whj467467222
1222
个答案
149
次被采纳
本月文章贡献
出出啊
1
篇文章
2
次点赞
小小李sunny
1
篇文章
1
次点赞
张世争
1
篇文章
3
次点赞
crystal266
2
篇文章
1
次点赞
whj467467222
2
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部