KEIL与标准C的关系及编程方法

发布者:devilcore最新更新时间:2018-01-05 来源: eefocus关键字:KEIL  标准C  编程方法 手机看文章 扫描二维码
随时随地手机看文章

深入理解并应用C51对标准ANSIC的扩展是学习C51的关键之一。因为大多数扩展功能都是直接针对8051系列CPU硬件的。大致有以下8 类: 8051存储类型及存储区域l; 存储模式l存储器类型声明l变量类型声明l 位变量与位寻址l 特殊功能寄存器(SFR)l C51指针l 函数属性具体说明如下(8031为缺省CPU)。
第一节 Keil C51扩展关键字
C51 V4.0版本有以下扩展关键字(共19个):_at_ ; idata; sfr16; alien; interrupt; smallbdata; large; _task_; Code; bit; pdatausing; reentrant xdata; comPACt sbit; data; sfr
第二节 内存区域(Memory Areas):
1. Pragram Area:
由Code说明可有多达64kBytes的程序存储器
2. Internal Data Memory
内部数据存储器可用以下关键字说明:data:直接寻址区,为内部RAM的低128 字节 00H~7FH,idata:间接寻址区,包括整个内部RAM区 00H~FFH,bdata:可位寻址区,20H~2FH
3. External Data Memory
外部RAM视使用情况可由以下关键字标识:xdata:可指定多达64KB的外部直接寻址区,地址范围0000H~0FFFFHpdata:能访问1页(25bBytes)的外部RAM,主要用于紧凑模式(Compact Model)。
4. Speciac Function Register Memory
8051提供128Bytes的SFR寻址区,这区域可位寻址、字节寻址或字寻址,用以控制定时器、计数器、串口、I/O及其它部件,可由以下几种关键字说明:sfr:字节寻址 比如 sfr P0=0x80;为PO口地址为80H,=;后H~FFH之间的常数。sfr16:字寻址,如sfr16 T2=0xCC;指定Timer2口地址T2L=0xcc T2H=0xCDsbit:位寻址,如sbit EA=0xAF;指定第0xAF位为EA,即中断允许还可以有如下定义方法:sbit 0V=PSW^2;(定义0V为PSW的第2位)sbit 0V=0XDO^2;(同上)或bit 0V-=0xD2(同上)。
第三节 存储模式
存储模式决定了没有明确指定存储类型的变量,函数参数等的缺省存储区域,共三种:
1. Small模式

所有缺省变量参数均装入内部RAM,优点是访问速度快,缺点是空间有限,只适用于小程序。
2. Compact模式
所有缺省变量均位于外部RAM区的一页(256Bytes),具体哪一页可由P2口指定,在STARTUP.A51文件中说明,也可用pdata指定,优点是空间较Small为宽裕速度较Small慢,较large要快,是一种中间状态。
3. large模式
所有缺省变量可放在多达64KB的外部RAM区,优点是空间大,可存变量多,缺点是速度较慢。提示:存储模式在C51编译器选项中选择。
第四节 存储类型声明
变量或参数的存储类型可由存储模式指定缺省类型,也可由关键字直接声明指定。各类型分别用:code,data,idata,xdata,pdata说明,例:data uar1char code array[ ]=“hello!”;unsigned char xdata arr[10][4][4];
第五节 变量或数据类型

