记一次Bug定位的过程

问题1

工作需要出bug的芯片不详细说明,该芯片的CPU含有32个中断源,一般来说,以stm32为例,中断向量表定义在startup_stm32f40_41xxx.s中,写为:

; Vector Table Mapped to Address 0 at Reset
                AREA    RESET, DATA, READONLY
                EXPORT  __Vectors
                EXPORT  __Vectors_End
                EXPORT  __Vectors_Size

__Vectors       DCD     __initial_sp               ; Top of Stack
                DCD     Reset_Handler              ; Reset Handler
                DCD     NMI_Handler                ; NMI Handler
                DCD     HardFault_Handler          ; Hard Fault Handler
                DCD     MemManage_Handler          ; MPU Fault Handler
                DCD     BusFault_Handler           ; Bus Fault Handler
                DCD     UsageFault_Handler         ; Usage Fault Handler
                DCD     0                          ; Reserved
                DCD     0                          ; Reserved
                DCD     0                          ; Reserved
                DCD     0                          ; Reserved
                DCD     SVC_Handler                ; SVCall Handler
                DCD     DebugMon_Handler           ; Debug Monitor Handler
                DCD     0                          ; Reserved
                DCD     PendSV_Handler             ; PendSV Handler
                DCD     SysTick_Handler            ; SysTick Handler

                ; External Interrupts
                DCD     WWDG_IRQHandler                   ; Window WatchDog
                DCD     PVD_IRQHandler                    ; PVD through EXTI Line detection
                DCD     TAMP_STAMP_IRQHandler             ; Tamper and TimeStamps through the EXTI line
                DCD     RTC_WKUP_IRQHandler               ; RTC Wakeup through the EXTI line
                DCD     FLASH_IRQHandler                  ; FLASH
                DCD     RCC_IRQHandler                    ; RCC
                DCD     EXTI0_IRQHandler                  ; EXTI Line0
                DCD     EXTI1_IRQHandler                  ; EXTI Line1
                DCD     EXTI2_IRQHandler                  ; EXTI Line2
                DCD     EXTI3_IRQHandler                  ; EXTI Line3
                DCD     EXTI4_IRQHandler                  ; EXTI Line4
                DCD     DMA1_Stream0_IRQHandler           ; DMA1 Stream 0
                DCD     DMA1_Stream1_IRQHandler           ; DMA1 Stream 1
                DCD     DMA1_Stream2_IRQHandler           ; DMA1 Stream 2
                DCD     DMA1_Stream3_IRQHandler           ; DMA1 Stream 3
                DCD     DMA1_Stream4_IRQHandler           ; DMA1 Stream 4
                DCD     DMA1_Stream5_IRQHandler           ; DMA1 Stream 5
                DCD     DMA1_Stream6_IRQHandler           ; DMA1 Stream 6
                DCD     ADC_IRQHandler                    ; ADC1, ADC2 and ADC3s
                DCD     CAN1_TX_IRQHandler                ; CAN1 TX
                DCD     CAN1_RX0_IRQHandler               ; CAN1 RX0
                DCD     CAN1_RX1_IRQHandler               ; CAN1 RX1
                DCD     CAN1_SCE_IRQHandler               ; CAN1 SCE
                DCD     EXTI9_5_IRQHandler                ; External Line[9:5]s
                DCD     TIM1_BRK_TIM9_IRQHandler          ; TIM1 Break and TIM9
                DCD     TIM1_UP_TIM10_IRQHandler          ; TIM1 Update and TIM10
                DCD     TIM1_TRG_COM_TIM11_IRQHandler     ; TIM1 Trigger and Commutation and TIM11
                DCD     TIM1_CC_IRQHandler                ; TIM1 Capture Compare
                DCD     TIM2_IRQHandler                   ; TIM2
                DCD     TIM3_IRQHandler                   ; TIM3
                DCD     TIM4_IRQHandler                   ; TIM4
                DCD     I2C1_EV_IRQHandler                ; I2C1 Event
                DCD     I2C1_ER_IRQHandler                ; I2C1 Error
                DCD     I2C2_EV_IRQHandler                ; I2C2 Event
                DCD     I2C2_ER_IRQHandler                ; I2C2 Error
                DCD     SPI1_IRQHandler                   ; SPI1
                DCD     SPI2_IRQHandler                   ; SPI2
                DCD     USART1_IRQHandler                 ; USART1
                DCD     USART2_IRQHandler                 ; USART2
                DCD     USART3_IRQHandler                 ; USART3
                DCD     EXTI15_10_IRQHandler              ; External Line[15:10]s
                DCD     RTC_Alarm_IRQHandler              ; RTC Alarm (A and B) through EXTI Line
                DCD     OTG_FS_WKUP_IRQHandler            ; USB OTG FS Wakeup through EXTI line
                DCD     TIM8_BRK_TIM12_IRQHandler         ; TIM8 Break and TIM12
                DCD     TIM8_UP_TIM13_IRQHandler          ; TIM8 Update and TIM13
                DCD     TIM8_TRG_COM_TIM14_IRQHandler     ; TIM8 Trigger and Commutation and TIM14
                DCD     TIM8_CC_IRQHandler                ; TIM8 Capture Compare
                DCD     DMA1_Stream7_IRQHandler           ; DMA1 Stream7
                DCD     FSMC_IRQHandler                   ; FSMC
                DCD     SDIO_IRQHandler                   ; SDIO
                DCD     TIM5_IRQHandler                   ; TIM5
                DCD     SPI3_IRQHandler                   ; SPI3
                DCD     UART4_IRQHandler                  ; UART4
                DCD     UART5_IRQHandler                  ; UART5
                DCD     TIM6_DAC_IRQHandler               ; TIM6 and DAC1&2 underrun errors
                DCD     TIM7_IRQHandler                   ; TIM7
                DCD     DMA2_Stream0_IRQHandler           ; DMA2 Stream 0
                DCD     DMA2_Stream1_IRQHandler           ; DMA2 Stream 1
                DCD     DMA2_Stream2_IRQHandler           ; DMA2 Stream 2
                DCD     DMA2_Stream3_IRQHandler           ; DMA2 Stream 3
                DCD     DMA2_Stream4_IRQHandler           ; DMA2 Stream 4
                DCD     ETH_IRQHandler                    ; Ethernet
                DCD     ETH_WKUP_IRQHandler               ; Ethernet Wakeup through EXTI line
                DCD     CAN2_TX_IRQHandler                ; CAN2 TX
                DCD     CAN2_RX0_IRQHandler               ; CAN2 RX0
                DCD     CAN2_RX1_IRQHandler               ; CAN2 RX1
                DCD     CAN2_SCE_IRQHandler               ; CAN2 SCE
                DCD     OTG_FS_IRQHandler                 ; USB OTG FS
                DCD     DMA2_Stream5_IRQHandler           ; DMA2 Stream 5
                DCD     DMA2_Stream6_IRQHandler           ; DMA2 Stream 6
                DCD     DMA2_Stream7_IRQHandler           ; DMA2 Stream 7
                DCD     USART6_IRQHandler                 ; USART6
                DCD     I2C3_EV_IRQHandler                ; I2C3 event
                DCD     I2C3_ER_IRQHandler                ; I2C3 error
                DCD     OTG_HS_EP1_OUT_IRQHandler         ; USB OTG HS End Point 1 Out
                DCD     OTG_HS_EP1_IN_IRQHandler          ; USB OTG HS End Point 1 In
                DCD     OTG_HS_WKUP_IRQHandler            ; USB OTG HS Wakeup through EXTI
                DCD     OTG_HS_IRQHandler                 ; USB OTG HS
                DCD     DCMI_IRQHandler                   ; DCMI
                DCD     CRYP_IRQHandler                   ; CRYP crypto
                DCD     HASH_RNG_IRQHandler               ; Hash and Rng
                DCD     FPU_IRQHandler                    ; FPU

