While evaluating the gcc_msp430_4.9.14r1_364 compiler, imported the OutOfBox_MSP430FR6989 example from MSPWare 2.40.00.37, and changed the compiler from the TI v4.4.6 compiler to GNU v4.9.1 (Red Hat).
The GNU v4.9.1 compiler reported numerous "warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]" warnings when the HWREG8 and HWREG16 macros in hw_regaccess.h are used. E.g. the warnings when compiling one driverlib source file:
Building file: ../driverlib/MSP430FR5xx_6xx/adc12_b.c Invoking: GNU Compiler "/opt/ti/ti_ccs6_1_1/ccsv6/tools/compiler/gcc_msp430_4.9.14r1_364/bin/msp430-elf-gcc" -c -mmcu=msp430fr6989 -I"/opt/ti/ti_ccs6_1_1/ccsv6/ccs_base/msp430/include_gcc" -I"/home/Mr_Halfword/workspace_v6_1/OutOfBox_MSP430FR6989/driverlib/MSP430FR5xx_6xx" -I"/opt/ti/ti_ccs6_1_1/ccsv6/tools/compiler/gcc_msp430_4.9.14r1_364/msp430-elf/include" -Os -g -gdwarf-3 -gstrict-dwarf -Wall -mlarge -mcode-region=none -mdata-region=none -save-temps -MMD -MP -MF"driverlib/MSP430FR5xx_6xx/adc12_b.d" -MT"driverlib/MSP430FR5xx_6xx/adc12_b.d" -o"driverlib/MSP430FR5xx_6xx/adc12_b.o" "../driverlib/MSP430FR5xx_6xx/adc12_b.c" ../driverlib/MSP430FR5xx_6xx/adc12_b.c: In function ‘ADC12_B_init’: ../driverlib/MSP430FR5xx_6xx/adc12_b.c:57:8: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast] HWREG8(baseAddress + OFS_ADC12CTL0_L) &= ~ADC12ENC; ^ ../driverlib/MSP430FR5xx_6xx/adc12_b.c:62:8: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast] HWREG16(baseAddress + OFS_ADC12CTL0) &= ~(ADC12ON + ADC12ENC + ADC12SC); ^ ../driverlib/MSP430FR5xx_6xx/adc12_b.c:63:8: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast] HWREG16(baseAddress + OFS_ADC12IER0) &= 0x0000; //Reset ALL interrupt enables ^ ../driverlib/MSP430FR5xx_6xx/adc12_b.c:64:8: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast] HWREG16(baseAddress + OFS_ADC12IER1) &= 0x0000; ^ ../driverlib/MSP430FR5xx_6xx/adc12_b.c:65:8: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast] HWREG16(baseAddress + OFS_ADC12IER2) &= 0x0000; ^ ../driverlib/MSP430FR5xx_6xx/adc12_b.c:66:8: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast] HWREG16(baseAddress + OFS_ADC12IFGR0) &= 0x0000; //Reset ALL interrupt flags ^ ../driverlib/MSP430FR5xx_6xx/adc12_b.c:67:8: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast] HWREG16(baseAddress + OFS_ADC12IFGR1) &= 0x0000; ^ ../driverlib/MSP430FR5xx_6xx/adc12_b.c:68:8: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast] HWREG16(baseAddress + OFS_ADC12IFGR2) &= 0x0000; ^ ../driverlib/MSP430FR5xx_6xx/adc12_b.c:71:8: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast] HWREG16(baseAddress + OFS_ADC12CTL1) = ^ ../driverlib/MSP430FR5xx_6xx/adc12_b.c:78:8: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast] HWREG16(baseAddress + OFS_ADC12CTL2) = ^ ../driverlib/MSP430FR5xx_6xx/adc12_b.c:82:8: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast] HWREG16(baseAddress + OFS_ADC12CTL3) = ^ ../driverlib/MSP430FR5xx_6xx/adc12_b.c: In function ‘ADC12_B_enable’: ../driverlib/MSP430FR5xx_6xx/adc12_b.c:91:8: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast] HWREG8(baseAddress + OFS_ADC12CTL0_L) &= ~ADC12ENC; ^ ../driverlib/MSP430FR5xx_6xx/adc12_b.c:94:8: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast] HWREG8(baseAddress + OFS_ADC12CTL0_L) |= ADC12ON; ^ ../driverlib/MSP430FR5xx_6xx/adc12_b.c: In function ‘ADC12_B_disable’: ../driverlib/MSP430FR5xx_6xx/adc12_b.c:100:8: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast] HWREG8(baseAddress + OFS_ADC12CTL0_L) &= ~ADC12ENC; ^ ../driverlib/MSP430FR5xx_6xx/adc12_b.c:103:8: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast] HWREG8(baseAddress + OFS_ADC12CTL0_L) &= ~ADC12ON; ^ ../driverlib/MSP430FR5xx_6xx/adc12_b.c: In function ‘ADC12_B_setupSamplingTimer’: ../driverlib/MSP430FR5xx_6xx/adc12_b.c:111:8: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast] HWREG16(baseAddress + OFS_ADC12CTL1) |= ADC12SHP; ^ ../driverlib/MSP430FR5xx_6xx/adc12_b.c:114:8: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast] HWREG16(baseAddress + OFS_ADC12CTL0) &= ^ ../driverlib/MSP430FR5xx_6xx/adc12_b.c:118:8: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast] HWREG16(baseAddress + OFS_ADC12CTL0) |= clockCycleHoldCountLowMem ^ ../driverlib/MSP430FR5xx_6xx/adc12_b.c: In function ‘ADC12_B_disableSamplingTimer’: ../driverlib/MSP430FR5xx_6xx/adc12_b.c:125:8: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast] HWREG16(baseAddress + OFS_ADC12CTL1) &= ~(ADC12SHP); ^ ../driverlib/MSP430FR5xx_6xx/adc12_b.c: In function ‘ADC12_B_configureMemory’: ../driverlib/MSP430FR5xx_6xx/adc12_b.c:136:8: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast] HWREG16(baseAddress + memoryBufferControlOffset) = ^ ../driverlib/MSP430FR5xx_6xx/adc12_b.c:141:8: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast] HWREG16(baseAddress + memoryBufferControlOffset) ^ ../driverlib/MSP430FR5xx_6xx/adc12_b.c:144:8: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast] HWREG16(baseAddress + memoryBufferControlOffset) ^ ../driverlib/MSP430FR5xx_6xx/adc12_b.c:148:8: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast] HWREG16(baseAddress + memoryBufferControlOffset) ^ ../driverlib/MSP430FR5xx_6xx/adc12_b.c:151:8: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast] HWREG16(baseAddress + memoryBufferControlOffset) ^ ../driverlib/MSP430FR5xx_6xx/adc12_b.c: In function ‘ADC12_B_setWindowCompAdvanced’: ../driverlib/MSP430FR5xx_6xx/adc12_b.c:160:8: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast] HWREG16(baseAddress + OFS_ADC12HI) = highThreshold; ^ ../driverlib/MSP430FR5xx_6xx/adc12_b.c:161:8: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast] HWREG16(baseAddress + OFS_ADC12LO) = lowThreshold; ^ ../driverlib/MSP430FR5xx_6xx/adc12_b.c: In function ‘ADC12_B_enableInterrupt’: ../driverlib/MSP430FR5xx_6xx/adc12_b.c:169:8: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast] HWREG16(baseAddress + OFS_ADC12IER0) |= interruptMask0; ^ ../driverlib/MSP430FR5xx_6xx/adc12_b.c:170:8: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast] HWREG16(baseAddress + OFS_ADC12IER1) |= interruptMask1; ^ ../driverlib/MSP430FR5xx_6xx/adc12_b.c:171:8: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast] HWREG16(baseAddress + OFS_ADC12IER2) |= interruptMask2; ^ ../driverlib/MSP430FR5xx_6xx/adc12_b.c: In function ‘ADC12_B_disableInterrupt’: ../driverlib/MSP430FR5xx_6xx/adc12_b.c:179:8: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast] HWREG16(baseAddress + OFS_ADC12IER0) &= ~(interruptMask0); ^ ../driverlib/MSP430FR5xx_6xx/adc12_b.c:180:8: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast] HWREG16(baseAddress + OFS_ADC12IER1) &= ~(interruptMask1); ^ ../driverlib/MSP430FR5xx_6xx/adc12_b.c:181:8: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast] HWREG16(baseAddress + OFS_ADC12IER2) &= ~(interruptMask2); ^ ../driverlib/MSP430FR5xx_6xx/adc12_b.c: In function ‘ADC12_B_clearInterrupt’: ../driverlib/MSP430FR5xx_6xx/adc12_b.c:188:8: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast] HWREG16(baseAddress + OFS_ADC12IFGR0 + 2 * interruptRegisterChoice) &= ^ ../driverlib/MSP430FR5xx_6xx/adc12_b.c: In function ‘ADC12_B_getInterruptStatus’: ../driverlib/MSP430FR5xx_6xx/adc12_b.c:196:16: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast] return (HWREG16(baseAddress + OFS_ADC12IFGR0 + 2 * interruptRegisterChoice) ^ ../driverlib/MSP430FR5xx_6xx/adc12_b.c: In function ‘ADC12_B_startConversion’: ../driverlib/MSP430FR5xx_6xx/adc12_b.c:206:8: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast] HWREG8(baseAddress + OFS_ADC12CTL0_L) &= ~(ADC12ENC); ^ ../driverlib/MSP430FR5xx_6xx/adc12_b.c:208:8: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast] HWREG16(baseAddress + OFS_ADC12CTL3) &= ~(ADC12CSTARTADD_31); ^ ../driverlib/MSP430FR5xx_6xx/adc12_b.c:209:8: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast] HWREG16(baseAddress + OFS_ADC12CTL1) &= ~(ADC12CONSEQ_3); ^ ../driverlib/MSP430FR5xx_6xx/adc12_b.c:211:8: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast] HWREG16(baseAddress + OFS_ADC12CTL3) |= startingMemoryBufferIndex; ^ ../driverlib/MSP430FR5xx_6xx/adc12_b.c:212:8: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast] HWREG16(baseAddress + OFS_ADC12CTL1) |= conversionSequenceModeSelect; ^ ../driverlib/MSP430FR5xx_6xx/adc12_b.c:213:8: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast] HWREG8(baseAddress + OFS_ADC12CTL0_L) |= ADC12ENC + ADC12SC; ^ ../driverlib/MSP430FR5xx_6xx/adc12_b.c: In function ‘ADC12_B_disableConversions’: ../driverlib/MSP430FR5xx_6xx/adc12_b.c:221:12: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast] HWREG8(baseAddress + OFS_ADC12CTL1_L) &= ~(ADC12CONSEQ_3); ^ ../driverlib/MSP430FR5xx_6xx/adc12_b.c:224:18: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast] else if(~(HWREG8(baseAddress + OFS_ADC12CTL1_L) & ADC12CONSEQ_3)) ^ ../driverlib/MSP430FR5xx_6xx/adc12_b.c:234:8: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast] HWREG8(baseAddress + OFS_ADC12CTL0_L) &= ~(ADC12ENC); ^ ../driverlib/MSP430FR5xx_6xx/adc12_b.c: In function ‘ADC12_B_getResults’: ../driverlib/MSP430FR5xx_6xx/adc12_b.c:240:16: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast] return (HWREG16(baseAddress + (OFS_ADC12MEM0 + memoryBufferIndex))); ^ ../driverlib/MSP430FR5xx_6xx/adc12_b.c: In function ‘ADC12_B_setResolution’: ../driverlib/MSP430FR5xx_6xx/adc12_b.c:247:8: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast] HWREG8(baseAddress + OFS_ADC12CTL2_L) &= ~(ADC12RES_3); ^ ../driverlib/MSP430FR5xx_6xx/adc12_b.c:248:8: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast] HWREG8(baseAddress + OFS_ADC12CTL2_L) |= resolutionSelect; ^ ../driverlib/MSP430FR5xx_6xx/adc12_b.c: In function ‘ADC12_B_setSampleHoldSignalInversion’: ../driverlib/MSP430FR5xx_6xx/adc12_b.c:254:8: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast] HWREG16(baseAddress + OFS_ADC12CTL1) &= ~(ADC12ISSH); ^ ../driverlib/MSP430FR5xx_6xx/adc12_b.c:255:8: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast] HWREG16(baseAddress + OFS_ADC12CTL1) |= invertedSignal; ^ ../driverlib/MSP430FR5xx_6xx/adc12_b.c: In function ‘ADC12_B_setDataReadBackFormat’: ../driverlib/MSP430FR5xx_6xx/adc12_b.c:261:8: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast] HWREG8(baseAddress + OFS_ADC12CTL2_L) &= ~(ADC12DF); ^ ../driverlib/MSP430FR5xx_6xx/adc12_b.c:262:8: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast] HWREG8(baseAddress + OFS_ADC12CTL2_L) |= readBackFormat; ^ ../driverlib/MSP430FR5xx_6xx/adc12_b.c: In function ‘ADC12_B_setAdcPowerMode’: ../driverlib/MSP430FR5xx_6xx/adc12_b.c:268:8: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast] HWREG8(baseAddress + OFS_ADC12CTL2_L) &= ~(ADC12PWRMD); ^ ../driverlib/MSP430FR5xx_6xx/adc12_b.c:269:8: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast] HWREG8(baseAddress + OFS_ADC12CTL2_L) |= powerMode; ^ ../driverlib/MSP430FR5xx_6xx/adc12_b.c: In function ‘ADC12_B_isBusy’: ../driverlib/MSP430FR5xx_6xx/adc12_b.c:281:16: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast] return (HWREG8(baseAddress + OFS_ADC12CTL1_L) & ADC12BUSY); ^ Finished building: ../driverlib/MSP430FR5xx_6xx/adc12_b.c
These warnings are generated because the HWREG16 and HWREG8 are casting a uint16_t peripheral base address to a pointer, and on the MSP430FR6659 with -mlarge pointers are 20-bits.
To remove the warnings the hw_regaccess.h was modified to add #include "stddef.h" and change the HWREGxx macros to cast the peripheral base address to size_t:
#define HWREG32(x) \ (*((volatile uint32_t *)((size_t)x))) #define HWREG16(x) \ (*((volatile uint16_t *)((size_t)x))) #define HWREG8(x) \ (*((volatile uint8_t *)((size_t)x)))
Following this change, the GNU v4.9.1 compiler no longer reported any warnings for driverlib. The change also reduced the size of the code generated for peripheral access by the GNU v4.9.1 compiler, such that the .text size for the OutOfBox_MSP430FR6989 example from 25120 bytes to 23428 bytes. I haven't analyzed the change in the generate code, but the OutOfBox_MSP430FR6989 example still functions.
Also, when using the TI v4.4.6 compiler:
- There are no warnings before and after the change.
- With Optimization Level 0 the TI v4.4.6 compiler generates the same image before and after the change.
- With Optimization Level 2 the TI v4.4.6 compiler generates 44 bytes more code, but the example still functions in both cases.
Therefore, suggest changing the hw_regaccess.h in future MSPWare releases.
The modified hw_regaccess.h is attached hw_regaccess.h