keil中的Code RO-data RW-dat ZI-data

keil中的Code RO-data RW-dat ZI-data
keil中的Code RO-data RW-dat ZI-data

ARM开发总结的小知识

字节8位

半字16位

字32位

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,RW-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]

用户模式(usr):ARM处理器正常的程序执行状态。10000

快速中断模式(fiq):用于高速数据传输或通道处理。10001

外部中断模式(irq):用于通用的中断处理。10010

管理模式(svc):操作系统使用的保护模式。10011

数据访问终止模式(abt):当数据或指令预取终止时进入该模式,可用于虚拟存储及存储保护。

10111

系统模式(sys):运行具有特权的操作系统任务。11111

定义指令中止模式(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

CODE SIZE, RO DA TA, RW DA TA, ZI DA TA, idata, pdata---project Map 文件解读(一) optimization project时,开始往往是关注一时间性能,如codec mips或MCPS等。当时间性能达到了要求时,往往还会加入size这一参数来作比较,这时就要考虑各种各样的size。

这一性能参数可能在project requirements book中有明显的说明,在test performance result或在release note中也有更加准备的数据记录。

如下表:

Program ROM Data RAM ROM Table

Scratch Stack Static

XX XX XX XX XX

首先我们要弄清楚这些size的含义以及所反应的性能意义。

1、CODE SIZE, RO DA TA, RW DA TA, ZI DA TA

上面这些变量是在ARM 开发环境下会出现的数值,可以在armlink中加一些参数,得到相应有.map文件,从中就能准确的获取这些值,有一篇文章详细说明这些含义:

ARM程序(指在ARM系统中正在执行的程序,而非保存在ROM中的bin文件)的组成

一个ARM程序包含3部分:RO段,RW段和ZI段

RO是程序中的指令和常量

RW是程序中的已初始化变量

ZI是程序中的未初始化的变量

由以上3点说明可以理解为:

RO就是readonly,

RW就是read/write,

ZI就是zero

ARM映像文件的组成

所谓ARM映像文件就是指烧录到ROM中的bin文件,也成为image文件。以下用Image 文件来称呼它。

Image文件包含了RO和RW数据。

之所以Image文件不包含ZI数据,是因为ZI数据都是0,没必要包含,只要程序运行之前将ZI数据所在的区域一律清零即可。包含进去反而浪费存储空间。

Q:为什么Image中必须包含RO和RW?

A:因为RO中的指令和常量以及RW中初始化过的变量是不能像ZI那样“无中生有”的。ARM程序的执行过程

从以上两点可以知道,烧录到ROM中的image文件与实际运行时的ARM程序之间并不是完全一样的。因此就有必要了解ARM程序是如何从ROM中的image到达实际运行状态的。实际上,RO中的指令至少应该有这样的功能:

1. 将RW从ROM中搬到RAM中,因为RW是变量,变量不能存在ROM中。

2. 将ZI所在的RAM区域全部清零,因为ZI区域并不在Image中,所以需要程序根据编译器给出的ZI地址及大小来将相应得RAM区域清零。ZI中也是变量,同理:变量不能存在ROM中

在程序运行的最初阶段,RO中的指令完成了这两项工作后C程序才能正常访问变量。否则只能运行不含变量的代码。

说了上面的可能还是有些迷糊,RO,RW和ZI到底是什么,下面我将给出几个例子,最直观的来说明RO,RW,ZI在C中是什么意思。

具体的链接:https://www.360docs.net/doc/f8411558.html,/whyspai/blog/item/d1815fa99c3da6fb1e17a283.html

本文来自CSDN博客,转载请标明出处:https://www.360docs.net/doc/f8411558.html,/winmenaruto/archive/2011/03/17/6256770.aspx

keil c51 详细中文手册

Keil C51使用详解 V1.0 第一章 Keil C51开发系统基本知识 (6) 第一节系统概述 (6) 第二节Keil C51单片机软件开发系统的整体结构 (6)

1. C51 for Dos 7 2. C51 for Windows的安装及注意事项: (7) 第四节Keil C51工具包各部分功能及使用简介 (7) 1. C51与A51. 7 2. L51和BL51. 8 3. DScope51,Tscope51及Monitor51. 8 4. Ishell及uVision. 9 第二章 Keil C51软件使用详解 (10) 第一节Keil C51编译器的控制指令 (10) 1. 源文件控制类 (10) 2. 目标文件(Object)控制类: (10) 3. 列表文件(listing)控制类: (10) 第二节dScope51的使用 (11) 1. dScope51 for Dos 11 2. dScope for Windows 12 第三节Monitor51及其使用 (13) 1. Monitor51对硬件的要求 (13) 2. Mon51的使用 (13) 3. MON51的配置 (13) 4. 串口连接图: (13) 5. MON51命令及使用 (14) 第四节集成开发环境(IDE)的使用 (14) 1. Ishell for Dos的使用 (14) 2. uVision for windows的使用 (15) 第三章 Keil C51 vs 标准C.. 15

第二节内存区域(Memory Areas): (16) 1. Pragram Area: (16) 2. Internal Data Memory: 16 3. External Data Memory. 16 4. Speciac Function Register Memory. 16 第三节存储模式 (16) 1. Small模式 (16) 2. Compact模式 (17) 3. large模式 (17) 第四节存储类型声明 (17) 第五节变量或数据类型 (17) 第六节位变量与声明 (17) 1. bit型变量 (17) 2. 可位寻址区说明20H-2FH.. 18 第七节Keil C51指针 (18) 1. 一般指针 (18) 2. 存储器指针 (18) 3. 指针转换 (18) 第八节Keil C51函数 (19) 1. 中断函数声明: (19) 2. 通用存储工作区 (19) 3. 选通用存储工作区由using x声明,见上例。 (19) 4. 指定存储模式 (19) 5. #pragma disable. 19 6. 递归或可重入函数指定 (19)

KEIL51调试时一些的错误总结

KEIL51调试时一些的错误总结 (1)提示无M51文件 编译时候提示: F:\...\XX.M51 File has been changed outside the editor, reload ? ------ 解决方法: 重新生成项目,产生STARTUP.A51即可。 (2)L15重复调用 ***WARNING L15: MULTIPLE CALL TO SEGMENT SEGMENT: ?PR?SPI_RECEIVE_WORD?D_SPI CALLER1: ?PR?VSYNC_INTERRUPT?MAIN CALLER2: ?C_C51STARTUP 该警告表示连接器发现有一个函数可能会被主函数和一个中断服务程序(或者调用中断服务程序的函数)同时调用,或者同时被多个中断服务程序调用。 出现这种问题的原因之一是这个函数是不可重入性函数,当该函数运行时它可能会被一个中断打断,从而使得结果发生变化并可能会引起一些变量形式的冲突(即引起函数内一些数据的丢失,可重入性函数在任何时候都可以被ISR 打断,一段时间后又可以 运行,但是相应数据不会丢失)。 原因之二是用于局部变量和变量(暂且这样翻译,arguments,[自变量,变元一数值,用于确定程序或子程序的值])的内存区被其他函数的内存区所覆盖,如果该函数被中断,则它的内存区就会被使用,这将导致其他函数的内存冲突。 例如,第一个警告中函数WRITE_GMVLX1_REG 在D_GMVLX1.C 或者 D_GMVLX1.A51被定义,它被一个中断服务程序或者一个调用了中断服务程序的 函数调用了,调用它的函数是VSYNC_INTERRUPT,在MAIN.C中。 解决方法: 如果你确定两个函数决不会在同一时间执行(该函数被主程序调用并且中断被禁止),并且该函数不占用内存(假设只使用寄存器),则你可以完全忽略这种警告。 如果该函数占用了内存,则应该使用连接器(linker)OVERLAY指令将函数从覆盖分析(overlay analysis)中除去,例如: OVERLAY (?PR?_WRITE_GMVLX1_REG?D_GMVLX1 ! *) 上面的指令防止了该函数使用的内存区被其他函数覆盖。如果该函数中调用了其他函数,而这些被调用在程序中其他地方也被调用,你可能会需要也将这些函数排除在覆盖分析(overlay analysis)之外。这种OVERLAY指令能使编译器除去上述警告信息。 如果函数可以在其执行时被调用,则情况会变得更复杂一些。这时可以采用以下几种方法:

单片机Keil C51软件的使用方法

Keil C51软件的使用 Keil C51 软件是众多单片机应用开发的优秀软件之一,它集编辑、编译、仿真于一体,支持汇编和C 语言的程序设计,界面友好、易学易用。下面介绍Keil C51软件的使用方法: 1.启动Keil C51,界面如下图。 启动Keil C51时的屏幕 进入Keil C51后的编辑界面 2.建立一个新工程。

(1)单击工程菜单,在弹出的下拉菜单中选中新建工程选项。 (2)然后选择你要保存的路径,输入工程文件的名字,比如保存到C51目录里,工程文件的名字为C51,如下图所示,然后点击保存。 (3)这时会弹出一个对话框,要求你选择单片机的型号,你可以根据你使用的单片机来选择,Keil C51几乎支持所有的51核的单片机,我这里还是以大家用的比较多的Atmel 的89C51来说明,如下图所示,选择89C51之后,右边栏是对这个单片机的基本的说明,然后点击确定。

(4)完成上一步骤后,屏幕如下图所示。 (5)单击文件菜单,再在下拉菜单中单击新建选项,屏幕如下图所示。

此时光标在编辑窗口里闪烁,这时可以键入用户的应用程序了,建议首先保存该空白的文件,单击文件菜单,在下拉菜单中选中另存为选项单击,屏幕如下图所示,在文件名栏右侧的编辑框中,键入欲使用的文件名,同时,必须键入正确的扩展名。 注意,如果用C语言编写程序,则扩展名为.c;如果用汇编语言编写程序,则扩展名必须为.asm。然后,单击保存按钮。

回到编辑界面后,单击目标1前面的+号,然后在源程序组1上单击右键,弹出如下菜单, 然后单击增加文件到组‘源程序组1’,屏幕如下图所示, 选中c51.asm,然后单击Add,屏幕如下图所示,

Keil C 编译器常见警告与错误信息

https://www.360docs.net/doc/f8411558.html,/support/man/docs/c51/c51_c277.htm错误信息查询 Keil C 编译器常见警告与错误信息 error C132 :“****”not in formal parameter list 花了偶将近半个小时来查找错误,最终发现原来是在头文件里的一个函数声明时露了一个分号造成紧挨着在它下面声明的参数not in formal parameter list。 记在在这里,免得以后忘记了,同时也供大家分享。 下面是另外一些常见的错误提示: 1.第一种错误信息 ***WARNING L15: MULTIPLE CALL TO SEGMENT SEGMENT: ?PR?_WRITE_GMVLX1_REG?D_GMVLX1 CALLER1: ?PR?VSYNC_INTERRUPT?MAIN CALLER2: ?C_C51STARTUP ***WARNING L15: MULTIPLE CALL TO SEGMENT SEGMENT: ?PR?_SPI_SEND_WORD?D_SPI CALLER1: ?PR?VSYNC_INTERRUPT?MAIN CALLER2: ?C_C51STARTUP ***WARNING L15: MULTIPLE CALL TO SEGMENT SEGMENT: ?PR?SPI_RECEIVE_WORD?D_SPI CALLER1: ?PR?VSYNC_INTERRUPT?MAIN CALLER2: ?C_C51STARTUP - 该警告表示连接器发现有一个函数可能会被主函数和一个中断服务程序(或者调用中断服务程序的函数)同时调用,

Keil C51 集成开发环境的使用实验报告

Keil C51 集成开发环境的使用 姓名:专业:学号:成绩: 一、实验目的 1、熟悉Kei C51集成开发环境的基本操作; 2、掌握简单Kei C51和汇编程序的编写、调试。 二、实验内容 1、仔细阅读教材相关内容,掌握KeiC51集成开发环境的基本功能; 2、分别用汇编和C51编写清零程序,把片外RAM中的7000H-70FFH单元 中内容清零; 3、分用汇编和C51编写查找相同个数程序。统计片外RAM7000H-700FH中 “00H”的个数并保存在片内RAM30H单元中。 三、实验原理与步骤 1、清零程序 (1)汇编语言程序设计框图 (2)实验步骤 用连续或单步方式运行程序,检查7000H-70FFH单元中执行内容变化。 (3)假使把7000H-70FFH中的内容改成FFH,如何修改程序。 (4)用C51 重新编写该程序,运行并查看结果。 2、查找相同数个数 (1)汇编语言程序设计框图

(2)实验步骤 ①在7000H-700FH单元中放入随机数,其中几个单元输入0; ②用连续或单步方式运行程序; ③观察片内RAM 30H的内容,应显示“00H”的个数。 (3)用C51重新编写程序,运行并查看结果。 四、实验程序 1、清零程序 (1)汇编语言 ORG 0000H MOV R0,#0100H MOV DPTR,#7000H MOV A,#0 LOOP:MOVX @DPTR,A INC DPTR DJNZ R0,LOOP END (2) C语言 #include void main() { char xdata *p=0x7000; int t=0x7100-0x7000 ; while(t--) {*p=00; p++; } } 2、查找相同数个数

KEIL常见编译错误大全

KEIL常见编译错误大全 【致命错误】 立即终止编译这些错误通常是命令行指定的无效选项的结果当编译器不 能访问一个特定的源包含文件时也产生致命错误 致命错误信息采用下面的格式 C51FATAL-ERROR– ACTION: LINE: ERROR: C51TERMIANTED. C51FATAL-ERROR– ACTION: FILE: ERROR: C51TERMIANTED. 下面说明Action和Error中可能的内容 Actions ALLOCATING MEMORY 编译器不能分配足够的存储区来编译指定的源文件. CREATING LIST-FILE/OBJECT-FILE/WORKFILE 编译器不能建立列表文件,OBJ文件,或工作文件这个错误的出现可能是磁盘满或写保护,或文件已存在和只读. GENERATING INTERMEDIATE CODE 源文件包含的一个函数太大,不能被编译器编译成虚拟代码.尝试把函数分小或重新编译. OPENING INPUT-FILE 编译器不能发现或打开所选的源或包含文件. PARSING INVOKE-/#PRAGMA-LINE 当在命令行检测到参数计算,或在一个#pragma中检测到参数计算,就产生这样的错误. PARSING SOURCE-FILE/ANALYZING DECLARATIONS 源文件包含太多的外部参考.减少源文件访问的外部变量和函数的数目. WRITING TO FILE

Keil编译常见问题

Error: L6200E Error: L6200E: Symbol temp multiply defined (by and .在编译的时候出现了这个问题,但是检查不出来,希望各位大侠帮帮忙 什么变量你给付了两次值 你看看是不是那个外部变量你又给赋值了 申明,其他.c文件对应的.h文件中用extern引用 error: #20 error: #20: identifier "TIM2_IRQChannel" is undefined 谁能说说,哪里错了 你的固件库里的库文件没有添加进工程里面,所以出现未定义的情况。 TIM2_IRQChannel指定时器2的中断通道没有定义,其实在固件库对这些参数都有定义,宏定义代替了一串寄存器地址数据。需要将.C文件添加到工程文件中 warning: #1-D (7): warning: #1-D: last line of file ends without a newline 当使用keil编译时,弹出这样的警告信息:(7): warning: #1-D: last line of file ends without a newline 这个是由于在main函数的“}”后,没有加回车。 只要在main函数的“}”后加回车键,此警告信息即可消除。 error:#65 ...(27):error:#65:expected a ";"

分数送你了,问题在你回答之前已经解决了,头文件里的结构体定义里的最后一行没有加";" 如NB menu{..}; error:#1113: 折腾了大半天,才搞明白一个空操作的指令 先在网上查有的说是__asm{NOP;},从里调用,可犄角旮旯全找了,也没看到什么的文件。如果直接用,就出现error:#1113:InlineassemblernotpermittedwhengeneratingThumbcode 最后搜索这条错误,知道是因为__asm("指令");这种语法是内联汇编(inlineassembly)的语法。而RMDK下,内联汇编仅支持ARM汇编语言,不支持Thumb或者Thumb-2汇编语言;但内嵌汇编器支持Thumb和Thumb-2。 __asm放到一个单独的子函数再被调用就没问题了 如下: __asmvoidnop(void) { NOP } 然后在之后的C代码中调用该函数: voidmain() { ... nop(); ...? }

KeilC51使用详解

KeilC51使用说明 首先启动Keil μVision2程序,首次进入 Keil μVision2的编辑界面如图1所示,否则,会打开用户前一次处理的工程。 图1 首次进入Keil μVision2的编辑界面 下面通过简单的编程、调试,引导大家学习Keil μVision2软件中Keil Monitor-51 Driver 仿真器的基本使用方法和基本调试技巧。 1 工程的建立 单击“项目->新建项目…”菜单,弹出创建新工程对话框,如图2所示。选择你要保存的路径, 输入工程文件的名字, 不需要输入扩展名。比如保存到JY_E2X00目录里,工程文件的名字为 Test1,如图(2)所示,然后点击“保存”,保存后的文件扩展名为.uv2,这是KeilμVision2项 目文件扩展名。以后我们可以直接点击此文件来打开已创建的工程。 图2 创建新工程对话框

这时会弹出一个对话框,要求选择目标CPU(即用户所用单片机的型号),Keil μVision 几乎支持所有的51内核的单片机,我们以AT89S52芯片为例,如图3所示, 在左侧的Data base列表框中点击Atmel前面的“+”号,展开该层,选中AT89S52,在其右边的Description显示区域。中是对这个单片机的基本描述,然后再点击“确定”按钮. 图3 为工程选择目标CPU 窗口会出现询问是否添加startup.a51,如图4:请选择“否”。 图4 此时,在工程窗口的文件页中,出现了“Target 1”,前面有“+”号,点击“+”号展开,可以看到下一层的“Source Group1”,这时的工程还是一个空的工程,里面什么文件也没有,需要为这个工程添加文件。如图5所示。

Keilc51程序中几种精确延时的方法

Keilc51程序中几种精确延时的方法 单片机因具有体积小、功能强、成本低以及便于实现分布式控制而有非常广泛的应用领域[1]。单片机开发者在编制各种应用程序时经常会遇到实现精确延时的问题,比如按键去抖、数据传输等操作都要在程序中插入一段或几段延时,时间从几十微秒到几秒。有时还要求有很高的精度,如使用单总线芯片DS18B20时,允许误差范围在十几微秒以内[2],否则,芯片无法工作。用51汇编语言写程序时,这种问题很容易得到解决,而目前开发嵌入式系统软件的主流工具为C语言,用C51写延时程序时需要一些技巧[3]。因此,在多年单片机开发经验的基础上,介绍几种实用的编制精确延时程序和计算程序执行时间的方法。 实现延时通常有两种方法:一种是硬件延时,要用到定时器/计数器,这种方法可以提高CPU的工作效率,也能做到精确延时;另一种是软件延时,这种方法主要采用循环体进行。 1 使用定时器/计数器实现精确延时 单片机系统一般常选用11.059 2 MHz、12 MHz或6 MHz晶振。第一种更容易产生各种标准的波特率,后两种的一个机器周期分别为1 μs和2 μs,便于精确延时。本程序中假设使用频率为12 MHz的晶振。最长的延时时间可达216=65 536 μs。若定时器工作在方式2,则可实现极短时间的精确延时;如使用其他定时方式,则要考虑重装定时初值的时间(重装定时器初值占用2个机器周期)。 在实际应用中,定时常采用中断方式,如进行适当的循环可实现几秒甚至更长时间的延时。使用定时器/计数器延时从程序的执行效率和稳定性两方面考虑都是最佳的方案。但应该注意,C51编写的中断服务程序编译后会自动加上PUSH ACC、PUSH PSW、POP PSW和POP ACC语句,执行时占用了4个机器周期;如程序中还有计数值加1语句,则又会占用1个机器周期。这些语句所消耗的时间在计算定时初值时要考虑进去,从初值中减去以达到最小误差的目的。 2 软件延时与时间计算 在很多情况下,定时器/计数器经常被用作其他用途,这时候就只能用软件方法延时。下面介绍几种软件延时的方法。 2.1 短暂延时 可以在C文件中通过使用带_NOP_( )语句的函数实现,定义一系列不同的延时函数,如Delay10us( )、Delay25us( )、Delay40us( )等存放在一个自定义的C文件中,需要时在主程序中直接调用。如延时10 μs的延时函数可编写如下: void Delay10us( ) { _NOP_( ); _NOP_( );

如何使用KeilC51创建一个工程文件

如何使用KeilC51创建一个工程文件 建立一个项目: 点击工程菜单中选择弹出的下拉式菜单中的新建工程...,接着弹出一个标准Windows 文件对话窗口,在"文件名"中输入您的第一个程序项目名称,这里我们用"test",这是笔者惯用的名称,大家不必照搬就是了,只要符合Windows文件规则的文件名都行。"保存"后的文件扩展名为uv2,这是KEIL uVision2项目文件扩展名,以后我们可以直接点击此文件以打开先前做的项目 。 这时会弹出让你选择单片机型号的对话框,我们选择A TMEL---A T89C51

然后点击Target 1前面的“+”,出现Source Group 1,选中右键点选“增加文件到组Source Group 1” 这时选择文件类型为Asm 源文件,再选中001.asm文件,再按添加,在随后出现的提示框中按“确定” 仿真器采用Mon51协议,在使用之前应必须对软件项目进行如下设置: 1、单击工程菜单,再在下拉菜单中单击"目标target 1属性" 在下图中,单击"Target"输入仿真器的工作频率(11.0592MHz)

2、在调试菜单中点选"Keil Monitor-51 Driver",即选择了STC89C516RD硬件仿真器。 3、单击“R外围设备”选Target Setup设置选项选择您要使用串口(必须和实际相符合),波特率38400。 如果被仿真的目标板使用12MHZ或者是11.0592MHZ晶振时波特率选择38400,如果被仿真的目标板使用6MHZ晶振时波特率选择18400。

4、如果需要生成HEX代码给编程器烧写芯片的话,需要选中“生成HEX 文件”的选项,按钮“选择OBJ文件夹...”是用来选择最终HEX文件的存放目录的。 5、按F7快捷键可以进行编译,编译成功后如会出现上图红箭头所指的文字,表示编译成

Keil编程常见错误

uint i, j; uchar a = 0xfe; EA = 1; EX0 = 1;不能这样 EA = 1; EX0 = 1; uint i, j; uchar a = 0xfe; 否则出现外部中断.C(18): error C141: syntax error near 'unsigned' 外部中断.C(18): error C202: 'i': undefined identifier 外部中断.C(19): error C141: syntax error near 'unsigned' 外部中断.C(19): error C202: 'a': undefined identifier 外部中断.C(23): error C202: 'i': undefined identifier 外部中断.C(27): error C202: 'a': undefined identifier 外部中断.C(29): error C202: 'a': undefined identifier 外部中断.C(31): error C202: 'i': undefined identifier 外部中断.c - 8 Error(s), 0 Warning(s). 原因:顺序问题,keil中的顺序 外部中断和内部中断的区别是什么; 外部中断是在单片机的外面给单片机一个信号单片机收到这个信号开始中断这是外部中断 内部中断是通过软件把中断打开执行中断

error c236:‘——display’:different length of parameter lists参数列表的长度不同。 检查开始的函数声明和这定义的参数是否一致。 还有参数没说明类型 有很大的区别, 错误3 unreferenced local variable 是未使用定义的变量,就是你定义了但是没有使用。 错误4 syntax error语法错误。 电平触发方式是按照电平的高或者低来触发,所以用的时候,必须在发生触发事件后立即将电平拉到非触发电平上,如果不这样做的话,会导致程序一直在触发事件程序入口处,而不会执行其他地方的程序。所以一般比较少用。 边沿触发方式是按照(上或下)边沿触发事件,由于触发的条件是边沿(上或下),所以即使在触发事件后,保存原来的电平都没有关系,不会一直在触发的,一般都用这种方式。 错误5 #define uchar unsigned char 不能写成 #define unsigned char uchar 否则出现会出现很多错误 错误6 不能这样定义字符数组 int a = “wwwsad”只能用char 错误7 error C244: 'table':can't initialize, bad type or class 。意思是错误的或者坏的类

Keil-C51-基本使用方法 (1) 。。。。2

、Keil C51工程建立与仿真 1、建立一个工程项目,选择芯片并确定选项 双击Keil uVision2快捷图标后进入Keil C51开发环境,单击“工程”菜单,在弹出的下拉菜单选中“新工程”选项,屏幕显示为图1。附录: 一 图1 建立一个工程项目在文件名中输入一个项目名“my-test”,选择保存路径(可在 “我的 文档” 中先建 立一个 同名的

文件夹),单击保存。在随后弹出的“为目标target选择设备”(Select Device for Target “Target1”)对话框中用鼠标单击Atmel前的“+”号,选择“89C51”单片机后按确定,如图2所示。 图 2 选择单片机后按确定 选择主菜单栏中的“工程”,选中下拉菜单中“Options for Target ‘Target1’”,出现图3所示的界面。单击“target”页面,在晶体Xtal(MHz)栏中选择试验板的晶振频率,默认为24MHz,我们讲座试验板的晶振频率为11.0592MHz,因此要将24.0改为11.0592。然后单击输出“Output”页面,在“建立hex格式文件”前打勾选中,如图3-4。其它采用默认设置,然后点确定。 图3 选择Target

页面 图4 选择Output页面 2、建立源程序文件 图 5 建立源程序文件

程序输入完成后,选择“文件”,在下拉菜单中选中“另存为”,将该文件以扩展名为.asm格式(如my-test.asm)保存在刚才所建立的一个文件夹中(my-test)。 3、添加文件到当前项目组中 单击工程管理器中“Target 1”前的“+”号,出现“Source Group1”后再单击,加亮后右击。在出现的下拉窗口中选择“Add Files to Group‘Source Group1’”,如图6所示。在增加文件窗口中选择刚才以asm格式编辑的文件my-test.asm,鼠标单击“ADD”按钮,这时my-test.asm文件便加入到Source Group1这个组里了,随后关闭此对话窗口。 图 6 添加文件到当前项目组中 4、编译(汇编)文件 选择主菜单栏中的“工程”,在下拉菜单中选中“重建

keil c语言编程常见错误分析要点

1. Warning 280:’i’:unreferenced local variable 说明局部变量i 在函数中未作任何的存取操作解决方法消除函数中i 变量的宣告及即定义的参数在程序中并未调用 2 Warning 206:’Music3’:missing function-prototype 说明Music3( )函数未作宣告或未作外部宣告所以无法给其他函数调用 解决方法将叙述void Music3(void)写在程序的最前端作宣告如果是其他文件的函数则要写成extern void Music3(void),即作外部宣告 3Error:318:can’t open file ‘beep.h’ 说明在编译C:\8051\MANN.C 程序过程中由于main.c 用了指令#i nclude “beep.h”,但却找不到所致解决方法编写一个beep.h 的包含档并存入到c:\8051 的工作目录中 4 Error 237:’LedOn’:function already has a body 说明LedOn( )函数名称重复定义即有两个以上一样的函数名称 解决方法修正其中的一个函数名称使得函数名称都是独立的 5 ***WARNING 16:UNCALLED SEGMENT,IGNORED FOR OVERLAY PROCESS SEGMENT: ?PR?_DELAYX1MS?DELAY 说明DelayX1ms( )函数未被其它函数调用也会占用程序记忆体空间

解决方法去掉DelayX1ms( )函数或利用条件编译#if …..#endif,可保留该函数并不编译 6 ***WARNING 6 :XDATA SPACE MEMORY OVERLAP FROM : 0025H TO: 0025H 说明外部资料ROM 的0025H 重复定义地址 解决方法外部资料ROM 的定义如下Pdata unsigned char XFR_ADC _at_0x25 其中XFR_ADC 变量的名称为0x25,请检查是否有其它的变量名称也是定义在0x25 处并修正它 7 WARNING 206:’DelayX1ms’: missing function-prototype C:\8051\INPUT.C Error 267 :’DelayX1ms ‘:requires ANSI-style prototype C:\8051\INPUT.C 说明程序中有调用DelayX1ms 函数但该函数没定义即未编写程序内容或函数已定义但未作宣告 解决方法编写DelayX1ms 的内容编写完后也要作宣告或作外部宣告可在delay.h 的包含档宣告成外部以便其它函数调用 8 ***WARNING 1:UNRESOLVED EXTERNAL SYMBOL SYMBOL:MUSIC3

keil+c51教程

Keil uVision2的使用 Keil uVision2是目前使用广泛的单片机开发软件,它集成了源程序编辑和程序调试于一体,支持汇编、C、PL/M语言。 这里我们仅仅介绍Keil uVision2的简单使用,更详细的使用方法见本光盘单片机软件\Keil c51\Keil书籍与资料目录中的内容。 keil C51v6.12的安装: 先运行光盘中单片机软件\setup\setup.exe安装程序,选择安装“Eval Version”版进行安装。一直点击“Yes”或“Next”,直到“Finish”完成。 之后运行同目录中的Keil uv2汉化安装.exe安装汉化程序。 安装好后,在桌面上会产生快捷图标,如下图: keil C51v6.12的使用: 点击桌面快捷图标,可以直接进入主画面:

序。 在Keil系统中,每做个独立的程序,都视为工程(或者叫项目)。首先从菜但的“工程”中“新建工程...”,建立我们将要做的工程项目: 新建的工程要起个与工程项目意义一致的名字,可以是中文名;我们这里的程序是实验测试程序,所以起的名字为Test,并将Test工程“保存”到 C:\Keil下:

接下来,Keil环境要求我们为Test工程选择一个单片机型号;我们选择Atmel公司的89C51(虽然我们使用的是89S51,但由于89S51与89C51内、外部结构完全一样,所以这里依然选择“89C51”)。“确定”后工程项目就算建立了。

立了工程项目,肯定要实施这个工程,现在就为工程添加程序; 点击“文件”中的“新建”,新建一个空白文档;这个空白文档就是让我们编写单片机程序的场所。在这里你可以进行编辑、修改等操作。 根据题意,在文档中写入下列代码:(下列代码你暂时不要管什么意思,只要照抄正确就可以,今后在学习汇编时你会明白的) mov p0,#01010101B;将01010101二进制代码送P0口 ajmp$;程序在此原地踏步 end;程序结束标志 写完后再检查一下,并保存文件,保存文件时,其文件名最好与前面建立的工程名相同(当然这里为Test了),其扩展名必须为.Asm!“文件名”中一定要写全,如:Test.Asm;保存后的文档彩色语法会起作用,将关键字实行彩色显示:

Keil c51的使用及界面翻译

Keil C51的使用方法 Keil C51 软件是众多单片机应用开发的优秀软件之一,它集编辑,编译,仿真于一体,支持汇编,PLM 语言和C 语言的程序设计,界面友好,易学易用。 下面介绍Keil C51软件的使用方法 进入Keil C51 后,屏幕如下图所示。几秒钟后出现编辑界

进入Keil C51后的编辑界面 简单程序的调试 学习程序设计语言、学习某种程序软件,最好的方法是直接操作实践。下面通过简单的编程、调试,引导大家学习Keil C51软件的基本使用方法和基本的调试技巧。 1)建立一个新工程 单击Project菜单,在弹出的下拉菜单中选中New Project选项 2)然后选择你要保存的路径,输入工程文件的名字,比如保存到C51目录里,工程文件的名字为C51 如下图所示,然后点击保存.

3)这时会弹出一个对话框,要求你选择单片机的型号,你可以根据你使用的单片机来选择,keil c51几乎支持所有的51核的单片机,我这里还是以大家用的比较多的Atmel 的89C51来说明,如下图所示,选择89C51之后,右边栏是对这个单片机的基本的说明,然后点击确定. 4)完成上一步骤后,屏幕如下图所示

