簡體   English   中英

C ++函數的奇怪輸入

[英]Strange input of function in C++

(1L<<16u)在下面的代碼中做什么? 以及此pointer(&mode_absolute_pos_el.tracking)作為函數輸入的作用是什么?

if (command_axis2.cif_mode_state == STATUS__DONE)
{
    delta_position = absolute_position - turret_pos.elevation_16bit_pm180deg;
    delta_position = MathRange_PlusMinusHalfRange32Bit(delta_position, 1L<<16u);
    mode_absolute_pos_el.speed_setpoint = MathTracking_Main(&mode_absolute_pos_el.tracking, delta_position, 0L);
}

這是完整功能,是完整功能所要求的功能:

static int16_t TwinX_AbsPos_Calc_El(int16_t absolute_position)
{
    uint16_t position_reached = NO;
    int32_t delta_position = 0L;
    if (command_axis2.cif_mode_state == STATUS__DONE)

        {
        delta_position = absolute_position - turret_pos.elevation_16bit_pm180deg;
        delta_position = MathRange_PlusMinusHalfRange32Bit(delta_position, 1L<<16u);
        mode_absolute_pos_el.speed_setpoint = MathTracking_Main(&mode_absolute_pos_el.tracking, delta_position, 0L);

        /* verify that absolute position is reached with tolerance: +/- CUSTOMER_ABSOLUTE_POS_ERROR
        * for more than MODE_ABSOLUTE_POS_OK_DELAY_IN_MS:
        * bai: That has to be here because otherwise position_reached is always "Yes" because delta_position == 0L */
        if ((delta_position < TwinX_MODE_ABSOLUTE_POS_ERROR) && (delta_position > (-1 * TwinX_MODE_ABSOLUTE_POS_ERROR)))
        {
            position_reached = YES;
        }
        mode_absolute_pos_el.absolute_pos_reached = MathDebounce_Status(&mode_absolute_pos_el.debounce, position_reached);
    }
    else
    {
        mode_absolute_pos_el.speed_setpoint = 0;
        MathTracking_SetStartCondition(&mode_absolute_pos_el.tracking, turret_speed.elev_speed_max16bit);
    }

    return mode_absolute_pos_el.speed_setpoint;
}

在下面,您可以看到MATH_DEBOUNCE:

typedef struct
{

    bool_t debounced_status;       /* debounced status ZERO / ONE */
    uint32_t debounce_counter;     /* counter */
    uint32_t threshold_for_zero;   /* threshold to set debounced status to ZERO */
    uint32_t threshold_for_one;    /* threshold to set debounced status to ONE */
    uint32_t step_down_size;       /* step size to count down. used for                             underclock */
}MATH_DEBOUNCE_t;

void MathDebounce_Init(MATH_DEBOUNCE_t *const debounce_p,
                   bool_t initial_status,
                   uint16_t debounce_delay,
                   uint16_t underclock);
void MathDebounce_ResetStatus(MATH_DEBOUNCE_t *const debounce_p, bool_t     reset_status);
bool_t MathDebounce_Status(MATH_DEBOUNCE_t *const debounce_p, bool_t  status);

1 << 16是2 ^ 16。 <<是左二進制移位運算符。

讓我們看一下如何獲得2 ^ 3,假設您有1個二進制形式的0b0001 關於二進制系統的一點是,2的冪在其二進制表示中只有一位,因此2^3 = 8看起來像0b1000 這是獲得2的冪的非常快速的方法。

將指針傳遞給函數通常是從函數中獲取多個輸出的一種方法。 就像返回值是錯誤代碼一樣,而函數的實際輸出是通過傳遞給它的指針傳遞的。

但是很難說出它到底是做什么的,因為您沒有提供該函數的代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM