Skip to main content
Visitor II
January 18, 2023
Question

FreeRTOS - Task keep running and remain of infinite loop

  • January 18, 2023
  • 2 replies
  • 3342 views

Hi,

Why the task keep running and remain of infinite loop, and do not enter another function ?

    This topic has been closed for replies.

    2 replies

    Super User
    January 18, 2023

    your code snippets?

    AngleAuthor
    Visitor II
    January 18, 2023

    I don't know why it keep remain at first loop only.

    Could you please help to see whats wrong with this code.

    /* USER CODE BEGIN Header_StartDefaultTask */

    /**

     * @brief Function implementing the defaultTask thread.

     * @param argument: Not used

     * @retval None

     */

    /* USER CODE END Header_StartDefaultTask */

    void StartDefaultTask(void *argument)

    {

    data = 0x00;

    HAL_I2C_Mem_Write(&hi2c4, MPU6050_ADDR, PWR_MGMT_1_REG, 1, &data, 1,HAL_MAX_DELAY);

    data = 0x08;

    HAL_I2C_Mem_Write(&hi2c4, MPU6050_ADDR, GYRO_CONFIG_REG, 1, &data, 1,HAL_MAX_DELAY);

    data = 0x10;

    HAL_I2C_Mem_Write(&hi2c4, MPU6050_ADDR, ACC_CONFIG_REG, 1, &data, 1,HAL_MAX_DELAY);

    for (i = 0; i < 2000; i++) {

    prevtime2 = time2;

    time2 = HAL_GetTick();

    elapsedtime2 = (time2 - prevtime2) * 1000;

    cuffer[0] = 0x43;

    HAL_I2C_Master_Transmit(&hi2c4, MPU6050_ADDR, cuffer, 1, HAL_MAX_DELAY);

    HAL_I2C_Master_Receive(&hi2c4, MPU6050_ADDR, cuffer, 6, HAL_MAX_DELAY);

    gyro_raw[0] = (cuffer[0] << 8 | cuffer[1]);  //x-axis raw data

    gyro_raw[1] = (cuffer[2] << 8 | cuffer[3]);  //y-axis raw data

    gyro_raw[2] = (cuffer[4] << 8 | cuffer[5]);  //z-axis raw data

    gyro_cal[0] += gyro_raw[0];

    gyro_cal[1] += gyro_raw[1];

    gyro_cal[2] += gyro_raw[2];

    osDelay(3);

    // HAL_Delay(3);

    }

    gyro_cal[0] /= 2000;

    gyro_cal[1] /= 2000;

    gyro_cal[2] /= 2000;

     /* USER CODE BEGIN 5 */

     /* Infinite loop */

     for(;;)

     {

      prevtime1 = time1;

    time1 = HAL_GetTick();

    elapsedtime1 = (time1 - prevtime1) * 1000;

    //accelerometer register address

    tuffer[0] = 0x3B;

    HAL_I2C_Master_Transmit(&hi2c4, MPU6050_ADDR, tuffer, 1, HAL_MAX_DELAY);

    HAL_I2C_Master_Receive(&hi2c4, MPU6050_ADDR, tuffer, 6, HAL_MAX_DELAY);

    acc_raw[0] = (tuffer[0] << 8 | tuffer[1]);  //x-axis raw data

    acc_raw[1] = (tuffer[2] << 8 | tuffer[3]);  //y-axis raw data

    acc_raw[2] = (tuffer[4] << 8 | tuffer[5]);  //z-axis raw data

    //temperature register address

    buffer[0] = 0x41;

    HAL_I2C_Master_Transmit(&hi2c4, MPU6050_ADDR, buffer, 1, HAL_MAX_DELAY);

    HAL_I2C_Master_Receive(&hi2c4, MPU6050_ADDR, buffer, 2, HAL_MAX_DELAY);

    raw_temp = (buffer[0] << 8 | buffer[1]);

    temp = (raw_temp / 340.0) + 36.53;

    //gyro register address

    cuffer[0] = 0x43;

    HAL_I2C_Master_Transmit(&hi2c4, MPU6050_ADDR, cuffer, 1, HAL_MAX_DELAY);

    HAL_I2C_Master_Receive(&hi2c4, MPU6050_ADDR, cuffer, 6, HAL_MAX_DELAY);

    gyro_raw[0] = (cuffer[0] << 8 | cuffer[1]); //x-axis

    gyro_raw[1] = (cuffer[2] << 8 | cuffer[3]); //y-axis

    gyro_raw[2] = (cuffer[4] << 8 | cuffer[5]); //z-axis

    gyro_raw[0] -= gyro_cal[0];

    gyro_raw[1] -= gyro_cal[1];

    gyro_raw[2] -= gyro_cal[2] + 0.79;

    angle_pitch_gyro += gyro_raw[0] * 0.0000611;

    angle_roll_gyro += gyro_raw[1] * 0.0000611;

    angle_pitch_gyro += angle_roll_gyro * sin(gyro_raw[2] * 0.000001066);

    angle_roll_gyro -= angle_pitch_gyro * sin(gyro_raw[2] * 0.000001066);

    //EULERS Angle(accelerometer)

    acc_total_vector = sqrt((acc_raw[0] * acc_raw[0]) + (acc_raw[1] * acc_raw[1])+ (acc_raw[2] * acc_raw[2]));

    angle_pitch_acc = asin((float) acc_raw[1] / acc_total_vector) * 57.296; //57.296

    angle_roll_acc = asin((float) acc_raw[0] / acc_total_vector) * -57.296; //-57.296

    angle_pitch_acc -= 0.00;

    angle_roll_acc -= 0.00;

    //complementary filter (LPF & HPF)

    if (set_gyro)

    {

    angle_pitch = angle_pitch_gyro * 0.9996 + angle_pitch_acc * 0.0004;

    angle_roll = angle_roll_gyro * 0.9996 + angle_roll_acc * 0.0004;

    angle_yaw = angle_yaw + gyro_raw[2] / elapsedtime1;

    } else

    {

    angle_pitch = angle_pitch_acc;

    set_gyro = true;

    }

    while ((HAL_GetTick() - prevtime) * 1000 < 4000);

    prevtime = HAL_GetTick();

    printf(" pitch = %.2f  |  roll = %.2f  |  yaw = %.2f\r\n", angle_pitch, angle_roll, angle_yaw);

    printf("\r\n");

    // printf("counting = %d \r\n", counter++);

    //  osDelay(100);

     }

     /* USER CODE END 5 */

    }

    AngleAuthor
    Visitor II
    January 18, 2023

    its got stuck at this loop and do no enter into another function

    0693W00000Y8VJBQA3.png

    Graduate
    January 18, 2023

    And your definition of i is so precious you can't share it.

    My wild guess: either the i variable is used by some other code (I don't understand why you didn't declare it in the for statement), or it's declared as 8-bit, like uint8_t.

    In the latter case the compiler issued some warnings and you ignored them, which is defnitely not a good practice.

    AngleAuthor
    Visitor II
    January 19, 2023

    okay i have change i into local variable but it still remain execute at this loop. Could you help to see whats wrong with these code? What i missing or wrong ? i attached the code