到现在为止,我们还没有编写一句程序,下面开始编写我们的第一个程序。 5)在下图中,单击“File”菜单,再在下拉菜单中单击“New”选项 新建文件后屏幕如下图所示 此时光标在编辑窗口里闪烁,这时可以键入用户的应用程序了,但笔者建议首先保存该空白的文件,单击菜单上的“File”,在下拉菜单中选中“Save As”选项单击,屏幕如下图所示,在“文件名”栏右侧的编辑框中,键入欲使用的文件名,同时,必须键入正确的扩展名。注意,如果用C语言编写程序,则扩展名为(.c);如果用汇编语言编写

keil常见错误及解决办法

查看文章 【转】 KEIL C编译器常见警告与错误信息的解决办法 2010-09-03 16:21 转载自朝阳暮鼓 最终编辑朝阳暮鼓 KEIL C编译器常见警告与错误信息的解决办法 1. Warning 280:’i’:unreferenced local variab le 说明局部变量i 在函数中未作任何的存取操作 解决方法消除函数中i 变量的宣告 2 Warning 206:’Music3’:missing function-prototype 说明Music3( )函数未作宣告或未作外部宣告所以无法给其他函数调用 解决方法将叙述void Music3(void)写在程序的最前端作宣告如果是其他文件的函数 则要写成extern void Music3(void),即作外部宣告 3 Compling :C:\8051\MANN.C Error:318:can’t open file ‘beep.h’ 说明在编译 C:\8051\MANN.C 程序过程中由于main.c 用了指令#include “beep.h”,但却找不到所致 解决方法编写一个beep.h 的包含档并存入到c:\8051 的工作目录中 4 Compling:C:\8051\LED.C Error 237:’LedOn’:function already has a body 说明LedOn( )函数名称重复定义即有两个以上一样的函数名称 解决方法修正其中的一个函数名称使得函数名称都是独立的 5 ***WARNING 16:UNCALLED SEGMENT,IGNORED FOR OVERLAY PROCESS SEGMENT: ?PR?_DELAYX1MS?DELAY 说明DelayX1ms( )函数未被其它函数调用也会占用程序记忆体空间 解决方法去掉 DelayX1ms( )函数或利用条件编译#if …..#endif,可保留该函数并不编译 6 ***WARNING 6 :XDATA SPACE MEMORY OVERLAP FROM : 0025H TO: 0025H 说明外部资料ROM 的0025H 重复定义地址 解决方法外部资料ROM 的定义如下 Pdata unsigned char XFR_ADC _at_0x25 其中XFR_ADC 变量的名称为0x25,请检查是 否有其它的变量名称也是定义在0x25 处并修正它

