完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
问题:其他任务全部屏蔽,只有一个CAN初始化操作,在执行到中断注册时导致程序崩掉。
代码: int local_CAN_init(void) { //gpio_pad_select_gpioSelect pad as a gpio function from IOMUX //Time quantum double __tq; ESP_LOGW(TAG, "go into local_CAN_init"); CAN_cfg.speed = CAN_SPEED_125KBPS; CAN_cfg.tx_pin_id = 23; CAN_cfg.rx_pin_id = 22; //enable module DPORT_SET_PERI_REG_MASK(DPORT_PERIP_CLK_EN_REG, DPORT_CAN_CLK_EN); DPORT_CLEAR_PERI_REG_MASK(DPORT_PERIP_RST_EN_REG, DPORT_CAN_RST); //configure TX pin gpio_set_level(CAN_cfg.tx_pin_id, 1); gpio_set_direction(CAN_cfg.tx_pin_id,GPIO_MODE_OUTPUT); gpio_matrix_out(CAN_cfg.tx_pin_id,CAN_TX_IDX,0,0); gpio_pad_select_gpio(CAN_cfg.tx_pin_id); //configure RX pin gpio_set_direction(CAN_cfg.rx_pin_id,GPIO_MODE_INPUT); gpio_matrix_in(CAN_cfg.rx_pin_id,CAN_RX_IDX,0); gpio_pad_select_gpio(CAN_cfg.rx_pin_id); //set to PELICAN mode MODULE_CAN->CDR.B.CAN_M=0x1; //synchronization jump width is the same for all baud rates MODULE_CAN->BTR0.B.SJW =0x1; //TSEG2 is the same for all baud rates MODULE_CAN->BTR1.B.TSEG2 =0x1; //select time quantum and set TSEG1 switch(CAN_cfg.speed){ case CAN_SPEED_1000KBPS: MODULE_CAN->BTR1.B.TSEG1 =0x4; __tq = 0.125; break; case CAN_SPEED_800KBPS: MODULE_CAN->BTR1.B.TSEG1 =0x6; __tq = 0.125; break; default: MODULE_CAN->BTR1.B.TSEG1 =0xc; __tq = ((float)1000/CAN_cfg.speed) / 16; } //set baud rate prescaler MODULE_CAN->BTR0.B.BRP=(uint8_t)round((((APB_CLK_FREQ * __tq) / 2) - 1)/1000000)-1; /* Set sampling * 1 -> triple; the bus is sampled three times; recommended for low/medium speed buses (class A and B) where filtering spikes on the bus line is beneficial * 0 -> single; the bus is sampled once; recommended for high speed buses (SAE class C)*/ MODULE_CAN->BTR1.B.SAM =0x1; //enable all interrupts MODULE_CAN->IER.U = 0xff; //no acceptance filtering, as we want to fetch all messages MODULE_CAN->MBX_CTRL.ACC.CODE[0] = 0; MODULE_CAN->MBX_CTRL.ACC.CODE[1] = 0; MODULE_CAN->MBX_CTRL.ACC.CODE[2] = 0; MODULE_CAN->MBX_CTRL.ACC.CODE[3] = 0; MODULE_CAN->MBX_CTRL.ACC.MASK[0] = 0xff; MODULE_CAN->MBX_CTRL.ACC.MASK[1] = 0xff; MODULE_CAN->MBX_CTRL.ACC.MASK[2] = 0xff; MODULE_CAN->MBX_CTRL.ACC.MASK[3] = 0xff; //set to normal mode MODULE_CAN->OCR.B.OCMODE=__CAN_OC_NOM; //clear error counters MODULE_CAN->TXERR.U = 0; MODULE_CAN->RXERR.U = 0; (void)MODULE_CAN->ECC; //clear interrupt flags (void)MODULE_CAN->IR.U; ESP_LOGW(TAG, "go into esp_intr_alloc"); //install CAN ISR esp_err_t err = esp_intr_alloc(ETS_CAN_INTR_SOURCE,0,CAN_isr,NULL,NULL); ESP_LOGW(TAG, "Error (%s) local_CAN_init!", esp_err_to_name(err)); //Showtime. Release Reset Mode. MODULE_CAN->MOD.B.RM = 0; // printf("CAN_cfg.speed:%drn",CAN_cfg.speed); // printf("CAN_cfg.tx_pin_id:%drn",CAN_cfg.tx_pin_id); // printf("CAN_cfg.rx_pin_id:%drn",CAN_cfg.rx_pin_id); //xTaskCreate(can_rx_task, "can_rx_task", 2048 * 2, (void *)0, 4, NULL); ESP_LOGW(TAG, "go out local_CAN_init"); return 0; } 重启日志: fe80:0000:0000:0000:3694:54ff:fef5:55d8, type: ESP_IP6_ADDR_IS_LINK_LOCAL[0m every init -- end----------- [0;33mW (3081) ESP_CAN: go into local_CAN_init[0m [0;33mW (3081) ESP_CAN: go into esp_intr_alloc[0m abort() was called at PC 0x40082b13 on core 1 Backtrace:0x40087ff7:0x3ffb0cc0 0x400887c9:0x3ffb0ce0 0x4008f5be:0x3ffb0d00 0x40082b13:0x3ffb0d70 0x40082c5d:0x3ffb0da0 0x4013d6aa:0x3ffb0dc0 0x40132b9d:0x3ffb0df0 0x400d7d3a:0x3ffb0e10 0x40082939:0x3ffb0e30 0x4000bfed:0x3ffc8a80 0x4008beea:0x3ffc8a90 0x400dc7e7:0x3ffc8ab0 0x400dc849:0x3ffc8af0 0x400d804e:0x3ffc8b20 0x400d734c:0x3ffc8b40 0x4008bc81:0x3ffc8b70 |
|
相关推荐
1个回答
|
|
为了解决这个问题,我们可以按照以下步骤进行排查和处理:
1. **检查硬件连接**:首先确保CAN通信的硬件连接正确,包括CAN收发器、电源等。 2. **检查中断配置**:检查中断配置是否正确,包括中断号、中断优先级等。确保中断配置与硬件和软件要求一致。 3. **检查CAN初始化代码**:仔细检查CAN初始化代码,确保所有配置参数正确,例如波特率、模式等。您提供的代码片段中,CAN_cfg.speed被设置为CAN_SPEED_125KBPS,确保这是您所需的波特率。 4. **使用调试工具**:使用调试工具(如GDB)逐步执行代码,观察程序崩溃的确切位置。这有助于确定问题所在。 5. **检查堆栈溢出**:程序崩溃可能是由于堆栈溢出导致的。检查程序的堆栈大小是否足够,以及是否有递归调用或其他可能导致堆栈溢出的操作。 6. **检查内存泄漏**:程序崩溃可能是由于内存泄漏导致的。使用内存泄漏检测工具(如Valgrind)检查程序是否存在内存泄漏问题。 7. **更新驱动和库**:确保使用的CAN驱动和库是最新版本,以避免已知的bug或兼容性问题。 8. **查看错误日志**:查看程序崩溃时的错误日志,可能会提供一些关于问题原因的线索。 9. **简化代码**:尝试简化CAN初始化代码,逐步添加功能,以便确定导致崩溃的具体代码段。 |
|
|
|
只有小组成员才能发言,加入小组>>
457浏览 6评论
385浏览 5评论
有没有办法在不使用混杂模式的情况下实现Wifi驱动程序接收缓冲区访问中断呢?
366浏览 5评论
371浏览 4评论
344浏览 4评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-9-21 06:57 , Processed in 0.677003 second(s), Total 82, Slave 65 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号