u@home:~$

  • 在sim环境下调个bug

    好久没更新。。。 昨天反馈来一个bug,今天在sim上重现了,定位过程还有点意思,记录下。 Here is this bug. Becasue, previously, there was a heap-related bug in the cmn_init() function. 具体不说了,就是这里的malloc和其它一个模块里自带的malloc重名了,结果编译器用了自带的malloc,而这时自带的malloc还没初始化,导致malloc失败返回NULL。 解决了之前的bug,后面还是在cmn_init()里出了HardFault,所以还是怀疑和heap什么地方有关。 因为没有打开tarmac,所以信息就自己翻。 pc0_iss, ia0_ex1, ia0_ex2, ia0_wr, ia0_ret还有对应的pc1_iss, ia1_ex1, ia1_ex2, ia1_wr, ia1_ret是cortex-m7里双发射的两条流水线里执行阶段的pc值,这里叫ia,instruction address? 因为出错也不知道是在那个pipeline stage,所以还得具体看是啥指令,但能知道个大概范围。 从出错信息能看到有HardFault,是exception 3。 这时候看nvic_int_nxt_isr_i[7:0],这里给出了exception或者interrupt number。可以看到前面的值都是2A和2F,减去16(exception),就是1A和1F,在这实现里是uart0和dmac的外部中断,是正常的。 等到这个值变成3的时候,就是发生HardFault的地方了。 对着代码看,大概觉得是30049A46这的这条指令,是条load指令。 很有可能是load个无效地址导致HardFault,所以接着看r3和r6寄存器这时候都是什么值。 在dpu里找到rf。 r6里是0x161,r3的值是0x3B00003E,很奇怪,这个地址没有sram,所以load这个值导致HardFault没错了。 结合代码,感觉是malloc出来的buff是个靠近0地址的位置,这里是rom,看下内容,都解释通了。 剩下的问题就是heap为啥会这样, heap base在哪。 因为是代码里直接就用的malloc,所以是crt里自带的malloc,好像用的libc是newlib? crt里的malloc没有个heap init这类的函数,是在malloc里调用_sbrk()分出空间来给heap用。 _sbrk的实现貌似很简单,网上找了一段: https://community.silabs.com/s/article/malloc-and-sbrk?language=en_US...

  • Verilog里如果用case但default不是x会什么样

  • 只有.git目录 怎样把代码提取出来

    网上看到的,在.git同目录下 # 创建bundle文件 git bundle create ./reponame.bundle --all # 从bundle文件中clone出代码 git clone ./reponame.bundle reponame # 接下来文件夹内会出现一个 reponame 文件夹,这个文件夹内就是所有的代码文件 https://www.jianshu.com/p/92125cc920e1