Keil C的若干问题

技术分类: 嵌入式系统  | 2007-05-21
作者:Andymio

nbsp; 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:固定指前面0x
1】【2】【3
加载中

对文章的评论

剩余字数:  

浏览该文章的用户还看过...

  • 文 章

  • 论 坛

  • 博 客

  • 小 组

设计资源与分销