C51提供以下几种扩展数据类型:bit 位变量值为0或1sbit 从字节中定义的位变量 0或1sfr sfr字节地址 0~255sfr16 sfr字地址 0~65535其余数据类型如:char,enum,short,int,long,float等与ANSI C相同。
第六节 位变量与声明
1. bit型变量
bit型变量可用变量类型,函数声明、函数返回值等,存贮于内部RAM20H~2FH。注意:(1) 用#pragma dISAble说明函数和用“usign”指定的函数,不能返回bit值。(2) 一个bit变量不能声明为指针,如bit *ptr;是错误的(3) 不能有bit数组如:bit arr[5];错误。
2. 可位寻址区说明20H-2FH
可作如下定义:int bdata i;char bdata arr[3],然后:sbit bito=in0;sbit bit15=I^15;sbit arr07=arr[0]^7;sbit arr15=arr[i]^7;
第七节 Keil C51指针>
C51支持一般指针(Generic Pointer)和存储器指针(Memory_Specific Pointer).
1. 一般指针
一般指针的声明和使用均与标准C相同,不过同时还可以说明指针的存储类型,例如:long * state;为一个指向long型整数的指针,而state本身则依存储模式存放。char * xdata ptr;ptr为一个指向char数据的指针,而ptr本身放于外部RAM区,以上的long,char等指针指向的数据可存放于任何存储器中。一般指针本身用3个字节存放,分别为存储器类型,高位偏移,低位偏移量。
2. 存储器指针
基于存储器的指针说明时即指定了存贮类型,例如:char data * str;str指向data区中char型数据int xdata * pow; pow指向外部RAM的int型整数。这种指针存放时,只需一个字节或2个字节就够了,因为只需存放偏移量。
3. 指针转换
即指针在上两种类型之间转化: 当基于存储器的指针作为一个实参传递给需要一般指针的函数时,指针自动转化。如果不说明外部函数原形,基于存储器的指针自动转化为一般指针,导致错误,因而请用“#include”说明所有函数原形。可以强行改变指针类型。
第八节 Keil C51函数
C51函数声明对ANSI C作了扩展,具体包括:
1. 中断函数声明中断声明方法如下:void serial_ISR () interrupt 4 [using 1]{}为提高代码的容错能力,在没用到的中断入口处生成iret语句,定义没用到的中断。void extern0_ISR() interrupt 0{}    void timer0_ISR () interrupt 1{}    void extern1_ISR() interrupt 2{}    void timer1_ISR () interrupt 3{}    void serial_ISR () interrupt 4{}    
2. 通用存储工作区
3. 选通用存储工作区由using x声明,见上例
4. 指定存储模式

由small compact 及large说明,例如:void fun1(void) small { }提示:small说明的函数内部变量全部使用内部RAM。关键的经常性的耗时的地方可以这样声明,以提高运行速度。
5. #pragma disable

在函数前声明,只对一个函数有效。该函数调用过程中将不可被中断。
6. 递归或可重入函数指定
在主程序和中断中都可调用的函数,容易产生问题。因为51和PC不同,PC使用堆栈传递参数,且静态变量以外的内部变量都在堆栈中;而51一般使用寄存器传递参数,内部变量一般在RAM中,函数重入时会破坏上次调用的数据。可以用以下两种方法解决函数重入:a、在相应的函数前使用前述“#pragma disable”声明,即只允许主程序或中断之一调用该函数;b、将该函数说明为可重入的。如下:void func(param...) reentrant;KeilC51编译后将生成一个可重入变量堆栈,然后就可以模拟通过堆栈传递变量的方法。由于一般可重入函数由主程序和中断调用,所以通常中断使用与主程序不同的R寄存器组。另外,对可重入函数,在相应的函数前面加上开关#pragma noaregs”,以禁止编译器使用绝对寄存器寻址,可生成不依赖于寄存器组的代码。
7. 指定PL/M-51函数
由alien指定。


关键字:KEIL  标准C  编程方法 引用地址:KEIL与标准C的关系及编程方法

上一篇:51单片机内部特殊功能寄存器分析
下一篇:LPC900系列单片机UART和CCU模块实现红外通信程序

推荐阅读最新更新时间:2024-03-16 15:51

