跳转到主要内容

Keil相关

编写优质嵌入式C程序

kelly /

摘要:本文首先分析了C语言的陷阱和缺陷,对容易犯错的地方进行归纳整理;分析了编译器语义检查的不足之处并给出防范措施,以Keil MDK编译器为例,介绍了该编译器的特性、对未定义行为的处理以及一些高级应用;在此基础上,介绍了防御性编程的概念,提出了编程过程中就应该防范于未然的多种措施;提出了测试对编写优质嵌入式程序的重要作用以及常用测试方法;最后,本文试图以更高的层次看待编程,讨论一些通用的编程思想。

<strong>1、简介</strong>

市面上介绍C语言以及编程方法的书数目繁多,但对如何编写优质嵌入式C程序却鲜有介绍,特别是对应用于单片机、ARM7、Cortex-M3这类微控制器上的优质C程序编写方法几乎是个空白。本文面向的,正是使用单片机、ARM7、Cortex-M3这类微控制器的底层编程人员。

编写优质嵌入式C程序绝非易事,它跟设计者的思维和经验积累关系密切。嵌入式C程序员不仅需要熟知硬件的特性、硬件的缺陷等,更要深入一门语言编程,不浮于表面。为了更方便的操作硬件,还需要对编译器进行深入的了解。

什么是边界扫描(boundary scan)?

kelly /

边界扫描(Boundary scan)是一项测试技术,是在传统的在线测试不在适应大规模,高集成电路测试的情况下而提出的,就是在IC设计的过程中在IC的内部逻辑和每个器件引脚间放置移位寄存器(shift register)。每个移位寄存器叫做一个CELL。这些CELL准许你去控制和观察每个输入/输出引脚的状态。当这些CELL连在一起就形成了一个数据寄存器链(data register chain),我门叫它边界寄存器(boundaryregister)。除了上面的移位寄存器外,在IC上还集成测试访问端口控制器(TAP controller),指令寄存器(Instruction register)对边界扫描的指令进行解码以便执行各种测试功能。旁路寄存器(bypass register)提供一个最短的测试通路。另外可能还会有IDCODE register和其它符合标准的用户特殊寄存器。

边界扫描器件典型特征及边界扫描测试信号的构成。

如果一个器件是边界扫描器件它一定有下面5个信号中的前四个:

1.TDI (测试数据输入)

2.TDO(侧试数据输出)

3.TMS(测试模式选择输入)

4.TCK(测试时钟输入)

5.TRST(测试复位输入,这个信号是可选的)

keil MDK中如何生成*.bin格式的文件

kelly /

在Realview MDK的集成开发环境中,默认情况下可以生成*.axf格式的调试文件和*.hex格式的可执行文件。虽然这两个格式的文件非常有利于ULINK2仿真器的下载和调试,但是ADS的用户更习惯于使用*.bin格式的文件,甚至有些嵌入式软件开发者已经拥有了*.bin格式文件的调试或烧写工具。为了充分地利用现有的工具,同时发挥Realview MDK集成开发环境的优势,将*.axf格式文件或*.hex格式文件转换成*.bin格式的文件是十分自然的想法。本文将详细的探讨这种转换方法。

在Realview MDK中,生成*.bin格式文件的工具是ARM公司的RVCT开发套件中的fromelf.exe。默认安装下,它位于C/:Keil/ARM/BIN40文件夹下。

下面将介绍它在Keil MDK中的使用方法:

1. 新建一个工程,例如test.uvproj;

2. 打开Options for Target ‘target 1’对话框,选择User标签页;

【下载】MDK pack文件(MM32x103_DFP.1.1.0.pack文件包)

kelly /

Keil MDK,也称MDK-ARM,Realview MDK、I-MDK、uVision4 等。MDK-ARM软件为基于Cortex-M、Cortex-R4、ARM7、ARM9处理器设备提供了一个完整的开发环境。 MDK-ARM专为微控制器应用而设计,不仅易学易用,而且功能强大,能够满足大多数苛刻的嵌入式应用。

MDK-ARM有四个可用版本,分别是MDK-Lite、MDK-Basic、MDK-Standard、MDK-Professional。所有版本均提供一个完善的C / C++开发环境,其中MDK-Professional还包含大量的中间库。

MDK功能特点

1、完美支持Cortex-M、Cortex-R4、ARM7和ARM9系列器件。

2、行业领先的ARM C/C++编译工具链

3、确定的Keil RTX ,小封装实时操作系统(带源码)

4、μVision4 IDE集成开发环境,调试器和仿真环境

5、TCP/IP网络套件提供多种的协议和各种应用

6、提供带标准驱动类的USB 设备和USB 主机栈

7、为带图形用户接口的嵌入式系统提供了完善的GUI库支持

【下载】MDK pack文件(MM32x031_DFP.1.1.0.pack文件包)

kelly /

Keil MDK,也称MDK-ARM,Realview MDK、I-MDK、uVision4 等。MDK-ARM软件为基于Cortex-M、Cortex-R4、ARM7、ARM9处理器设备提供了一个完整的开发环境。 MDK-ARM专为微控制器应用而设计,不仅易学易用,而且功能强大,能够满足大多数苛刻的嵌入式应用。

MDK-ARM有四个可用版本,分别是MDK-Lite、MDK-Basic、MDK-Standard、MDK-Professional。所有版本均提供一个完善的C / C++开发环境,其中MDK-Professional还包含大量的中间库。

<strong>MDK功能特点</strong>

1、完美支持Cortex-M、Cortex-R4、ARM7和ARM9系列器件。

