单片机keil 常见问题

发布者:科技先锋最新更新时间:2013-08-02 来源: 21ic关键字:单片机  keil  常见问题 手机看文章 扫描二维码
随时随地手机看文章

一、混合编程

1、模块内接口:

使用如下标志符:

#pragma asm

汇编语句

#pragma endasm

注意:如果在c51程序中使用了汇编语言,注意在keil编译器中需要激活Properties中的“Generate Assembler SRC File” 和“Assembler SRC File ”两个选项

来个实例吧:

#i nclude

void main(void)

{

P2=1;

#pragma asm

MOV R7,#10

DEL:MOV R6,#20

DJNZ R6,$

DJNZ R7,DEL

#pragma endasm

P2=0;

}

另:

1、把"xx.c"加入工程中,右击"xx.c"选择“options for file"xx.c" 选择“Generate Assembler SRC File”和“Assemble SRC File”打上黑勾有效;

2、根据选择的编译模式,把相应的库文件象加"xx.c"一样加入工程中并放在"xx.c"下面,如smail模式下选"keilc51libc51s.lib"加入工程中,如果要进行浮点运算把"keilc51libc51fpl.lib"也加入工程中。

在 Keil 安装目录下的 C51LIB 目录的LIB 文件如下:

C51S.LIB - 没有浮点运算的 Small model

C51C.LIB - 没有浮点运算的 Compact model

C51L.LIB - 没有浮点运算的 Large model

C51FPS.LIB - 带浮点运算的 Small model

C51FPC.LIB - 带浮点运算的 Compact model

C51FPL.LIB - 带浮点运算的 Large model

3、在"xx.c"头文件中加入优化:比如#pragma OT(4,speed)

4、在"xx.c"中加入汇编代码

#pragma ASM

;Assembler Code Here

#pragma ENDASM

5、编译生成xx.hex

注意:

没有做第一步会有如下警告:\'asm/endasm\' requires src-control to be active

没有做第二步会有如下警告:UNRESOLVED EXTERNAL SYMBOL;

REFERENCE MADE TO UNRESOLVED EXTERNAL等

没有做第三步会有如下警告:UNDEFINED SYMBOL (PASS-2)[page]

二、中断使用

interrupt xx using y

跟在interrupt 后面的xx 值得是中断号,就是说这个函数对应第几个中断端口,一般在51中

0 外部中断0

1 定时器0

2 外部中断1

3 定时器1

4 串行中断

其它的根据相应的单片机有自己的含义,实际上c在编译的时候就是把你这个函数的入口地址放到这个对应中断的跳转地址 。 using y 这个y时说这个中断函数使用的那个寄存器组就是51里面一般有4个 r0 -- r7寄存器,如果你的终端函数和别的程序用的不是同一个寄存器组则进入中断的时候就不会将寄存器组压入堆栈返回时也不会弹出来节省代码和时间。

三、关于reentrant的使用方法

云清燕 发表于 2006-11-15 21:27:00

我在程序中出现了如下警告:

*** WARNING L15: MULTIPLE CALL TO SEGMENT

SEGMENT: ?PR?_CRCDATA?PANEL_DISP

CALLER1: ?C_C51STARTUP

CALLER2: ?PR?UART_RECV?PANEL_DISP

*** WARNING L15: MULTIPLE CALL TO SEGMENT

SEGMENT: ?PR?ANALOGALLBECKON?PANEL_DISP

CALLER1: ?C_C51STARTUP

CALLER2: ?PR?UART_RECV?PANEL_DISP

*** WARNING L15: MULTIPLE CALL TO SEGMENT

SEGMENT: ?PR?SWITCHALLBECKON?PANEL_DISP

CALLER1: ?C_C51STARTUP

CALLER2: ?PR?UART_RECV?PANEL_DISP

我的程序编译出来就这3个警告,但是程序可以正常下载运行。但是我觉得有这些警告会使程序存在bug。从字面上看是它的意思是我程序中接受函数UART_RECV()多调用了analogAllBeckon()、switchAllBeckon()。