Keil实现对意法半导体STM32互联系列的支持
Keil公司宣布其产品Keil MDK-ARM(微控制器开发套件)及RL-ARM(实时库)实现了对意法半导体STM32互联系列的支持。Keil公司同时推出了新的MCBSTEM32C评估板和开发套件。 STM32 互联系列基于ARM® Cortex™-M3处理器,具有全速USB OTG、两个CAN2.0B接口、10/100以太网(含对IEEE1588精密时间协议 (PTP)的硬件支持)。该产品同STM32家族的其他产品采用同样的外设,因此能够轻松实现项目移植,并有高达256KB的闪存和64KB的SRAM。 MDK-ARM 最新版本的的MDK-ARM支持所有的STM32产品,它包括配置文件、设备专有视图以
[单片机]
<font color='red'>Keil</font>实现对意法半导体STM32互联系列的支持
Keil C中全局变量的使用
在KEIL C中,有多个源文件使用到全局变量时,可以在一个源文件中定义全局变量,在另外的源文件中用extern 声明该变量,说明该变量定义在别的文件中,将其作用域扩展到此文件。 例如:有以下两个源文件test1.c,test2.c //test1.c char aaa; //定义aaa func1() { char bbb; aaa = bbb; } //…… //test2.c extern char aaa; //把aaa的作用域扩展到此 func2() { char ccc; aaa =ccc; } //……   如果还有其他文件要用到aaa,用法同test
[单片机]
ST-Link设备连接正常以后,在keil配置时却找不到相关设备
在keil中配置Debug 之前有在网上搜索相关的解决办法,类似什么长按板子上的RESET键,然后再点击setting进入debug页面,在使用JTAG接口的情况下,报的错误就已经变成了下图这样了。 但是选择SW还是报No target connect 点击download报错 之后卸载了ST-link驱动重新安装,固件升级都试了一遍,仍旧无效。 重新接入stm32开发板和ST-link,确保设备管理器里面串口正常 将排线两端分别接到开发板和ST-link 开发板和ST-link都先上电,再插排线。重新配置debug,点击setting,选择SW,发现已经可以检测到设备了 可以通过SW下载程序了,但是JTA
[单片机]
ST-Link设备连接正常以后,在<font color='red'>keil</font>配置时却找不到相关设备
使keilMDK和C51不冲突
如何让Keil MDK兼容Keil C51? 原来用51单片机,使用的是Keil C51 uVision V4.02;最近搞STM32,装了keilMDK uVision V4.23。 原来我是先装keilC51,后装keilMDK的,装在不同的目录里,装完之后不管是51工程还是stm32工程默认都会用keilMDK打开,这样打开51工程时会出错,所以要打开51的工程必须先打开keilC51程序,然后再程序里打开工程文件。 下面这个方法可以让keilMDK兼容51的工程,只要一个keil就都能编译51和stm32的工程了: 1、安装keilC51,并破解,安装目录 C:keilC51 2、安装keilMDK,并
[单片机]
控制IRQ和FIQ中断的编译器内部函数 - 基于Keil MDK
编译器内部函数__disable_irq、__enable_irq、__disable_fiq和__enable_fiq用于控制IRQ和FIQ中断。 只有当处理器处于特权模式才可以使用这些内部函数,因为这些函数要改变寄存器CPSR和SPSR(ARM7、ARM9等)或者PRIMASK和FAULTMASK寄存器(Cortex-M3、M4等),而这些寄存器只有在特权模式下才能被访问。 这些内部函数对所有架构的处理器都有效,无论是ARM状态还是Thumb状态,如下所述: 如果使用的是ARMv6(ARM11)或更新架构,编译器会将这些函数用CPS指令代替。 如果使用的是ARMv4或者ARMv5架构并且处于ARM状态,编译器会将这些函
[单片机]
Keil C51软件的使用
板子上设置了EEPROM存储器,型号为AT24C02。 板子的硬件连接为:SCL--- P2.4,SDA--- P2.5。 直接了当,贴上程序! ========================24cxx.h文件=========================#ifndef _24CXX_H_#define _24CXX_H_#include msp430x14x.h #define WRITE_ADDR 0xA0 //A0 A1 A2均接地#define READ_ADDR 0xA1 //A0 A1 A2均接地#define SDA_BIT BIT5#define SCL_BIT BIT4#define IIC_P
[单片机]
<font color='red'>Keil</font> <font color='red'>C</font>51软件的使用
keil5 stm32f407 环境转stm32f103 解决方法
问题:下载程序一直报错,是因为我之前是f4的库,现在的程序是f103的 ,所以环境需重新配置 解决办法:https://jingyan.baidu.com/album/25648fc18dfbb09190fd004a.html?picindex=10 打开keil软件 按下图标记点击操作 第三步,点击蓝色的一串字体,进入官网下载pack包, 下载完后到下载路径,会发现pack,双击。pack, 双击pac包,进入安装界面,确定好路径,点击‘Next' , 安装完成,点击’Finish' 进入keil软件,点击‘魔术棒’-----》device ---- 会发现多了stm32f103的包
[单片机]
<font color='red'>keil</font>5 stm32f407 环境转stm32f103 解决<font color='red'>方法</font>
编程定时/计数器提高输出频率准确度方法
将单片机内置或专用可编程定时/计数器作脉冲发生器,一般输入脉冲由晶振产生经过整形或分频后形成,有很高的频率准确度和稳定度。设输入脉冲频率为fin,期望输出脉冲频率为f,应置入脉冲发生器的计数值N=fin/f。当f为fin的约数,则N为整数,f与fin的准确度相同;当f不为fin的约数,则N 也不为整数,N=n+δ,其中n为N的整数部分,δ为 N 的纯小数部分。由于计数值只能为整数,实际计数值Np只能取N的近似数n或n+1,竞争输出脉冲频率fp=fin/Np。因Np的近似,fp与f间必然存在误差,且此误差分量较之因fin准确度和稳定度有限引起的误差分量可能大得多。f的准确度主要受Np的近似影响。本文在不计由fin准确度和稳定度影响的
[单片机]
可<font color='red'>编程</font>定时/计数器提高输出频率准确度<font color='red'>方法</font>
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved