控制/MCU
#define HB_REG(ADDRESS) (*((volatile unsigned long *)(ADDRESS)))
这种定义默认是读,实际上也可以写,编写简单DMA驱动程序如下:
但是仿真波形发现,上图49行程序并没有执行:
C代码编译器默认优化选项是-O3,
GNU_CC_FLAGS = -g -O3 -mthumb $(CPU_TYPE)
从下图lst文件看得到的确有三条str指令,但是为何第三条str指令未执行?我们对比下优化选项是-O0的机器指令。
优化选项是-O0:
GNU_CC_FLAGS = -g -O0 -mthumb $(CPU_TYPE)
lst文件如下图所示,左边是优化-O3,右边是-O0
程序简单,优化前18条指令,优化后16条指令,优化掉2条机器指令,并调换了指令顺序,但并不影响功能。所以优化级别-o0、-o3功能都OK。
接下来就是定位MCU的内部功能,追踪代码,从CPU的取指令接口开始查询,很快可以找到原因,由于新增DMA控制器新增了MCU的架构地址空间,添加了译码器逻辑,default slave这个IP没有改,造成default slave收到DMA新增的地址空间后认为是地址溢出错误,所以报了resp_err给CPU,造成CPU挂起。关于具体原因、MCU架构请进【知识星球】查看详细解释。
虽然功能OK,但上图波形明显还有问题需要优化解决,详见【知识星球】
欢迎加入【全栈芯片工程师】知识星球,手把手教你设计MCU、图像传感器、ISP图像处理,从算法、前端到后端全流程设计。
审核编辑:汤梓红
全部0条评论
快来发表一下你的评论吧 !