单片机开发与仿真软件Keil C51的使用

单片机开发与仿真软件Keil C51的使用 一、Keil C51 操作入门 Keil C51 简介 Keil C51 是德国知名软件公司Keil(现已并入ARM 公司)开发的基于8051 内核的微控制器软件开发平台,是目前开发8051 内核单片机的主流工具。Keil 51支持汇编语言、C语言等各种开发语言。其中,uVision2集成开发环境包含项目管理、源代码编辑和强大的程序调试环境。uVision2调试器是一个强大的全特性调试器,允许用户在PC 机上完全模拟目标程序、指令集和片内外围功能。 实验所用的是Keil C51 评估版。 Keil C51 的启动 双击桌面上的“Keil uVision2”图标,启动Keil C51程序,启动界面如图1所示。 图1 Keil C51的启动界面 建立第1 个Keil C51 程序 Keil C51 是一个功能很强大的软件,但是使用起来并不复杂。现在就通过建立一个简单的LED(发光二极管)闪烁发光的实例来初步掌握Keil C51的基本用法。硬件电路参见图2,单片机I/O 输出低电平可点亮LED。 图2 LED 闪烁发光电路 ●新建工程。执行Keil C51 软件的菜单“Project | N ew Project…”,弹出一个名为“Create

New Project”的对话框。先选择一个合适的文件夹准备来存放工程文件,比如“E:\Project\LedFlash”,其中“LedFlash”是新建的文件夹。建议:今后每新建一个工程都要在适当的磁盘位置新建一个文件夹用来保存工程文件,以方便管理,并养成良好的习惯。最后,为工程取名为“LedFlash”,并保存。参见图3。 图3 新建Keil C51 工程 ●选择CPU。紧接着,Keil C51 提示选择CPU 器件。8051 内核单片机最早是由鼎鼎大 名的Intel 公司发明的,后来其他厂商如Philips 、Atmel 、Winbond 等先后推出其兼容产品,并在8051 的基础上扩展了许多增强功能。在这里可以选择Philips 的第 1 个器件“80/87C51”,该器件与Intel 的8051 完全兼容。参见图4 。 图4 选择CPU ●接下来弹出一个如图5 所示的对话框。该对话框提示是否要把标准8051 的启动代