因为51的普通函数是不可重入的,变量放在固定的地址,两个函数同时运行时,就会修改同一个变量,从而导致结果错误。于是我在analogAllBeckon()、switchAllBeckon()函数后面加了void analogAllBeckon()reentrant{//All Analog data beckon使程序消除了警告。这种方法是表明函数是可被多哥任务调用而不修改函数里边的变量值,以此来实现函数的重入性。

关于reentrant的使用keil的官方论坛上有详细的讨论.

Andy Neil(官方工程师)建议

"Are you sure that you really need to make everything reentrant?...A reading of the Keil app notes & knowledgebase articles on this subject showed that it was not necessary. "

由于每一次调用被reentrant声明的函数都要把函数的参数和内部变量压栈,所以很容易使堆栈区溢出,S52只有256Bytes的data段,一个简单的函数如果有一个参数三个内部变量,则需要压栈4字节以上,这还不包括函数调用堆栈.reentrant其实并不是适合低端的单片机,keil论坛上有人说对于那些有KB以上RAM的单片机reentrant才适合.

四、变量声明有关

在51系列中data,idata,xdata,pdata的区别 data:固定指前面0x00-0x7f的128个RAM,可以用acc直接读写的,速度最快,生成的代码也最小。 idata:固定指前面0x00-0xff的256个RAM,其中前128和data的128完全相同,只是因为访问的方式不同。idata是用类似C中的指针方式访问的。汇编中的语句为:mox ACC,@Rx.(不重要的补充:c中idata做指针式的访问效果很好) xdata:外部扩展RAM,一般指外部0x0000-0xffff空间,用DPTR访问。 pdata:外部扩展RAM的低256个字节,地址出现在A0-A7的上时读写,用movx ACC,@Rx读写。这个比较特殊,而且C51好象有对此BUG, 建议少用。但也有他的优点,具体用法属于中级问题,这里不提。

startup.a51的作用和汇编一样,在C中定义的那些变量和数组的初始化就在startup.a51中进行,如果你在定义全局变量时带有数值,如unsigned char data xxx="100";,那startup.a51中就会有相关的赋值。如果没有=100,startup.a51就会把他清0。(startup.a51==变量的初始化)。这些初始化完毕后,还会设置SP指针。对非变量区域,如堆栈区,将不会有赋值或清零动作。有人喜欢改startup.a51,为了满足自己一些想当然的爱好,这是不必要的,有可能错误的。比如掉电保护的时候想保存一些变量, 但改startup.a51来实现是很笨的方法,实际只要利用非变量区域的特性,定义一个指针变量指向堆栈低部:0xff处就可实现。, 为什么还要去改? 可以这么说:任何时候都可以不需要改startup.a51,如果你明白它的特性。

五、类型有关

用bit能够定义一个变量,用sbit却不行,sbit能够定义端口。

关键字:单片机  keil  常见问题 引用地址:单片机keil 常见问题

上一篇:关于51精确延时及keil仿真延时时间
下一篇:如何学习51单片机/心得/KEIL4/DXP

推荐阅读最新更新时间:2024-03-16 13:26

单片机一些基础问题
一般说1T 4T 6T 12T的单片机是指的什么? 标准51是12T的,就是说12个时钟周期(晶振周期,例如12M的,周期是1/12M,单位秒),机器做一个指令周期,刚好就是1/12M*12=1uS,常见指令例如nop就是一个周期,刚好1uS,其他的大多多于一个周期,乘除法更多。所以如果计算指令时间可以这样算。 而现在很多51核的单片机工艺质量上去后,频率大大提高,增强型51有6T的,如果接12M的话,一个nop就只需要0.51uS,如果是STC的部分单片机12T的话,那只需要1/12uS。 单片机的晶振不是随便选,要看技术手册,看最高频率,看支持类型等等。一般12M,接串口的话11.0592M。如果是PIC,很多4M,8M
[单片机]
基于AVR单片机的PT2262软件解码程序分享
很多PT2262软件解码程序,都是用定时器测量脉冲宽度。占用系统太多资源。我自己编写的程序不用定时器,不用中断,代码最少。但耗CPU,发射端为PT2262 3.3M 的电阻 接收端为 M8 内部1M RC振荡。解码成功后输出D口显示。编译软件为 ICCAVR。 以下是avr单片机源码: #include iom8v.h #include macros.h void delay_ms(void) //毫秒延时 { unsigned int i; for (i=0;i 140;i++) { } } void delay_nms(unsigned int n)
[单片机]
基于AVR<font color='red'>单片机</font>的PT2262软件解码程序分享
51单片机 PWM调速基本原理
/******************************************************************************** * 标题: 恒速运行 ********************************************************************************* * 通过本例程了解PWM 的基本原理和使用 *********************************************************************************/ #in
[单片机]
单片机以太网控制芯片W7100A数据手册(一)
W7100A iMCU是一个单片机以太网嵌入式控制芯片,它的的结构是:内嵌8051单片机 + TCP/IP协议栈 + 10/100 高速以太网络MAC/PHY W7100A 是 W7100 的升级版。它增加了一些新功能,如记忆锁定功能(Memory Lock)、休眠模式、最高支持16M字节外部存储空间、特别功能寄存器(SFR)和GPIO上拉/下拉的控制(Pull-Up/Down Control)。另有64QFN封装可供小型嵌入式装置使用. 今天给大家介绍一下W7100A的结构以及存储器的部分。 概述 1.1 简介 iMCU W7100A是一个集合了8051兼容微处理器内核,64K的SRAM以及高性能的硬件的T
[单片机]
<font color='red'>单片机</font>以太网控制芯片W7100A数据手册(一)
基于ATmega32单片机主动式太阳能追日系统设计
简介:设计一种主动式太阳能追日系统。通过对太阳运行轨迹理论的分析和研究,确定了追日系统的天文算法公式,以保证系统的跟踪精度。在此基础上,针对追日系统的控制原理,提出了系统的控制方案,阐述了控制系统硬件电路的设计过程和软件平台的操作。经验证,设计的主动式太阳能追日系统的性能指标完全满足应用要求,运行稳定可靠,能适应各种复杂环境。 引言 随着全球资源逐渐匮乏与能源需求不断增长之间的矛盾日益凸显,太阳能作为绿色清洁能源受到越来越多的关注和研究,开发太阳能资源,寻求经济发展的新动力是整个社会可持续发展的有效途径之一。目前的太阳能利用方式主要有以下4种:光热利用、太阳能发电、光化利用及光生物利用。我国较成熟的太阳能产品主要集中在太阳
[单片机]
基于ATmega32<font color='red'>单片机</font>主动式太阳能追日系统设计
瑞萨面向高端工业传感器系统推出具备高速、 高精度模拟前端的32位RX MCU
全新RX23E-B相比现有版本数据速率快8倍,并包含125 kSPS ΔΣ A/D转换器 2023 年 11 月 22 日, 中国北京讯 - 全球半导体解决方案供应商瑞萨电子今日宣布面向高端工业传感器系统推出一款全新RX产品——RX23E-B,扩展32位微控制器(MCU)产品线。 新产品作为广受欢迎的RX产品家族的一员,具有高精度模拟前端(AFE),专为需要快速、精确模拟信号测量的系统而设计。 该新型MCU集成24位Delta-Sigma A/D转换器,转换速度高达125 kSPS(125,000采样/秒),比现有RX23E-A产品快8倍。与RX23E-A相比,它可以处理精确的A/D转换,同时将均方根(RMS)噪声降
[嵌入式]
瑞萨面向高端工业传感器系统推出具备高速、  高精度模拟前端的32位RX <font color='red'>MCU</font>
基于AVR单片机的实用车载空调控制器电路
  电子设备在汽车中的广泛应用被认为是汽车技术发展进程中的一次革命。随着汽车电子技术的发展和汽车控制单元的增加,汽车电子技术正朝着集中化、智能化、网络化和模块化方向发展。车内CAN/LIN总线网络的使用使得车内各个控制单元的数据可以共享,从而使在汽车嵌入式计算平台上采用多变量多目标的综合协调控制成为可能。另一方面,网络化拓展了汽车的服务领域,为汽车的移动通信、移动办公、娱乐、导航定位和远程诊断与维修提供了技术基础,逐步形成了汽车、家庭、社会一体化的互动体系。汽车嵌入式计算平台在该一体化体系中担当重要角色。   本文介绍了车载嵌入式计算平台,它为完成汽车辅助驾驶和安全监控、远程诊断和维修、在线/离线导航定位、娱乐、与家庭互动等各
[嵌入式]
一种新的单片机“看门狗”电路软件设计方法
    摘要: 单片机控制系统“看门狗”电路的有效性,除硬件电路的可靠性以外,主要取决于如何正确给“看门狗”电路进行复位(即“喂狗”),文章在介绍了一种采用MAX706和89C52构成的硬件电路的基础上,给出了一种新颖可靠的“看门狗”电路软件设计方法。     关键词: 抗干扰  单片机  看门狗  MAX706  89C52     随着MCS-51系列单片机的发展,其芯片价格在不断下降,但同时也带来了单片机芯片的抗干扰问题,该问题可能导致一些智能型仪器仪表单片机工业控制系统发生“死机”。笔者通过近几年的设计实践及不断试验,总结了一套可靠的“看门狗”硬件电路及软件设计方法。由于一些专业期刊曾经刊登过许多关于“看门
[应用]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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