__Vectors_End

__Vectors_Size  EQU  __Vectors_End - __Vectors

                AREA    |.text|, CODE, READONLY

其中的XX_Handler为中断服务函数,对中断服务函数进行实现后即可使用,我们开发芯片程序时常用的一种设计思路是这样的:

  • 主程序中定义一个全局变量flag用于记录是否有外部输入需要处理,打开中断,执行后台任务并检测输入flag
  • 进入中断后关闭中断并执行中断服务函数
  • 中断服务函数中对flag进行赋值,标记触发来源
  • 中断服务函数打开中断,退出
  • 主程序检测到输入flag,执行相关高优先级任务后,继续执行后台任务,等待下一次外部输入

按照上面的设计思路,假设我们以TIM3_IRQHandler中断为例,在主函数中这样实现:

unsigned int flag = 0;

int main(void)
{
    flag = 0
    while(flag==0)
    {
        ;
    }
    //do something for IRQ
}

在中断服务函数中对flag进行修改表示触发了中断:

void TIM3_IRQHandler(void)
{
    flag = 1;
    TIM_ClearITPendingBit(TIM3, TIM_IT_Update);  //清除中断标志位
}

运行程序后的结果是这样(举例说明):程序在进入中断服务函数后对flag进行置位并返回但是并未退出while循环,即flag的修改没有起作用。