Keil C51 基本使用方法

附录: 一、Keil C51工程建立与仿真 1、建立一个工程项目,选择芯片并确定选项 双击Keil uVision2快捷图标后进入Keil C51开发环境,单击“工程”菜单,在弹出的下拉菜单选中“新工程”选项,屏幕显示为图1。 图1 建立一个工程项目 在文件名中输入一个项目名“my-test”,选择保存路径(可在“我的文档”中先建立一个同名的文件夹),单击保存。在随后弹出的“为目标target选择设备”(Select Device for Target “Target1”)对话框中用鼠标单击Atmel前的“+”号,选择“89C51”单片机后按确 定,如图2 所示。

图2 选择单片机后按确定 选择主菜单栏中的“工程”,选中下拉菜单中“Options for Target ‘Target1’”,出现图3所示的界面。单击“target”页面,在晶体Xtal(MHz)栏中选择试验板的晶振频率,默认为24MHz,我们讲座试验板的晶振频率为11.0592MHz,因此要将24.0改为11.0592。然后单击输出“Output”页面,在“建立hex格式文件”前打勾选中,如图3-4。其它采用默认设置,然后点确定。 图3 选择Target页面

图4 选择Output页面 2、建立源程序文件 单击“文件”菜单,在下拉菜单中选择“新建”,随后在编辑窗口中输入以下的源程序(如图5)。 ORG 0000H LJMP MAIN ORG 030H MAIN: MOV P0,#00H MOV P1 ,#00H MOV P2 ,#00H MOV P3 ,#00H ACALL DEL MOV P0 ,#0FFH MOV P1 ,#0FFH MOV P2 ,#0FFH MOV P3 ,#0FFH ACALL DEL AJMP MAIN ORG 0200H DEL: MOV R5,#04H F3: MOV R6,#0FFH F2: MOV R7,#0FFH F1: DJNZ R7,F1 DJNZ R6,F2 DJNZ R5,F3 RET END 图5 建立源程序文件 程序输入完成后,选择“文件”,在下拉菜单中选中“另存为”,将该文件以扩展名为.asm

