在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_BADR和CAN_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; 都呈现出来了。
死活想不明白是什么原因,期待指点,哪怕丁点提示也好,不胜感激!
|