根据例程和参考网上的aht20驱动进行移植。编译阶段就有错误,一步步解决掉了。但是编译成功后下到板子上就抓虾了。cpu一直在重启。串口打印了很多异常信息。
- [22:36:28.531]收←◆AHT20 Init Success
- [22:36:28.612]收←◆=======KERNEL PANIC=======
- **********syserr info start**********
- kernel_ver : Hi3861V100 R001C00SPC025,2020-09-03 18:10:00
- **********Exception Information**********
- PC Task Name : AHT20Tas
- PC Task ID = 9
- Cur Task ID = 9
- Task Stack Size = 0x400
- Exception Type = 0x7
- **********reg info**********
- mepc = 0x4a1580
- mstatus = 0x1880
- mtval = 0x4
- mcause = 0x7
- ccause = 0x7
- ra = 0x4a1562
- sp = 0xfa5a0
- gp = 0x11a9c0
- tp = 0x83d9000b
- t0 = 0x8
- t1 = 0xffffffe0
- t2 = 0x88
- s0 = 0xe41c8
- s1 = 0xf4240
- a0 = 0x0
- a1 = 0xfa619
- a2 = 0xfa5ec
- a3 = 0xe97a4
- a4 = 0xd00a0dff
- a5 = 0x41764
- a6 = 0x0
- a7 = 0x4
- s2 = 0x13131313
- s3 = 0xfa654
- s4 = 0x4afcec
- s5 = 0x4afcd4
- s6 = 0x4afcbc
- s7 = 0x8080808
- s8 = 0x7070707
- s9 = 0x6060606
- s10 = 0x5050505
- s11 = 0x4040404
- t3 = 0xfa5ac
- t4 = 0x0
- t5 = 0xdb760
- t6 = 0xdb760
- **********memory info**********
- Pool Addr = 0xe8780
- Pool Size = 0x2fe40
- Fail Count = 0x0
- Peek Size = 0x141e0
- Used Size = 0x141c0
- **********task info**********
- Name : AHT20Tas
- ID = 9
- Status = 0x14
- Stack Index = 0x8
- Stack Peak = 0x290
- Stack Size = 0x400
- SP = 0x11a860
- Stack : 0xfa290 to 0xfa690
- Real SP = 0xfa5a0
- Stack Overflow = 0
- **********track_info**********
- current_item:0x6
- item_cnt:10
- Index TrackType TrackID CurTime Data1 Data2
- 0001 0065 0007 0x66 0x3f5e78 0x3f5e78
- 0002 0065 0006 0x66 0x3f5e78 0x3f5e78
- 0003 0065 0009 0x66 0x3f5e78 0x3f5e78
- 0004 0065 0001 0x66 0x3f5e78 0xd99ec
- 0005 0016 0007 0x66 0xd99ec 0x0
- 0006 0065 0009 0x67 0xd99ec 0x3f5e78
- 0007 0065 0001 0x64 0x3f5e78 0xd99ec
- 0008 0016 0007 0x64 0xd99ec 0x0
- 0009 0016 0007 0x65 0xd99ec 0x0
- 0010 0065 0000 0x66 0xd99ec 0x3f5e78
- **********Call Stack**********
- Call Stack 0 -- 3f78c0 addr:fa67c
- Call Stack 1 -- 3f5e24 addr:fa68c
- **********Call Stack end**********
复制代码程序没运行起来。一直重启。这就麻烦了,不知道从哪入手去解决问题。
搞了两个晚上,在官方的文档中找到个很有用的文档:Hi3861V100/Hi3861LV100 常见问题 FAQ.pdf。里面的第三章有详细讲解死机信息和死机问题。接下来就是参考文档中提供的方法一步步去定位问题。
[attach]992098[/attach]
根据步骤3找到mepc地址:0x4a1580
[attach]992102[/attach]
根据地址0x4a1580找到.asm文件中的对应函数。即找到出错的函数了。
[attach]992106[/attach]
定位到是在AHT20_Task函数中调用AHT20_ReadHT出问题了。已经缩小范围了,继续找引发问题的具体原因。
然后继续在map文件中找函数中用到的内存或者变量定义。找到如下部分,定义的结构体变量定义成了指针类型的,调用的时候又没有分配空间
[attach]992107[/attach]
解决办法,直接定义为结构体变量,这样编译器就会自动分配内存空间了。
[attach]992108[/attach]
至此找到问题并解决了该问题。