MDK 设置问题

1. Keil调试局部变量显示"not in scope"的问题解决

在调试程序的时候,发现函数返回值赋值给变量时,变量值总是显示"not in scope",无法看到变量被赋的值。

出现这种情况的原因是这个局部变量没被分配到内存,或者变量被编译器优化了。

编译器优化级别高的时候,编译器为了优化,可能并没有按照我们想要执行的代码汇编。

解决方法:降低Keil的编译优化选项,如下图所示,优化等级改为0(默认为3)。

2. 工程窗口各项图标描述

  •  工程标示图标

这个图标很容易理解,标示一个工程;一般是在多工程下,容易区分工程。

  •  文件组或目标图标

这类图标大概可以分为如下三类:

工程目标:这个图标带有“*”号,和源文件带“*”号图标类似,就是修改了目标下面的属性。

已展开的文件组:这个就是展开了这个组。

未展开的文件组

  •  源文件头文件图标

这类图标大概可以分为如下两类:

源文件:这类是正常,没有带特殊标记的源文件,如C,CPP,库文件等。

头文件:包含Header file, image file, or documentationfile这些文件类型图标。

“钥匙”图标:这个标记就是文件只读,不能修改;只需要去掉文件只读属性就可以修改了。 

 “禁止驶入”图标:这个图标的意思主要就是指工程不包含该源文件,也就是不进行编译,链接等处理。可以通过:选中文件 -> 右键 修改属性:

在这里插入图片描述

 “*”号图标:这个图标相对来说难理解一点,其实就是改变了单个文件的配置。有点类似上面第2点“不编译选项图标”,修改了该文件编译的优先级、对该文件增加相关宏定义等。

 “叹号”图标:比较容易理解,就是没有发现源文件。这种一般是在关闭工程后,删除了对应的源文件。当再次打开工程后,会发现这个文件的图标就出现这种标记了

2. MDK中编译程序后Program Size详解

一 说明

Code, RO-data, RW-data, ZI-data

Code 表示程序代码部分
RO-data 表示 程序定义的常量const temp;
RW-data 表示 已初始化的全局变量
ZI-data 表示 未初始化的全局变量

Program Size: Code="18248" RO-data=320 RW-data=260 ZI-data=3952

Code, RO-data, ............flash
RW-data, ZIdata...................RAM

二 详细分析

初始化时RW-data从flash拷贝到RAM

生成的map文件位于list文件夹下 (KEIL)

    Total RO  Size (Code + RO Data)                18568 (  18.13kB)
    Total RW  Size (RW Data + ZI Data)              4212 (   4.11kB)
    Total ROM Size (Code + RO Data + RW Data)      18828 (  18.39kB)

ARM指令的长度刚好是1个字(分配为占用4个字节),Thumb指令的长度刚好是半字(占用2个字节)

R0-R15 (R15-PC,R14-LR,R13-SP) 32位

每个异常模式还带有一个程序状态保存寄存器 (SPSR),它用于保存在异常事件发生之前的CPSR

LDMIA R1!,{R2-R7, R12} ;将R1单兀中的数据读出到R2-R7,R12,  R1自动加1
STMIA RO!,{R3-R6,R10}  ;将R3-R6,R10中的数据保存到RO指向的地址,RO自动加1

在数据传送之前,将偏移量加到Rn中,其结果作为传送数据的存储地址.若使用后缀“!”,则结果写回到Rn中,且Rn值不允许为R15.指令举例如下:
LDR   Rd, [Rn, #Ox4]!

LDMFD  SP!,{R0-R3,PC}^ ;中断返回
“^”符号表示这是一条特殊形式的指令。这条指令在从存储器中装载PC的同时(PC是最后恢复的),CPSR也得到恢复

大端格式(Big-endian)
小端格式(Little-endian)

数据0x12345678存储格式
      大端格式
低地址<----0x12|0x34|0x56|0x78---->高地址
      小端格式
低地址<----0x78|0x56|0x34|0x12---->高地址

ARM微处理器支持7种运行模式,分别为: CPSR M[4:0]

1.用户模式(usr):ARM处理器正常的程序执行状态。       10000
2.快速中断模式(fiq):用于高速数据传输或通道处理。    10001
3.外部中断模式(irq):用于通用的中断处理。            10010
4.管理模式(svc):操作系统使用的保护模式。            10011
5.数据访问终止模式(abt):当数据或指令预取终止时进入该模式,可用于虚拟存储及存储保护。10111
6.系统模式(sys):运行具有特权的操作系统任务。        11111
7.定义指令中止模式(und):当未定义的指令执行时进入该模式,可用于支持硬件协处理器的软件仿真。 11011

ARM正常工作一般工作在用户模式和系统模式,复位的时候进入管理模式。

对于ARM指令集来说,PC指向当前指令的下两条指令的地址,

注意pc,在调试的时候显示的是当前指令地址,而用mov lr,pc的时候lr保存的是此指令向后数两条指令的地址

假设反汇编代码:  0x000001 :  mov lr pc   

(此时查看PC寄存器的值是0x000001,但实际PC值是0x000003, lr里面保存的就是0x000003)

fields 指定传送的区域(psr  CPSR或SPSR)
c 控制域屏蔽字节(psr[7..0])
x 扩展域屏蔽字节(psr[15..8])
s 状态域屏蔽字节(psr[23..16])
f 标志域屏蔽字节(psr[31..24])

例如:MSR cpsr_c, #0xD3 ;  CPSR[7...0] = 0xD3

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MDK5中,可以通过以下步骤进行注释字体设置: 1. 关闭MDK安装时的字体设置,以确保安装的字体能够正常被找到。 2. 在MDK的配置中,选择所安装的字体。具体步骤是打开MDK的configuration,找到字体选项,并选择安装的字体。 3. 在编码方式中选择字体为GB2312,以确保注释字体能够正确显示。 4. 如果仍然遇到问题,可以检查Keil5相关设置中的字体参数设置。 5. 确保字体参数设置中的注释字体设置正确,并根据需要进行调整。 6. 保存设置并重新启动MDK,以使注释字体设置生效。 这样,你就可以成功设置MDK5的注释字体了。请按照上述步骤操作,如有其他问题,请随时提问。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [【转载】MDK中的中文字体乱码解决方法](https://blog.csdn.net/m0_46577050/article/details/129193900)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [Keil5注释汉字无法显示+代码自动补全设置不显示+字体参数(配色)设置+缩进调整](https://blog.csdn.net/qq_43732429/article/details/108293641)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值