这里最直接的原因是在汇编程序中比较的两个寄存器的值并未修改,即C代码在编译后对结果进行了优化,参考:周立功著 软件单元测试入门与实践 23页

因此最直接的办法是用volatile关键字对变量进行修饰,当然也有其他办法,出现问题的直接因素在于flag=0while(flag==0)被编译器直接优化掉了,这里可以写一个伪函数对flag进行一个操作绕开编译器的优化判断,但是增加了额外的开销,并不合适:

flag = 0;
fake_func(&flag);
while(flag==0);

//do something

问题2

中断是由通信单元产生的,在解决了中断无响应的问题后出现了上电复位后打印输出不稳定的现象,且发生次数和时间不固定。由于数据是在配置时钟后发出,中间无其他操作,初步认为是配置时钟造成的原因,芯片采用内部时钟,因此增加约10ms延时后输出稳定不再发生乱码,原因应该是PLL需要锁定时间,因此不能在配置PLL后直接执行与时序有关的操作。

原文地址:https://www.cnblogs.com/RegressionWorldLine/p/11729674.html

时间: 2024-08-29 22:55:19

记一次Bug定位的过程的相关文章

记一次数据库调优过程(IIS发过来SQLSERVER 的FETCH API_CURSOR语句是神马?)

记一次数据库调优过程(IIS发过来SQLSERVER 的FETCH API_CURSOR语句是神马?) 前几天帮客户优化一个数据库,那个数据库的大小是6G 这麽小的数据库按道理不会有太大的性能问题的,但是客户反应说CPU占用很高,经常达到80%~90% 我检查了任务管理器,确实是SQLSERVER占的CPU 而服务器的内存是16G内存,只占用了7G+ 客户的环境: Windows2008R2 SQLSERVER2005 SP3 64位 企业版 服务器内存:16G CPU:8核 RDS:阿里云主机

记一次OOM查询处理过程

记一次OOM查询处理过程 问题的爆出及分析排查现场 排查后的解决方案 项目的jvm参数 总结 一.问题的爆出及分析排查现场 服务偶尔会出现不可用的情况,导致出现time out,然后我迅速登录现场,直接查看当时的gc日志,不废话,直接上图 通过这个图可以发现在10点7分.8分的时候频繁Full GC,但是GC之后 年轻代,老年代并没有少.并且Full GC时长5s8多,造成stop-the-world5s8,因此应用程序会出现无影响.再贴一张图 通过这个可以看到内存慢慢的通过GC降下来了 根据这

软件测试的BUG定位