Keil+C编译器常见警告与错误信息的解决方法

??????? 本章列出了编程中可能遇到的致命错误语法错误和警告信息每节包括一个信息 的主要说明和消除错误或警告条件可采取的措施 致命错误 致命错误立即终止编译这些错误通常是命令行指定的无效选项的结果当编译器不能访问一个特定的源包含文件时也产生致命错误 致命错误信息采用下面的格式 C51 FATAL-ERROR – ACTION LINE: ERROR: C51 TERMIANTED. C51 FATAL-ERROR – ACTION FILE: ERROR: C51 TERMIANTED. 下面说明Action和Error中可能的内容

Actions ALLOCATING MEMORY 编译器不能分配足够的存储区来编译指定的源文件 CREATING LIST-FILE / OBJECT-FILE / WORKFILE 编译器不能建立列表文件OBJ文件或工作文件这个错误的出现可能是磁盘 满或写保护或文件已存在和只读 GENERATING INTERMEDIATE CODE 源文件包含的一个函数太大不能被编译器编译成虚拟代码尝试把函数分小或 重新编译 OPENING INPUT-FILE 编译器不能发现或打开所选的源或包含文件 PARSING INVOKE-/#PRAGMA-LINE 当在命令行检测到参数计算或在一个#pragma中检测到参数计算就产生这样 的错误 PARSING SOURCE-FILE/ANALYZING DECLARATIONS 源文件包含太多的外部参考减少源文件访问的外部变量和函数的数目 WRITING TO FILE 当写入列表文件OBJ文件或工作文件时遇到的错误

