打印
[ARM入门]

Keil MDK 程序语句有警告,错在哪里,如何消除?请帮分析

[复制链接]
5002|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
在keil MDK下使用ARM7单片机进行CAN通信。出现大量同类警告,找了半天,不知原因所在,特来求助。
选其中一例警告,如下:
src\CAN_DRV_SR\CANFUNC.C(237): warning:  #191-D: type qualifier is meaningless on cast type
src\CAN_DRV_SR\CANFUNC.C:       regCANMOD(CanNum).Bits.RM_BIT=1;
src\CAN_DRV_SR\CANFUNC.C:       ^


这一句所在函数为:
UINT32 CanQuitSM(eCANNUM        CanNum)       
{
        uCANMod                i;
        i=regCANMOD(CanNum);                                       
        regCANMOD(CanNum).Bits.RM_BIT=1;                 //这句有警告,以下三句也有同类型警告
        regCANMOD(CanNum).Bits.SM_BIT = 0;       
        regCANMOD(CanNum).Bits.RM_BIT=i.Bits.RM_BIT;
        return(regCANMOD(CanNum).Bits.SM_BIT);
}

先看看regCANMOD(),是一个宏定义,如下:
#define         regCANMOD(CanNum)                (*((volatile P_uCANMod)(CANMOD_BADR+CanNum* CAN_OFFSET_ADR)))
其中P_uCANMod定义,是一个指向联合的指针,如下:
//CAN模式寄存器数据类型定义
typedef        union                _canmod_
{
        UINT32        Word;
        struct        {
                UINT32        RM_BIT                 :1;                //定义RM位
                UINT32        LOM_BIT         :1;                //定义LOM位
                UINT32        STM_BIT                :1;                //定义STM位
                UINT32        TPM_BIT         :1;                //定义TPM位
                UINT32        SM_BIT                 :1;                //定义SM位
                UINT32        RPM_BIT         :1;                //定义RPM位
                UINT32        RSV_BIT1         :1;                //保留位
                UINT32        TM_BIT                 :1;                //定义TM位
                UINT32        RSV_BIT24        :24;                //保留位
        }Bits;
}uCANMod,*P_uCANMod;

另外CANMOD_BADRCAN_OFFSET_ADR都是地址或地址偏移量,定义如下:
#define         CANMOD_BADR                        0xE0044000             //模式寄存器
#define        CAN_OFFSET_ADR                        0x4000                //CAN各模块寄存器之间的线性差异
再看看CanNum的类型eCANNUM,是个枚举类型的常量,见下方:
//CAN控制器通道定义
typedef         enum                _cannum_                               
{
#if                CAN_MAX_NUM  == 4                //微处理器中含有4路CAN
        CAN1 = 0,                                                 //CAN1模块
        CAN2,                                                        //CAN2模块
        CAN3,                                                        //CAN3模块
        CAN4                                                        //CAN4模块
#elif        CAN_MAX_NUM  == 2                        //微处理器中含有2路CAN
        CAN1 = 0,                                                 //CAN1模块
        CAN2                                                        //CAN2模块
#endif
} eCANNUM;       


到这里,所有和这个有警告的语句regCANMOD(CanNum).Bits.RM_BIT=1; 都呈现出来了。
死活想不明白是什么原因,期待指点,哪怕丁点提示也好,不胜感激!








相关帖子

沙发
hualiming025|  楼主 | 2015-8-11 11:12 | 只看该作者
现在发现去掉 volatile 限定词之后警告就消失了,也就是改为:
#define         regCANMOD(CanNum)                (*((P_uCANMod)(CANMOD_BADR+CanNum* CAN_OFFSET_ADR)));
但是使用volatile限定这样的地址不是常用的方法吗?是这里的确不需要吗?谁能解释?
担心去掉后程序会有问题.

使用特权

评论回复
板凳
lenglx| | 2015-10-15 17:31 | 只看该作者
我想你使用volatile的本意是: 指针所指向的内容是易变的.

volatile P_uCANMod  等价于  volatile (_canmod_ *)
这个含义是 指针本身 是volatile的, 而不是 指针本身所指的内容是volatile的.
也就是: volatile (_conmod_ *)  不等于 volatile _conmod_ *

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

32

主题

114

帖子

2

粉丝