bug定位即有足够的"证据"去证明DOV(开发人员)的代码存在问题,不是单凭自己认为是bug就是bug,最好可以定位到DOV的某行代码,某个函数的问题,最好保留日志截图并且可以保证重现. 定位顺序:UI --> 中间件 --> 后台 -->代码 -->database 一.web前端的bug分析定位. 测试内容:页面布局.用户功能.易用性.兼容性 测试方法:模拟用户输入,在浏览器页面上进行输入.点 击等行为 定位之前需要思考的问题:是否是浏览器设置问题?是否是浏

如何进行前端bug定位

前端bug主要分为3个类别:HTML,CSS,Javascript三类问题 给个最大的区别方式方法: 出现样式的问题基本都是CSS的bug 出现文本的问题基本都是html的bug 出现交互类的问题基本都是Javascript的bug 现在以淘宝的前端人员工作为例进行相关bug定位的剖析 判断前后台问题的区分方法: FF, 打开错误控制台 区分前后台交互:查看网络请求 a) Html中如果有链接,有相应的情况下,基本可以定位到是属于前端的问题 b) 如果为空,或者有出现error错误信息,我们就可

记一个bug的排查过程---复盘

公众号做了新需求:菜单的click事件,支持多条客服消息. 上线后,只有一个功能不好使,是点击菜单,预期发一条文本类型的客服消息. 实际操作时,点这个菜单项后,什么也没有发生. elk上看日志,也没有什么报错.也不应该有报错,如果后端服务异常,公众号上会提示,“服务不可用”如果在后台打开 菜单管理 页面,什么也不做,再点个 保存 ,菜单 的功能就恢复正常了. ====================================================================

程序bug定位

最近又犯老毛病 碰到新功能没有能耐心地花时间去思考方方面面和细节 而是 直接动手开始实现单一核心功能 然而 bug连连 =======分割线============== 出现bug了...... 用户发现bug,反映到运营 运营没能执行bug上报流程找到测试(目前也没有什么bug上报流程) 测试没能确定bug详情 告知我有闪退之类的bug “你看,怎么又闪退了...” “代码缺少健壮性!” =======分割线====== 于是我开始准备定位闪退原因 以下为“世界观”+“方法论” 1.bug能不

记一次内存泄露优化过程

背景 项目目前存在使用久了或者重复打开关闭某个页面,内存会一直飙升,居高不下,频繁发生GC.静置一段时间后,情况有所改善,但是问题依旧明显,如图1-1.1-2. 图1-1.操作时的内存使用情况 图1-2.静置时的内存使用情况 如上图1-1,是通过Android Studio查看内存(灰色)和CPU(红色)使用情况,可以看出内存有发生抖动并且是处于比较高的状态,再者,从logcat可以看到一直发生GC,如下图1-3: 图1-3. 出现这些情况,是有很多因素造成的,最主要的原因是发生了内存泄露:页面

一个疑难bug的解决过程

一个crontab脚本,下载一个文件并把内容入mysql数据库.具体流程如下: 1, wget一个文件. 2,处理文件生成一个中间文件. 3,将中间文件load入库. 05 10 * * * /home/work/local/php5.4/bin/php /home/work/www/new_products1/web/index_cli.php actionads/index bug现象: 在线上,5次运行中,有2次会出错,就是入库的数据会缺失30%以上. 在线上手动运行脚本,没有一次出错.但

记一次BUG与DEBUG衍生的若干问题

前两天用Unity做一个AR软件测试,因为电脑上没有摄像头,所以就想打包成APK,然后到手机上测试的. 这个APP 的功能就是打开摄像头, 对着一张特定的图片,例如这张 然后图片上会出现一个立方体,效果差不多这样. 然后就开干了,前面都很顺利,很快就完成了,但是到了打包成APK 这步以后就出了问题. 首先是可以打包,但发布出来的APP打开以后就秒退,然后我就去群里问大神了-- 可能是我问的问题比较傻逼,而且遇到的大神也不太愿搭理我,给了我这样一个答案 然后人家就没搭理我了,然后我就自己琢磨是不是