请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号:TMS320F2800135 主题中讨论的其他器件:C2000WARE
工具与软件:
大家好、
此函数来自 C:\ti\c2000\C2000Ware_5_02_00_00\driverlib\f280013x\driverlib\adc.c
它声明了指针偏移。 但我们发现、当所有条件都不满足时、可能会有风险。 它将运行 第88行: *offset = 0u;,但在此之前没有 initalize offset 指针。 因此我们认为偏移指针是一个随机地址、非常危险、可能会导致程序崩溃。
您对此问题有任何意见吗? CCS 是否对 no-init 指针进行了任何优化?
//*****************************************************************************
//
// ADC_setOffsetTrim
//
//*****************************************************************************
void
ADC_setOffsetTrim(uint32_t base)
{
uint16_t *offset;
uint32_t moduleShiftVal;
uint16_t offsetShiftVal;
uint16_t analogRefRegVal;
ADC_ReferenceMode refMode;
ADC_ReferenceVoltage refVoltage;
//
// Check the arguments.
//
ASSERT(ADC_isBaseValid(base));
//
// Assign a shift amount corresponding to which ADC module is being
// configured.
//
switch(base)
{
case ADCA_BASE:
moduleShiftVal = 0U;
break;
case ADCC_BASE:
moduleShiftVal = 1U;
break;
default:
//
// Invalid base address!!
//
moduleShiftVal = 0U;
break;
}
//
// Read the Analog Reference Control Register value to determine the
// ADC reference mode and reference voltage value.
//
analogRefRegVal = HWREGH(ANALOGSUBSYS_BASE + ASYSCTL_O_ANAREFCTL);
//
// Calculate refMode and refVoltage based on input ADC base
//
refMode = (ADC_ReferenceMode)((analogRefRegVal >> moduleShiftVal) & 1U);
refVoltage = (ADC_ReferenceVoltage)((analogRefRegVal >>
(ADC_VOLTAGE_REF_REG_OFFSET + moduleShiftVal)) & 1U);
//
// Offset trim for internal VREF 3.3V is unique and stored in upper byte.
//
if((refMode == ADC_REFERENCE_INTERNAL) &&
(refVoltage == ADC_REFERENCE_3_3V))
{
offsetShiftVal = 8U;
}
else
{
offsetShiftVal = 0U;
}
//
// Set up pointer to offset trim in OTP.
//
uint32_t *offsetKey;
offsetKey = (uint32_t *)ADC_OFFSET_TRIM_KEY_OTP_MP3;
if(*offsetKey == TI_OTP_DEV_KEY)
{
offset = (uint16_t *)(ADC_OFFSET_TRIM_OTP_ADCA_MP3 + moduleShiftVal);
}
else
{
offsetKey = (uint32_t *)ADC_OFFSET_TRIM_KEY_OTP_MP1;
if(*offsetKey == TI_OTP_DEV_KEY)
{
offset = (uint16_t *)(ADC_OFFSET_TRIM_OTP_ADCA_MP1 +
moduleShiftVal);
}
else
{
*offset = 0U;
}
}
//
// Get offset trim from OTP and write it to the register.
//
EALLOW;
HWREGH(base + ADC_O_OFFTRIM) = (*offset >> offsetShiftVal) & 0xFFU;
EDIS;
}
此致、
赞讷