完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
STM32中断中调用OLED显示出现OLED花屏
在TIM5中断处理函数中,我写了OLED显示,经过DEBUG发现程序执行到OLED显示语句的时候,OLED就会花屏。 //中断服务处理函数 void TIM5_IRQHandler() { if (TIM_GetITStatus(TIM5,TIM_IT_Update)==1) //判断中断状态,是否发生 { TIM_ClearITPendingBit(TIM5,TIM_IT_Update); //清除TIMx的中断待处理位:TIM中断源 LCD_16_HanZi_ASCII(5, 6, “电阻:”); //显示负载类型 sprintf(OLED_BUF,"%.2f",res1);//显示计算阻值 LCD_16_HanZi_ASCII(10,6,OLED_BUF); } 后来在网上搜了一下,发现很多人遇到这个问题,初学嵌入式开发,在写驱动的时候,有一条非常经典的戒律:中断服务程序里,不能调用printf,malloc 函数。 大致理解就是, printf 放在中断里,相当于中断中嵌入中断,这样的函数可能被阻塞,中断中不能调用有可能被阻塞的函数。 原因可参考: 首先,我们要清楚中断发生时,系统的状态如何。一般系统都有特定的中断运行上下文,但不是任务上下文,所以在这个上下文中不能按照普通任务一样调度(也可以在当前任务中断,不同系统可能有所不同),这是中断运行情况。 其次,发生中断时,大多数系统都是把系统中断关闭,尽快处理完再打开。也可以实现中断嵌套,将更高级别的中断打开,但需要很好的处理中断上下文。 最后要明确的是,系统任务调度是什么时候发生。一般都是在任务主动让出,系统定时中断,系统调用中断返回。 printf, malloc等函数,要用到系统全局资源,具体还要看系统底层具体实现。大部分标准的实现应该用到了信号等互斥手段,达到全局同步和共享的目的。也有的可能没有加以多任务保护同步机制,访问其全局资源存在冲突问题。 结合上面说明的情况,可以看出在中断中调用printf,malloc等函数,可能存在几种情况: 。关中断处理时,有可能导致中断休眠。这种情况下,大部分系统都会挂了(有的可能还能调度?很少)。 。中断不关,高优先级的中断还可以产生,还可以调度(系统比较复杂,估计很少)。 。如果不加多任务保护机制,对于全局资源,存在可重入问题。中断可能发生在任何时候任何函数里,全局资源可能存在访问冲突,后果不能预料。 所以,挂起和可重入都有可能发生,具体看系统情况。并且也可以设计避免其发生。但大多数系统都是针对实时多任务的,这个是重点,而不会因为这样的不重要的需求和改变了其本质的工作方式,甚至影响了系统性能。 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1614 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1541 浏览 1 评论
970 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
682 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1592 浏览 2 评论
1863浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
644浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
515浏览 3评论
531浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
504浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 00:41 , Processed in 0.698025 second(s), Total 49, Slave 42 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号