keil C 出现WARNING:MULTIPLE CALL TO SEGMENT的解析
调试keil程序时有时会出现各种编译警告,一般情况下不会影响程序的运行。但出现如题WARNING:MULTIPLE CALL TO SEGMENT警告时,请留意您的程序是否会发生错误。上述警告指的是你定义的函数体在主程序中被调用,在中断中也被直接或间接的调用了。可想若主程序正运行此函数时,中断来临也运行这段程序的话会发生函数重载现象。若此现象发生且你在程序中未加处理,那么很有可能导致您的程序发生不可预测的结果。结合网上查询的结果和自己的设计提供几个可行的解决方法是:
1. 利用关键字reentrant表明函数可重载
评注:该法排除了编译器警告和可能出现的重载带来的影响,但此方法在重载发生时,为了保护主程序的程序信息,系统会将程序的信息保存到堆栈中,造成堆栈的而外负担
2. 如果空间多的话,可以定义两个同功能的函数,分别在中断和中断外调用
评注:该方法操作起来方便,不会出现上一个办法的弊端,但比较浪费code
3. 利用函数指针
评注:该方法适合用在确定中断和主程序不会同时调用该函数的时候。它不仅排除了编译器警告,在code占用、操作方面都比较好
相关文档:
第一章 概念
指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址。要搞清一个指针需要搞清指针的四方面的内容:指针的类型,指针所指向的类型,指针的值或者叫指针所指向的内存区,还有指针本身所占据的内存区。让我们分别说明。
先声明几个指针放着做例子:
例一:
(1)int *ptr;
(2)char ......
曾经碰到过让你迷惑不解、类似于int * (* (*fp1) (int) ) [10];这样的变量声明吗?本文将由易到难,一步一步教会你如何理解这种复杂的C/C++声明。
我们将从每天都能碰到的较简单的声明入手,然后逐步加入const修饰符和typedef,还有函数指针,最后介绍一个能够让你准确地理解任何C/C++声明的&ld ......
1.已知strcpy 函数的原型是:
char *strcpy(char *strDest, const char *strSrc);
其中strDest 是目的字符串,strSrc 是源字符串。不调用C++/C 的字符串库函数,请编写函数 strcpy
答案:
char *strcpy(char *strDest, const char *strSrc)
{
if ( strDest == NULL || strSrc == NULL)
return NULL ;
if ( strDest ......
Data Type Ranges
C/C++ recognizes the types shown in the table below.
Type Name Bytes Other Names Range of Values
&nb ......