【一个专注于嵌入式软件架构设计的新生代农名工】
这家伙很懒,什么也没写!
【架构师李肯】 【一个专注于嵌入式软件架构设计的新生代农名工】
这家伙很懒,什么也没写!
一、Keil5.12中文注释代码或粘贴后乱码
2、复制粘贴后乱码()
三、Keil5.12编译报错的处理()
2、文件名中有C的关键字
4、JLINK驱动使用错误
八、watch中添加的变量不能实时更新
1、打开一个测试通过的工程
3、重新编译,即可在原本生成Hex文件的目录下找到*.lib文件
4、打开原工程,只需将原来的dsp_g2.c文件移除,添加进该.lib文件即可使用
5、使用指令生成.lib文件(Keil C51测试通过)
十三、C文件生成静态库()
一、Keil5.12中文注释代码或粘贴后乱码
在新版本的KEIL中,总有人反映中文注释会出现乱码。出现这种情况,对于中文注释程序的人来说,无疑是一件十分不爽的事情。但实际解决这个问题其实很简单,在Edit/Configuration里如下图:
这个是view菜单的最后一下configuration的界面,在蓝色选中的部分选择GB2312,如图:
这时候,编辑文档里的删除文字和退格操作都是按照中文编码了,不再会出现乱码的情况。
2、复制粘贴后乱码()
前提是不能有中文路径。
设置一下代码补全功能。
三、Keil5.12编译报错的处理()
原来的设置如下,后来突然就没有此选项(原因不明)。
这样就只能安装知识包,将下图中的STM32F10X_MD去掉即可解决。
打开stm32f10x.h头文件,可以找到如下语句
这也是为什么有些头文件并没有手动添加却自动包含了进来的原因。
2、文件名中有C的关键字
就是在放工程的目录名不能使用象“#”那样的特殊符号。
4、JLINK驱动使用错误
应用程序发生异常未知的软件异常(0xc0000409),位置为0x0a36a6f7
原因:当前使用J-LINK进行仿真,但驱动使用了ST-Link的。
这个出现的原因是因为芯片RAM空间不足,无法执行程序。通常RAM的空间会比较小,ROM空间相对较大。
(1)扩大RAM,更换芯片
(2)减少需要存在RAM里的内容
①尝试修改”Target Options“中右侧RAM的Size,但这个要先查看芯片文档,找到文档中描述的RAM大小,把Size调成最大值。但是我的这个工程还是不行,看来是预存的数据量太大了。
②如果第一种方法还是不行,那就只能尝试把一些数据类的变量定义为静态,这样就可以利用ROM的存储空间了。找到工程中存储数据的部分,发现是大量的float数组。这种情况会占用大量的空间,所以要在float声明的前面加一个”const“,转换为静态变量。这样我的就可以通过了,成功生成了hex文件。
③如果第二种方法还是不行,那就只能修改代码的数据结构了。
Keil直接编译掩藏的文件会报错,按下图设置。
1)“字母:数字”,D、 I、 X、 C分别代表着直接寻址的片内RAM、间接寻址的片内RAM、扩展的外部RAM和ROM。
切记:查看内存仅限于模拟仿真时。
2)保存memory中的数据,注意保存下来的文件是HEX386格式的,可以通过其他工具转换成BIN格式。
3)keil编译后会产生.M51或者.map文件,在这里面也可看到内存的使用情况。
4)C程序中查看某一个变量在内存中的地址,比如下面的ChannelKindFault变量
ARM程序(指在ARM系统中正在执行的程序,而非保存在ROM中的bin文件)的组成一个ARM程序包含3部分:RO段,RW段和ZI段。
所谓ARM映像文件就是指烧录到ROM中的bin文件,也成为image文件。以下用Image文件来称呼它。 Image文件包含了RO和RW数据。之所以Image文件不包含ZI数据,是因为ZI数据都是0,没必要包含,只要程序运行之前将ZI数据所在的区域一律清零即可。包含进去反而浪费存储空间。
从以上两点可以知道,烧录到ROM中的image文件与实际运行时的ARM程序之间并不是完全一样的。因此就有必要了解ARM程序是如何从ROM中的image到达实际运行状态的。
实际上,RO中的指令至少应该有这样的功能:
(1)将RW从ROM中搬到RAM中,因为RW是变量,变量不能存在ROM中。启动过程另可见。
(2)将ZI所在的RAM区域全部清零,因为ZI区域并不在Image中,所以需要程序根据编译器给出的ZI地址及大小来将相应得RAM区域清零。ZI中也是变量,同理:变量不能存在ROM中。
在程序运行的最初阶段,RO中的指令完成了这两项工作后C程序才能正常访问变量。否则只能运行不含变量的代码。
更为详细的讲解搜索百度云盘“嵌入式网络那些事LwIP协议深度剖析与实战演练”的第三章3.1.4 ARM连接器。
一个映像文件(image)一般由一个或多个域组成,而往往在image中的位置同域在实际存储器的的位置俱有对应关系。
3)ARM映像文件的存储地址映射
切记:查看代码运行时间仅限于模拟仿真时。
Keil5.14.0.0版本编译通过的程序,在Keil5.12.0.0版本运行时会造成程序的时钟变慢,如果有闪烁指示灯会非常明显的感觉到闪烁变长。
八、watch中添加的变量不能实时更新
Keil相关软件在我的百度云盘中搜索下载。
原来,keil-5 的安装包突然变那么小是因为裁掉了很多老版的设备,如一些 Cortex-M 系列的和 ARM7、9系列的。
3)删除原来的C51,用此C51
4)STC单片机的头文件导入
在使用KEIL的时候,我们要使生成的hex文件转化成bin文件,方便下载或fireware更新,有时候看到的是一个目录,遇到这种情况是什么问题呢!
首先看一下链接脚本,发现里面有几个段的定义,其实我们需要的只是代码段,那么我们只需要修改这条命令为:
这样子我们就达到了我们所需要的bin文件,它可以把多个负载段生成一个输出文件。
1、打开一个测试通过的工程
如果本来要打包的库文件里面的代码有错的话,打包成库后也是不能用的,这步是关键
测试没有问题后将不需要的部分删除
3、切记:需要重新编译,即可在原本生成Hex文件的目录下找到*.lib文件
4、打开原工程,只需将原来的dsp_g2.c文件移除,添加进该.lib文件即可使用
5、使用指令生成.lib文件(Keil C51测试通过)
1)在编译通过的工程目录里找到delay1s.obj和delay5ms.obj文件,复制到Keil安装目录下的BIN文件夹内。
2)打开上图中突显的LIB51.EXE。在上面输入以下代码:
3)这时在BIN中就出现了mylib.lib文件,它已经被添加了之前的两个延时程序。
4)复制这个库到LIB中,并添加进该.lib文件即可使用
使用指令生成.lib文件在Keil MDK中测试没有通过。
十三、C文件生成静态库()