This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TMS320F280025C:指针问题

Guru**** 2408180 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1112548/tms320f280025c-pointer-problem

器件型号:TMS320F280025C

struct data_base buffer[] = {
                            {.address = 0x100,  .value = &MI_L_U_FLT_SAMPLE},
                            {.address = 0x101,  .value = &MI_L_V_FLT_SAMPLE},
                            {.address = 0x102,  .value = &MI_L_W_FLT_SAMPLE},
                            {.address = 0x103,  .value = &MI_TRAC_BATT_FLT_SAMPLE},
                            {.address = 0x104,  .value = &MT_COLD_PLATE_FLT_SAMPLE},
                            {.address = 0x105,  .value = &MU_FUEL_CELL_FLT_SAMPLE},
                            {.address = 0x106,  .value = &MU_FUEL_CELL_PCH_FLT_SAMPLE},
                            {.address = 0x107,  .value = &MU_TRAC_BATT_FLT_SAMPLE},
                            {.address = 0x108,  .value = &MU_TRAC_BATT_PCH_FLT_SAMPLE},
                            {.address = 0x109,  .value = (uint16_t *) &MI_L_U_FLT_AVG},
                            {.address = 0x10A,  .value = (uint16_t *) &MI_L_V_FLT_AVG},
                            {.address = 0x10B,  .value = (uint16_t *) &MI_L_W_FLT_AVG},
                            {.address = 0x10C,  .value = (uint16_t *) &MI_TRAC_BATT_FLT_AVG},
                            {.address = 0x10D,  .value = (uint16_t *) &MT_COLD_PLATE_FLT_AVG},
                            {.address = 0x10E,  .value = (uint16_t *) &MU_FUEL_CELL_FLT_AVG},
                            {.address = 0x10F,  .value = (uint16_t *) &MU_FUEL_CELL_PCH_FLT_AVG},
                            {.address = 0x110,  .value = (uint16_t *) &MU_TRAC_BATT_FLT_AVG},
                            {.address = 0x111,  .value = (uint16_t *) &MU_TRAC_BATT_PCH_FLT_AVG},
                            {.address = 0x112,  .value = &THRESHOLD_MI_L_U_DIGITAL},
                            {.address = 0x113,  .value = &THRESHOLD_MI_L_V_DIGITAL},
                            {.address = 0x114,  .value = &THRESHOLD_MI_L_W_DIGITAL},
                            {.address = 0x115,  .value = &THRESHOLD_MI_TRAC_BATT_DIGITAL},
                            {.address = 0x116,  .value = &THRESHOLD_MU_FUEL_CELL_PCH_DIGITAL},
                            {.address = 0x117,  .value = &THRESHOLD_MU_TRAC_BATT_PCH_DIGITAL},
                            {.address = 0x118,  .value = (uint16_t *) &THRESHOLD_MI_L_U},
                            {.address = 0x119,  .value = (uint16_t *) &THRESHOLD_MI_L_V},
                            {.address = 0x11A,  .value = (uint16_t *) &THRESHOLD_MI_L_W},
                            {.address = 0x11B,  .value = (uint16_t *) &THRESHOLD_MI_TRAC_BATT},
                            {.address = 0x11C,  .value = (uint16_t *) &THRESHOLD_MT_COLD_PLATE},
                            {.address = 0x11D,  .value = (uint16_t *) &THRESHOLD_MU_FUEL_CELL_PCH},
                            {.address = 0x11E,  .value = (uint16_t *) &THRESHOLD_MU_TRAC_BATT_PCH},
                            {.address = 0x11F,  .value = (uint16_t *) &bottomswitch_U_output_current_corrector},
                            {.address = 0x120,  .value = (uint16_t *) &bottomswitch_V_output_current_corrector},
                            {.address = 0x121,  .value = (uint16_t *) &bottomswitch_W_output_current_corrector},
                            {.address = 0x122,  .value = (uint16_t *) &duty_cycle_bottom_switch_U},
                            {.address = 0x123,  .value = (uint16_t *) &duty_cycle_bottom_switch_V},
                            {.address = 0x124,  .value = (uint16_t *) &duty_cycle_bottom_switch_W},
                            /// Applied duty cycle for open loop mode regulation
                            {.address = 0x125,  .value = &epwm_dutycyle},
                            {.address = 0x126,  .value = (uint16_t *) &EPWM_PHI},
                            {.address = 0x127,  .value = (uint16_t *) &EPWM_TBPRD},
                            {.address = 0x128,  .value = (uint16_t *) &activate_rst},
                            {.address = 0x129,  .value = (uint16_t *) &b_decrease_ramp},
                            {.address = 0x12A,  .value = (uint16_t *) &bPrech_batt_Ok},
                            {.address = 0x12B,  .value = (uint16_t *) &bPrech_fc_Ok},
                            {.address = 0x12C,  .value = (uint16_t *) &bStartConv},
                            {.address = 0x12D,  .value = &loop_type},
                            {.address = 0x12E,  .value = &step_fault},
                            {.address = 0x12F,  .value = &step_global},
                            {.address = 0x130,  .value = &step_shutdown},
                            //{.adress = 0x131,  .value = &GPIO_readPin(27)},
                            {.address = 0x132,  .value = (uint16_t *) &ack_ok},
                            {.address = 0x133,  .value = (uint16_t *) &bStartConv},
                            {.address = 0x134,  .value = (uint16_t *) &cold_plate_state_error},
                            {.address = 0x135,  .value = (uint16_t *) &drv_u_state},
                            {.address = 0x136,  .value = (uint16_t *) &drv_v_state},
                            {.address = 0x137,  .value = (uint16_t *) &drv_w_state},
                            {.address = 0x138,  .value = (uint16_t *) &k_line_batt_state_error},
                            {.address = 0x139,  .value = (uint16_t *) &k_line_fc_state_error},
                            {.address = 0x13A,  .value = (uint16_t *) &k_pl_batt_state_error},
                            {.address = 0x13B,  .value = (uint16_t *) &k_pl_fc_state_error},
                            {.address = 0x13C,  .value = (uint16_t *) &mi_l_u_state},
                            {.address = 0x13D,  .value = (uint16_t *) &mi_l_v_state},
                            {.address = 0x13E,  .value = (uint16_t *) &mi_l_w_state},
                            {.address = 0x13F,  .value = (uint16_t *) &mi_trac_batt_state},
                            {.address = 0x140,  .value = (uint16_t *) &mu_fuel_cell_state},
                            {.address = 0x141,  .value = (uint16_t *) &mu_trac_batt_state},
                            {.address = 0x142,  .value = &battery.state},
                            {.address = 0x143,  .value = &fuel_cell.state},
                            {.address = 0x144,  .value = (uint16_t *) &b_fuel_cell_current_mode},
                            {.address = 0x145,  .value = (uint16_t *) &b_fuel_cell_open_mode},
                            {.address = 0x146,  .value = (uint16_t *) &b_fuel_cell_voltage_mode},
                            /// Duty cycle to apply
                            {.address = 0x147,  .value = &epwm_dutycyle},
                            /// Fuel cell current consign
                            {.address = 0x148,  .value = &I_cons_fc},
                            /// Parameters for voltage loop corrector
                            {.address = 0x149,  .value = (uint16_t *) &(voltage_mode.INTEGER_HIGH)},
                            {.address = 0x14A,  .value = (uint16_t *) &(voltage_mode.INTEGER_LOW)},
                            {.address = 0x14B,  .value = (uint16_t *) &(voltage_mode.KI)},
                            {.address = 0x14C,  .value = (uint16_t *) &(voltage_mode.KP)},
                            {.address = 0x14D,  .value = (uint16_t *) &(voltage_mode.OUT_HIGH)},
                            {.address = 0x14E,  .value = (uint16_t *) &(voltage_mode.OUT_LOW)},
                            {.address = 0x14F,  .value = (uint16_t *) &(voltage_mode.TI)},
                            /// Parameters for current loop corrector
                            {.address = 0x150,  .value = (uint16_t *) &(current_mode.INTEGER_HIGH)},
                            {.address = 0x151,  .value = (uint16_t *) &(current_mode.INTEGER_LOW)},
                            {.address = 0x152,  .value = (uint16_t *) &(current_mode.KI)},
                            {.address = 0x153,  .value = (uint16_t *) &(current_mode.KP)},
                            {.address = 0x154,  .value = (uint16_t *) &(current_mode.OUT_HIGH)},
                            {.address = 0x155,  .value = (uint16_t *) &(current_mode.OUT_LOW)},
                            {.address = 0x156,  .value = (uint16_t *) &(current_mode.TI)},
                            /// Fuel cell voltage consign
                            {.address = 0x157,  .value = &V_cons_fc}
};
struct data_base screenshot_data[] =
{
     {0, 0},
     {0, 0},
     {0, 0},
     {0, 0},
     {0, 0}
};

