完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
最近在做一个项目.
整个任务是1.5ms的大循环,其中分成6个250us的小任务. 有几个小任务里面用到了几个float运算. 然后1.5ms大循环循环了1s之后,由串口中断发送一次系统时间. 现在发现的问题是: 每次只要用 串口中断发送这一条信息,就必然导致 浮点运算的值出错,全部变成了 1.#QNAN. 出错后,由于没有错误检测,程序其他的部分仍然正常运行,浮点相关部分就都没用了. 改成用阻塞式发送的话,不会出现浮点出错的问题,但是阻塞式发送,需要耗时1.48ms.这样的话,系统的大循环时间就变成差不多两倍了. 不知道这是哪方面的问题,求助~ |
|
相关推荐
41个回答
|
|
|
优化级别?是否在中断中使用FLOAT变量?如果使用,注意变量定义加上volaitile 修饰符
|
|
|
|
|
|
没有开优化. 中断内没有float变量. |
|
|
|
|
|
|
|
|
|
|
|
是不是重入问题
|
|
|
|
|
|
关注一下这个问题
|
|
|
|
|
|
|
|
|
串口波特率设置的是115200. 大概100us进入一次中断. 之前没有浮点运算任务的时候不会出问题. |
|
|
|
|
|
用DMA发送吧
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
哦,这样,一次发送十几个字节,确实也可以算得上是比较频繁了. 用DMA试试了.. DMA,貌似很复杂的.. |
|
|
|
|
|
贴个代码,大家看看吧。都分析学习一下。
|
|
|
|
|
|
修改成DMA之后,确实没有再出现#1.QNAN问题. 原本以为MCU会非常勤劳的切换,现在看,也有累趴下的时候。。 |
|
|
|
|
|
坑又来了,开了DMA之后,发数据正常了,之前的用USART_CR1_RXNEIE的接收数据中断没响应了.
|
|
|
|
|
|
|
|
|
|
|
|
是我错怪051K8了.刚才串口接线RX端口掉下来了.线没接好自然无法使用.
|
|
|
|
|
|
下面贴程序了.
unsigned char g_o_buf_0[UART1_O_BUF_SIZE]; void Uart::init_UART1(void){ SET_BIT(RCC->APB2ENR,RCC_APB2ENR_USART1EN); SET_BIT(RCC->AHBENR,RCC_AHBENR_GPIOAEN); GPIOA->AFR[1]|=(1<<4)|(1<<8); GPIOA->PUPDR|=GPIO_PUPDR_PUPDR9_0|GPIO_PUPDR_PUPDR10_0; GPIOA->OSPEEDR|=GPIO_OSPEEDR_OSPEEDR9|GPIO_OSPEEDR_OSPEEDR10; GPIOA->MODER|=GPIO_MODER_MODER9_1|GPIO_MODER_MODER10_1; USART1->BRR=F_CPU/UART1_BAUDRATE; NVIC_EnableIRQ(USART1_IRQn); SET_BIT(USART1->CR1,USART_CR1_RE|USART_CR1_TE|USART_CR1_RXNEIE|USART_CR1_UE); Dma::config(DMA1_Channel2,(unsigned long)&USART1->TDR,(unsigned long)g_o_buf_0); } extern "C"{ void DMA1_Channel2_3_IRQHandler(void){ while(CHK_BIT(USART1->ISR,USART_ISR_TC)); SET_BIT(DMA1->IFCR,DMA_IFCR_CGIF2); CLR_BIT(DMA1_Channel2->CCR,DMA_CCR_EN); CLR_BIT(USART1->CR3,USART_CR3_DMAT); } } void Dma::config( DMA_Channel_TypeDef *dma_chx, unsigned long periphera_address, unsigned long memory_address ){ SET_BIT(RCC->AHBENR,RCC_AHBENR_DMAEN); Timer::delay_stuck(1000); dma_chx->CPAR=periphera_address; //DMA1 ÍâÉèµØÖ· dma_chx->CMAR=memory_address; //DMA1,´æ´¢Æ÷µØÖ· SET_REG(dma_chx->CCR,DMA_CCR_PL_0|DMA_CCR_MINC|DMA_CCR_DIR|DMA_CCR_TCIE); SET_BIT(DMA1->IFCR,DMA_IFCR_CGIF2); NVIC_EnableIRQ(DMA1_Channel2_3_IRQn); } void Dma::enable(DMA_Channel_TypeDef *dma_chx,unsigned short size){ dma_chx->CNDTR=size; //DMA1,´«ÊäÊý¾ÝÁ¿ SET_REG(USART1->CR3,USART_CR3_DMAT); SET_BIT(dma_chx->CCR,DMA_CCR_EN); } |
|
|
|
|
|
还是有问题,在接收与发送之间来回转换几次,DMA会有几次中断不进去.
|
|
|
|
|
|
用DMA发送吧
|
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
STM32F405驱动DS1302时钟模块,输出时间错乱该怎么排查?
2810 浏览 2 评论
stm32f405rgt6驱动DS1302ZN出现时间错乱问题
2420 浏览 1 评论
stm32用fsmc读取ad7606采集数据,数据不变,只有开发版复位才更新数据
2288 浏览 0 评论
2404 浏览 1 评论
1643 浏览 1 评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-2 18:11 , Processed in 2.469943 second(s), Total 108, Slave 91 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
2323