Keil C51中变量的使用

引言 8051内核单片机是一种通用单片机,在国内占有较大的市场份额。在将C语言用于51内核单片机的研究方面,Keil公司做得最为成功。由于51内核单片机的存储结构的特殊性,Keil C51中变量的使用与标准C有所不同。正确地使用变量,有利于获得高效的目标代码。下面详细介绍Keil C51中变量的使用方法。 1 CPU存储结构与变量的关系 变量都需要有存储空间,存储空间的不同使得变量使用时的工作效率也不同。 标准C的典型运行环境是8086(含IA-32系列)内核,其存储结构是CPU内部有寄存器,外部有存储器,寄存器的访问速度大大高于存储器的访问速度。在标准C中,不加特别定义的变量是放在存储器中的,使用register可以强制变量存储在寄存器中,对于使用特别频繁且数量不多的变量可以选用这种存储模式,以获得更高的工作效率。 相比之下,51内核单片机的存储结构则显得有些怪异,它的存储空间有3个:程序存储器空间(64 KB含片内、片外)、片外数据存储器空间(64KB)、片内数据存储器及特殊功能寄存器空间。它没有真正意义上的寄存器,它的寄存器其实是片内数据存储器(如R0~R7)和特殊功能寄存器(如A、B等)中的一部分。因此,在Keil C51中使用变量就和标准C有很大不同。 2 Keil C51变量分析 Keil C51支持标准C原有的大多数变量类型,但为这些变量新增了多种存储类型,也新增了一些标准C没有的变量。 2.1 Keil C51新增的变量存储类型 Keil C51中定义变量的格式如下: [存储种类]数据类型[存储类型]变量名表; 其中,[存储类型]是标准C中没有的,[存储类型]共有6种,分别介绍如下: ①data。将变量存储在片内可直接寻址的数据存储器中。使用这种存储模式,目标代码中对变量的访问速度最快。 ②bdata。将变量存储在片内可位寻址的数据存储器中。在目标代码中变量可以方便地进行位处理,在不进行位处理时与data相同。 ③idata。将变量存储在片内间接寻址的数据存储器中。在52内核中,当片内直接寻址数据存储器不够用时,可以使用128字节间接寻址数据存储器,访问速度一般较data要慢一些,但具有最大的片内数据存储器空间;在51内核中因无单独的间接寻址数据存储器区,idata与data无区别。 ④xdata。将变量存储在片外数据存储器中。目标代码中只能使用“MOVX A,@DPTR”和“MOVX@DPTR,A”指令访问变量,访问速度最慢,但存储空间最大(64KB)。 ⑤pdata。将变量存储在片外数据存储器中的第一页(00H~FFH)中。目标代码中可以使用“MOVX A,@Ri”和“MOVX@Ri,A”指令访问变量,访问速度与xdata相同,存储空间为256字节。 ⑥code。将变量存储在程序存储器中。目标代码中只能使用MOVC指令访问变量,因变量存储在程序存储器中,具有非易失性且为只读。 2.2 Keil C51新增的指针变量存储类型 Keil C51中的指针变量形式如下: 数据类型[数据存储类型]*[指针存储类型]标识符; 其中,[数据存储类型]和[指针存储类型]都是标准C中没有的。[数据存储类型]定义数

相关文档
最新文档