/*
 * copy_data function perform memory manipulation between CAN query
 * and current available data to keep a photo of all values to transfer
 *
 *
 * \param[in] source - can_frame contains start address and number of values to copy
 * \param[in] table - pointer on global buffer that stores all values
 * \param[out] copy_instant_value - pointer on output buffer.
 *
 * */
uint32_t data_can;
void copy_data(struct can_frame source, struct data_base * table, struct data_base * copy_instant_value)
{
    static uint16_t i = 0;
    static uint16_t j = 0;

    /**
     * Search starting element which correspond to address on CAN frame.
     */
    for(i=0; i < 87; i++)
    {
        if(source.address == table[i]->address)
        {
            // i point to starting element
            break;
        }
        if(i == (sizeof(table)/sizeof(data_base_t) - 1))
        {
            //printf("WARNING!  an error or exit code might be raised, no matches found");
        }
    }
    /**
     * Search of the end element to copy
     */
    for(j=0; j<source.number_of_registers; j++)
    {
        copy_instant_value[j]->address = table[i + j]->address;
        /// WARNING ERROR TODO SECTION CRITIC
//        CRITICAL_SECTION_ENTER
        copy_instant_value[j]->value = table[i + j]->value;
        //data_can = *(uint32_t *)&MI_L_U_FLT_AVG;
//        CRITICAL_SECTION_EXIT
    }
}

