Keil C51 一个警告 '=': pointer: different mspace

STC8G单片机一些特殊的功能,比如特殊的48路PWM的配置寄存器位置在xdata区域

官方操作的时候是这样的

uint16_t code PWMxHLD[48] = {
	0xff15,		/* PWM00HLD */
	0xff1d,		/* PWM01HLD */
	0xff25,		/* PWM02HLD */
	//.........
	0xfce5,		/* PWM56HLD */
	0xfced,		/* PWM57HLD */
};

unsigned char	PWMLevelSet(unsigned char Mode)
{
    unsigned char xdata *pPWMxHLD;//这里定义了一个xdata区域指针
    
    EXSFR();
    pPWMxHLD = (unsigned char *)PWMxHLD[2];//PWM2 0xff25
    *pPWMxHLD = Mode;

    EXRAM();
    return 0;
}

这样操作不会有警告

如果改成下面的方式

unsigned char	PWMLevelSet(unsigned char Mode)
{
    unsigned char xdata *pPWMxHLD;
	
    EXSFR();
    pPWMxHLD = (unsigned char *)0xff25;//PWM2 0xff25
    *pPWMxHLD = Mode;

    EXRAM();
  
    return 0;
}

则会有警告 warning C259: '=': pointer: different mspace

做如下修改即可

pPWMxHLD = (unsigned char xdata *)0xff25;

原因如下:

在UV2中,下述程序段能编译通过:
unsigned char xdata *str;
str="ABCDEF";
但在UV3中编译会出现如下错误:
waring C259: '=': pointer:different mspace
必须将其改为:
str=(unsigned char xdata*)"ABCDEF";
这说明UV3中变量赋值时,对其“存储类型”约束更严格,与C++类似。
————————————————
版权声明:本文为CSDN博主「emesjx」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/emesjx/article/details/5995183

原文地址:https://www.cnblogs.com/IdeaMing/p/14711235.html