计算机疑难杂症记录与分享006
- Keil5 使用Debug调试,阻塞在System_Init()中,并报错显示error 65: access violation at 0x40021000 : no 'read' permission
- 1、问题背景
- 2、问题原因
- 3、问题解决
- 3.1、解决方法1(亲测有效):
- 3.1.1、修改后的现象1
- 3.1.2、修改后的现象2
- 3.2、方法二(亲测有效)
- 4、问题总结
- 4.1、总结,纯软件调试,正确步骤
- 4.2、问题解决后现象
Keil5 使用Debug调试,阻塞在System_Init()中,并报错显示error 65: access violation at 0x40021000 : no ‘read’ permission
1、问题背景
这次是因为要写一个设备模块的驱动程序,需要根据数据手册的时序图上的要求,进行高低电平的精确延时,就想着用keil5自带的Debug软件仿真,计算程序段的时间,然后出现以下问题现象:
温馨提示:这里以简单的例程为例演示问题现象,找到问题原因,再解决问题,在最后总结最优的正确进入调试的步骤,着急的可自行略过问题原因,直接跳转最后看第四节解决问题即可。
问题现象1:
点击调试后,显示:
说明第一步就未选择正确。
解决问题现象1,使用纯软件应该选择:
问题现象2:
正确选择逻辑分析仪后,点击调试,出现直接进入到如下图位置:
发现程序进入System_Init()中,而正常现象应该是运行在main函数入口处。
然后尝试点击 run 或者 step ,最终阻塞在 HSEStatus = RCC->CR & RCC_CR_HSERDY;
do{ …} while函数处
知道问题现象后,现在来分析问题原因。
2、问题原因
根据问题现象,分析造成阻塞的原因,无非就是while判断的判断条件不满足,跳出的条件,那么分别右击变量RCC->CR、RCC_CR_HSERDY、HSE_STARTUP_TIMEOUT跳转到定义处,发现其值与咱们芯片的时钟控制寄存器RCC_CR相关.
RCC->CR
RCC_CR_HSERDY
HSE_STARTUP_TIMEOUT
然后找到问题出现在RCC_CR后,查看数据手册,这里以STM32F10XXX为例,如图所示:
分别是描述了自身RCC和互联型产品RCC的定义和说明。
那么接下来就是解决问题。
3、问题解决
3.1、解决方法1(亲测有效):
回到Keil5的Debug窗口,查看发现:
发现使用软件调试时,Dialog DLL链接库和芯片参数均默认为与Cortex M3内核匹配的库和芯片参数,发现与我们正使用的器件不匹配,那么改成自己需要的库和芯片型号即可。这里改为STM库:Dialog DLL:DARMSTM.DLL 接着Parameter参数:-pSTM32F103ZE (格式:-p+自己所用的芯片)
说明:Dialog DLL链接库的另一个作用是,方便调试时,查看显示外设和寄存器等窗口。
3.1.1、修改后的现象1
改了后发现寄存器地址果然发生了变化。
修改前:
修改后:
3.1.2、修改后的现象2
修改前为空的:
修改后成功加载库中的外设和内部资源:
3.2、方法二(亲测有效)
既然知道由于地址问题造成修改解决后,那么也可以通过权限解决(本质还是地址),通过Debug的Memory map 修改读写权限。从而解决 no ‘read’ permission 或 no ‘write’ permission。
弊端就是这种方法属于一次性的,可以考虑加一个自定义的配置文件。
查看数据手册:
map 0x40018000, 0xA0000FFF read write // AHB
map 0x40010000, 0x40017FFF read write // APB2
编写Initialization file 并添加自定义的Initialization file。
4、问题总结
问题概括:1.未正确选择逻辑分析仪选项,2.未正确配置匹配的仿真器的环境。
综上所述,推荐第一个方法解决。
4.1、总结,纯软件调试,正确步骤
4.2、问题解决后现象
点击调试后,恢复正常进入main中,且外设资源窗口也正常加载。