大家好、

我有一个问题、我想浏览我的结构来检测匹配。 在"复制数据函数"中、我的指针似乎有问题、我传递了我的函数的参数两个关于结构的指针。 如果我找到匹配项、我希望从匹配项+偏移量中复制结构体、并在另一个结构体中。 编译器返回错误:#45表达式必须具有指针类型。

可以帮帮我吗?

谢谢

Damien

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Damien、

    错误报告在哪一行? 您是否有一个修整后的项目、我可以尝试 重新创建该问题?

    谢谢、此致、

    桑托什

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!  

    我尚未修整项目、但问题位于第127、142和145行的函数"copy_data"中。 我的指针显然有问题、但我看不到哪个指针。

    谢谢

    Damien

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="489604" URL"~/support/microriers/c2000-microrims-group/c2000/f/c2000-microrims-forum/1112548/tms320f280025c-pointer-problem-probleme"]编译器返回错误:#45表达式必须具有指针类型。

    table[i]、 table[i + j] 和  copy_instate_value[j]表达式会生成一个结构体、而不是指向结构的指针。

    尝试从以下位置进行更改:

            // Line 127
            if(source.address == table[i]->address)
    
            // Line 142
            copy_instant_value[j]->address = table[i + j]->address;
    
            // Line 145
            copy_instant_value[j]->value = table[i + j]->value;

    至:

            // Line 127
            if(source.address == table[i].address)
    
            // Line 142
            copy_instant_value[j].address = table[i + j].address;
    
            // Line 145
            copy_instant_value[j].value = table[i + j].value;

    编辑: copy_instate_value[j]也会受到影响。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    谢谢

    Damien