原创 Keil C的若干问题

2007-5-21 15:10 4828 3 4 分类: MCU/ 嵌入式
一、混合编程

 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模式下选"keil\c51\lib\c51s.lib"加入工程中,如果要进行浮点运算把"keil\c51\lib\c51fpl.lib"也加入工程中。

在 Keil 安装目录下的 \C51\LIB\ 目录的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)





二、中断使用

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能够定义端口。




文章评论1条评论)

登录后参与讨论

用户24118 2007-6-9 23:07

受教了:)

相关推荐阅读
用户77878 2008-03-18 16:15
决定高薪的细节守则
每天晚上8点到10点之间,你在做什么基本决定着你是薪水见涨,还是薪水见降。8点到10点之间,是在有目的性阅读,还是为明天的事情做准备,甚至在充电专业或研习第二专长?不管是哪一样,都有可能迈向成功,一个...
用户77878 2008-03-18 15:48
待机与休眠的区别
在使用笔记本的时候可能很多人都会注意到两个功能——待机与休眠,但这两者之间究竟有什么区别呢?什么情况下选择待机、什么情况下选择休眠我想很多人都没认真思考过,大部分都是随便选一个。实际上他们之间的区别...
用户77878 2008-03-10 19:07
多晶硅产能大战 四川力量将催生国际级巨头
  各地多晶硅项目大规模建设带来的结果是,目前9成以上国内多晶硅需从国外进口的现状将从此改变。行业预计,不到10年,中国将成全球最大多晶硅生产国。那么,高价多晶硅又将持续到何时?四川将在全球新能源格局...
用户77878 2008-03-10 14:57
硕士研究方向确定
    硕士研究生的学习已经开始了一个学期,上学期老板给确定的方向是高速永磁电机变频器的设计制作,这学期听说由于合作方的原因,变频器的研究估计无法延续下去,于是乎决定改课题。幸好在清华研究生的第一学期...
用户77878 2007-10-20 22:34
基于AT89C51单片机设计的简易智能机器人
随着微电子技术的不断发展,微处理器芯片的集成程度越来越高,单片机已可以在一块芯片上同时集成CPU、存储器、定时器/计数器、并行和串行接口、 看门狗、前置放大器、A/D转换器、D/A转换器等多种电路,这...
用户77878 2007-10-20 22:00
写给那些习电子技术的新人
attitude+practice+root+time(我们简称APRT吧)学习方法(写给那些习电子技术的新人)! attitude、root、practic、time意思就不用说了吧?看到这里也许你...
我要评论
1
3
关闭 站长推荐上一条 /2 下一条