2、行业领先的ARM C/C++编译工具链

3、确定的Keil RTX ,小封装实时操作系统(带源码)

4、μVision4 IDE集成开发环境,调试器和仿真环境

5、TCP/IP网络套件提供多种的协议和各种应用

6、提供带标准驱动类的USB 设备和USB 主机栈

7、为带图形用户接口的嵌入式系统提供了完善的GUI库支持

Proteus8与Keil4的联接调试教程

kelly /

首先安装vdmagdi软件,然后再进行以下设置:

下载地址:http://pan.baidu.com/s/1i30ultb

在Keil软件上单击“Project菜单/Options for Target”选项或者点击工具栏的“option for ta rget”按钮 ,

<center><img src="http://mm32.eetrend.com/files/2016-08/wen_zhang_/100002669-8622-1.png&q…; alt=""></center>

弹出窗口,点击“Debug”按钮,出现如图所示页面。

在 出现的对话框里在右栏上部的下拉菜单里选中“Proteus VSM Monitor-51 Driver”。并且还要点击一下“Use”前面表明选中的小圆点。

Keil MDK下如何设置非零初始化变量

kelly /

一些工控产品,当系统复位后(非上电复位),可能要求保持住复位前RAM中的数据,用来快速恢复现场,或者不至于因瞬间复位而重启现场设备。而keil mdk在默认情况下,任何形式的复位都会将RAM区的非初始化变量数据清零。如何设置非初始化数据变量不被零初始化,这是本篇文章所要探讨的。

在给出方法之前,先来了解一下代码和数据的存放规则、属性,以及复位后为何默认非初始化变量所在RAM都被初始化为零了呢。

什么是初始化数据变量,什么又是非初始化数据变量?(因为我的文字描述不一定准确,所以喜欢举一些例子来辅助理解文字。)

定义一个变量:int nTimerCount=20;变量nTimerCount就是初始化变量,也就是已经有初值;

如果定义变量:int nTimerCount;变量nTimerCount就是一个非赋值的变量,Keil MDK默认将它放到属性为ZI的输入节。

那么,什么是“ZI”,什么又是“输入节”呢?这要了解一下ARM映像文件(image)的组成了,这部分内容略显无聊,但我认为这是非常有必要掌握的。

ARM映像文件的组成:

一个映像文件由一个或多个域(region,也有译为“区”)组成

每个域包含一个或多个输出段(section,也有译为“节”)

几个预编译指令的用法

kelly /

预处理过程扫描源代码,对其进行初步的转换,产生新的源代码提供给编译器。可见预处理过程先于编译器对源代码进行处理。

在C语言中,并没有任何内在的机制来完成如下一些功能:在编译时包含其他源文件、定义宏、根据条件决定编译时是否包含某些代码。要完成这些工作,就需要使用预处理程序。尽管在目前绝大多数编译器都包含了预处理程序,但通常认为它们是独立于编译器的。预处理过程读入源代码,检查包含预处理指令的语句和宏定义,并对源代码进行响应的转换。预处理过程还会删除程序中的注释和多余的空白字符。
  
预处理指令是以#号开头的代码行。#号必须是该行除了任何空白字符外的第一个字符。#后是指令关键字,在关键字和#号之间允许存在任意个数的空白字符。整行语句构成了一条预处理指令,该指令将在编译器进行编译之前对源代码做某些转换。下面是部分预处理指令:

指令 用途

# 空指令,无任何效果

#include 包含一个源代码文件

#define 定义宏

#undef 取消已定义的宏

Keil程序调试窗口

kelly /

本文将介绍Keil提供各种窗口如输出窗口、观察窗口、存储器窗口、反汇编窗口、串行窗口等的用途,以及这些窗口的使用方法,并通过实例介绍这些窗口在调试中的使用。

一、程序调试时的常用窗口
  
Keil软件在调试程序时提供了多个窗口,主要包括输出窗口(Output Windows)、观察窗口(Watch&Call Statck Windows)、存储器窗口(Memory Window)、反汇编窗口(Dissambly Window)串行窗口(Serial Window)等。进入调试模式后,可以通过菜单View下的相应命令打开或关闭这些窗口。

<center><img src="http://mm32.eetrend.com/files/2016-08/wen_zhang_/100002599-8337-1.jpg&q…; alt=""></center>

Keil的调试命令、在线汇编与断点设置

kelly /

如何建立工程、汇编、连接工程,并获得目标代码,这仅仅代表你的源程序没有语法错误,至于源程序中存在着的其它错误,必须通过调试才能发现并解决,事实上,除了极简单的程序以外,绝大部份的程序都要通过反复调试才能得到 正确的结果,因此,调试是软件开发中重要的一个环节,本文将介绍常用的调试命令、利用在线汇编、各种设置断点进行程序调试的方法,并通过实例介绍这些方法的使用。

<strong>一、常用调试命令</strong>
  
在对工程成功地进行汇编、连接以后,按 Ctrl+F5 或者使用菜单 Debug->Start/Stop Debug Session 即可进入调试状态,Keil 内建了一个仿真 CPU 用来模拟执行程序,该仿真 CPU 功 能强大,可以在没有硬件和仿真机的情况下进行程序的调试,下面将要学的就是该模拟调试 功能。不过在学习之前必须明确,模拟毕竟只是模拟,与真实的硬件执行程序肯定还是有区 别的,其中最明显的就是时序,软件模拟是不可能和真实的硬件具有相同的时序的,具体的 表现就是程序执行的速度和各人使用的计算机有关,计算机性能越好,运行速度越快。