资料介绍
1、MDK中的char类型的取值范围是?
在MDK中,默认情况下,char 类型的数据项是无符号的,所以它的取值范围是0~255。它们可以显式地声明为signed char 或 unsigned。因此,定义有符号char类型变量,必须用signed显式声明。我曾读过一本书,其中有一句话:“signed关键字也是很宽宏大量,你也可以完全当它不存在,在缺省状态下,编译器默认数据位signed类型”,这句话便是有异议的,我们应该对自己所用的CPU构架以及编译器熟练掌握。
2、赋初值的全局变量和静态变量,初值被放在什么地方?
unsigned int g_unRunFlag=0xA5;
static unsigned int s_unCountFlag=0x5A;
这两行代码中,全局变量和静态变量在定义时被赋了初值,MDK编译环境下,你知道这个初值保存在那里吗?
对于在程序中赋初值的全局变量和静态变量,程序编译后,MDK将这些初值放到Flash中,紧靠在可执行代码的后面。在程序进入main函数前,会运行一段库代码,将这部分数据拷贝至相应RAM位置。若是你不小心将这些位置的数据擦除掉,嘿嘿...反正我是碰到了。
PS:后来看ARM的链接器,才知道ARM映象文件各组成部分在存储系统中的地址有两种:一种是在映象文件位于存储器中时(也就是该映象文件开始运行之前,通俗的说就是下载到Flash中的二进制代码)的地址,称为加载地址;一种是在映象文件运行时(通俗的说就是给板子上电,开始运行Flash中的程序了)的地址,称为运行时地址。赋初值的全局变量和静态变量在程序还没运行的时候,初值是被放在Flash中的,这个时候他们的地址称为加载地址,当程序运行后,这些初值会从Flash中拷贝到RAM中,这时候就是运行时地址了。
3、最新的keil MDK(V4.54)在编辑界面中已经可以支持中文编码了,所以可以在编辑器中直接输入汉字和中文标点符号,再也不会显示乱码或者不显示了。虽然乱写汉字和中文标点在编译时依然会报错,但好歹能显示,也从侧面说明中国市场的崛起。开启方法见 不再贴了。
我还清楚的记得自己在大学刚开始用Keil C51那会,一次不小心在一行代码后面用了个中文分号,在当时这个中文分号是不被显示的,然后编译,编译器报错,我双击报错信息定位到报错的代码行,却怎么也检查不出来错误来,当时着急的心情现在想想还很好笑的,那个时候只能将错误代码行用双斜杠注释掉,才能看到那个中文分号。但从V4.54之后,就应该再不会遇到我当时的情况了。
4、不知道从什么版本开始,keil MDK的标题栏可以显示工程路径了,我是从V4.10直接升级到V4.54,V4.10的标题栏还是下图的这个样子:
如果你同一个工程有多个备份,你有同时打开了多个备份工程,要想识别出那个工程是那个备份,可是件不容易的事情,还好,keil更新较快。
5、这一条真伪未知,因为我搜索了很久都没有查证。
在一个论坛上看到的,Keil原来是一个人名,住在德国,最初的keil C51编译器就是他开发的,为人低调,话不多,但超级认真,当然,也超级厉害。
6、Stack分配到RAM的哪个地方?
Keil MDK中,我们只需要定义各个模式下的堆栈大小,编译器会自动在RAM的空闲区域选择一块合适的地方来分配给我们定义的堆栈,这个地方位于RAM的那个地方呢?通过查看编译列表文件,原来MDK将堆栈放到程序使用到的RAM空间的后面,比如你的RAM空间从0x4000 0000开始,你的程序用掉了0x200字节RAM,那么堆栈空间就从0x4000 0200处开始。具体的RAM分配,其实你可以从编译后生成的列表文件“工程名.map”文件中查看。
7、有多少RAM会被初始化?
大家可能都已经知道,在进入main()函数之前,MDK会把未初始化的RAM给清零的(在程序中自己定义变量初值的见第二条),但MDK会不会把所有RAM都初始化呢?答案是否定的,MDK只是把你的程序用到的RAM以及堆栈RAM给初始化,其它RAM的内容是不管的。如果你要使用绝对地址访问MDK未初始化的RAM,那就要小心翼翼的了,因为这些RAM的内容很可能是随机的,每次上电都不同。至少,NXP的LPC2000系列就是这样。
8、还是一个新版本的变化,还是关于版本V4.10和V4.54
V4.10版本,只要你重新打开工程,点击"Build target files"(就这个图标:),编译器就会将所有文件都编译一次,不管你的文件在这之前有没改动。但V4.54就不一样了,再次打开文件,点击"Build target files"它会只编译改过的文件的,早该这么做了,每次打开工程都要编译个十几秒钟,着实等的难受。
9、好个一丝不苟的编译器
这是个十分奇葩的问题,碰巧被我遇到了,我承认是我代码写的不够规范,但正是这个不规范的代码,才得以发现这个奇葩的事件。实在忍不住用了两个奇葩来形容。把过程简化一下,如下所述:
假如你的工程至少有两个.c文件,其中一个为timer.c,里面有个定时器中断程序,每10ms中断一次,定义一个变量来统计定时器中断次数:
unsigned int unIdleCount;
还有一个timer.h文件,里面是一些timer.c模块的封装,其中变量unIdleCount就被封装在里面:
extern unsigned int unIdleCount;
在main.c函数中,包含timer.h文件,并利用定时器变量unIdleCount来精确延时2秒,代码如下:
unIdleCount=0;
while(unIdleCount!=200); //延时2S钟
keil MDK V5.54下编译,默认优化级别,编译后下载到硬件平台。你会发现,代码在
while(unIdleCount!=200);
处陷入了死循环。反汇编,代码如下:
122: unIdleCount=0;
123:
0x00002E10 E59F11D4 LDR R1,[PC,#0x01D4]
0x00002E14 E3A05000 MOV R5,#key1(0x00000000)
0x00002E18 E1A00005 MOV R0,R5
0x00002E1C E5815000 STR R5,[R1]
124: while(unIdleCount!=200); //延时2S钟
125:
0x00002E20 E35000C8 CMP R0,#0x000000C8
0x00002E24 1AFFFFFD BNE 0x00002E20
重点看最后两句汇编代码,寄存器R0是当前变量unIdleCount的值,汇编指令CMP为比较指令,如果R0中的内容与0xC8不等,则循环。但是这里并没有更新寄存器R0的代码,也就是说变量unIdleCount的值虽然在变化,但跟0xC8一直比较的却是内容不变的R0。因为之前变量unIdleCount被清零,所以R0的内容也是0,永远不等于0xC8,永远不会跳出循环。
看到这里,也许你已经笑翻了:你这个小白,这很明显是没用volatile修饰变量unIdleCount造成的!!!不错,比起从RAM中读写数据,ARM或其它硬件从寄存器读取数据要快的多的多的多...因此编译器会���自作主张”的将某些变量读到寄存器中,再次运算时也优先从寄存器中读取,上面的例子就是这样。解决这样的方法是用关键字volatile修饰你不想让编译器优化的变量,明白的告诉编译器:你不准优化我,每次使用我你都要本本分分的从RAM中读取或写入RAM。
下载该资料的人也在下载
下载该资料的人还在阅读
更多 >
- 有趣的keil MDK细节
- Keil C51和Keil MDK下载
- PCB 板 layout 中容易被忽视的 12 个细节资料下载
- 说说KEIL、uVision、RealView、MDK、KEIL C51之间的关系区别资料下载
- 如何使用Keil MDK运行第一个STM32程序的资料说明
- keil MDK-ARM下载入口 23次下载
- Keil MDK4.72 .part11 22次下载
- Keil MDK4.72 .part07 17次下载
- Keil MDK4.72 .part08 32次下载
- Keil MDK4.72 .part20 9次下载
- Keil MDK4.72 .part21 25次下载
- Keil MDK4.72 .part22 10次下载
- Keil MDK4.72 .part23 16次下载
- Keil MDK4.72 .part12 25次下载
- Arm Keil MDK教程下载 369次下载
- 怎样将keil中的程序导出 6.7k次阅读
- keil5怎么把程序烧到板子上 8.3k次阅读
- 怎么啦?你的Keil C51和Keil MDK还无法共存吗? 4.8k次阅读
- 为MindSDK搭建Keil MDK开发环境 2.7k次阅读
- Keil MDK使用GCC编译器的方法 4.7k次阅读
- keil5的安装 4.9k次阅读
- 四个有趣的关于Python 3.9版本新特性 3.6k次阅读
- 米尔科技Keil开发工具所有支持芯片介绍 3w次阅读
- 米尔科技KEIL MDK-ARM比较 2.2k次阅读
- 米尔科技Keil MDK-ARM - Realview开发工具介绍 8k次阅读
- 使用Keil下载Hex文件进STM32 9.6k次阅读
- C语言12个浅显易懂的知识点 5.5k次阅读
- KEIL MDK简介,如何安装KEIL MDK下载程序 2.9w次阅读
- keil uvision2中文版|keil uvision2汉化补丁下载 1.1w次阅读
- keil uvision2下载|keil uvision2汉化免费版下载 1.2w次阅读
下载排行
本周
- 1冷柜-电气控制系统讲解
- 13.68 MB | 4次下载 | 10 积分
- 2安川A1000变频器中文版说明书
- 20.16 MB | 3次下载 | 3 积分
- 3直流电路的组成和基本定律
- 1.67 MB | 2次下载 | 免费
- 4丹佛斯2800系列变频器说明书
- 8.00 MB | 1次下载 | 5 积分
- 5PC8011同步开关型降压3.5A单节锂电池充电管理电路技术手册
- 0.74 MB | 1次下载 | 免费
- 6ES7243E+ES8311音频录制与播放电路资料
- 0.06 MB | 1次下载 | 5 积分
- 7SDM02 激光测距模块产品手册
- 0.43 MB | 1次下载 | 免费
- 8SDFM 激光测距模块模组手册
- 0.54 MB | 1次下载 | 免费
本月
- 1CH341编程器软件NeoProgrammer_2.2.0.10
- 20.47 MB | 170次下载 | 1 积分
- 22025智能家居传感器市场分析及创新应用
- 3.11 MB | 43次下载 | 免费
- 3RV1126B系列开发板产品资料
- 4.19 MB | 18次下载 | 免费
- 4CH341编程软件下载
- 2.50 MB | 16次下载 | 5 积分
- 5全志系列-米尔基于T153核心板开发板 四核异构、3路千兆网,赋能多元化工业场景
- 3.05 MB | 12次下载 | 免费
- 6【开源】60余套STM32单片机、嵌入式Linux、物联网、人工智能项目案例及入门学习资源包
- 10.55 MB | 8次下载 | 免费
- 7冷柜-电气控制系统讲解
- 13.68 MB | 4次下载 | 10 积分
- 8特斯拉MODEL S车载充电机主电路回路原理图
- 0.81 MB | 4次下载 | 3 积分
总榜
- 1matlab软件下载入口
- 未知 | 935137次下载 | 10 积分
- 2开源硬件-PMP21529.1-4 开关降压/升压双向直流/直流转换器 PCB layout 设计
- 1.48MB | 420064次下载 | 10 积分
- 3Altium DXP2002下载入口
- 未知 | 233094次下载 | 10 积分
- 4电路仿真软件multisim 10.0免费下载
- 340992 | 191448次下载 | 10 积分
- 5十天学会AVR单片机与C语言视频教程 下载
- 158M | 183356次下载 | 10 积分
- 6labview8.5下载
- 未知 | 81604次下载 | 10 积分
- 7Keil工具MDK-Arm免费下载
- 0.02 MB | 73824次下载 | 10 积分
- 8LabVIEW 8.6下载
- 未知 | 65991次下载 | 10 积分
电子发烧友App





创作
发文章
发帖
提问
发资料
发视频
上传资料赚积分
评论