单片机keil里const u8 a[] 和u8 const a[]有区别吗?

【一个专注于嵌入式软件架构设计的新生代农名工】

这家伙很懒,什么也没写!

【架构师李肯】 【一个专注于嵌入式软件架构设计的新生代农名工】

这家伙很懒,什么也没写!

一、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.objdelay5ms.obj文件,复制到Keil安装目录下的BIN文件夹内。

2)打开上图中突显的LIB51.EXE。在上面输入以下代码:

3)这时在BIN中就出现了mylib.lib文件,它已经被添加了之前的两个延时程序。

4)复制这个库到LIB中,并添加进该.lib文件即可使用

使用指令生成.lib文件Keil MDK中测试没有通过。

十三、C文件生成静态库()

我要回帖

更多关于 keil怎么把程序烧录进单片机 的文章