Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

fucntion in C++ in CUBEide

I am trying to write a function in c for stm32 board.

    float computeMotorSpeed(TIM_HandleTypeDef &htimer, uint32_t &PreviousCount ) {
    int32_t DiffCount = 0;
    uint32_t  CurrentCount = 0;
    CurrentCount = __HAL_TIM_GET_COUNTER(&htimer); /*evaluate increment of timer counter from previous count*/

    if (__HAL_TIM_IS_TIM_COUNTING_DOWN(&htimer)) {
        /* check for counter underflow */
        if (CurrentCount <= PreviousCount) {
            DiffCount = CurrentCount - PreviousCount;
        }
        else {
            DiffCount = -((TIM3_ARR_VALUE+1) - CurrentCount) - PreviousCount;
        }
    }
    else {
        /* check for counter overflow */
        if (CurrentCount >= PreviousCount) {
            DiffCount = CurrentCount - PreviousCount;
        }
        else {
            DiffCount = ((TIM3_ARR_VALUE+1) - PreviousCount) + CurrentCount;
        }
    }

    PreviousCount = CurrentCount;
    return (float) DiffCount*60/(TS*TIM3_ARR_VALUE); // rpm (round per minute);
}

But i have the following error.

error: expected ';', ',' or ')' before '&' token

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

I am trying to pass the values by reference but I have an error. Yet when I pass by the value as follows the compiler does not show me errors.

    float computeMotorSpeed(TIM_HandleTypeDef htimer, uint32_t PreviousCount ) {
    int32_t DiffCount = 0;
    uint32_t  CurrentCount = 0;
    CurrentCount = __HAL_TIM_GET_COUNTER(&htimer); /*evaluate increment of timer counter from previous count*/

    if (__HAL_TIM_IS_TIM_COUNTING_DOWN(&htimer)) {
        /* check for counter underflow */
        if (CurrentCount <= PreviousCount) {
            DiffCount = CurrentCount - PreviousCount;
        }
        else {
            DiffCount = -((TIM3_ARR_VALUE+1) - CurrentCount) - PreviousCount;
        }
    }
    else {
        /* check for counter overflow */
        if (CurrentCount >= PreviousCount) {
            DiffCount = CurrentCount - PreviousCount;
        }
        else {
            DiffCount = ((TIM3_ARR_VALUE+1) - PreviousCount) + CurrentCount;
        }
    }

    PreviousCount = CurrentCount;
    return (float) DiffCount*60/(TS*TIM3_ARR_VALUE); // rpm (round per minute);
}

why the first case (passing by reference) is not correct?

>Solution :

There is no pass-by-reference in C, so the C compiler doesn’t know what to do with & in the argument-passing context. You’ll need to pass a pointer using * and dereference to get the same effect. Elaborating on comment:

// use * to denote pointers
float computeMotorSpeed(TIM_HandleTypeDef *htimer, uint32_t *PreviousCount ) {
   ...
   // don't "take the address" here anymore, the pointer is the address
   CurrentCount = __HAL_TIM_GET_COUNTER(htimer); /*evaluate increment of timer counter from previous count*/

   if (__HAL_TIM_IS_TIM_COUNTING_DOWN(htimer)) {
        /* check for counter underflow */
        // and you must dereference PreviousCount with * everywhere to access
        // its value
        if (CurrentCount <= *PreviousCount) {
            DiffCount = CurrentCount - *PreviousCount;
        }
   ...
   *PreviousCount = CurrentCount;
   return ...;
}

And you would call this function with something like

// here, & means "take the address of", as you used it in OP
float floatRet = computeMotorSpeed(&htimer, &PreviousCount);
Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading