Skip to main content
Angle
Associate III
January 18, 2023
Question

FreeRTOS - Task keep running and remain of infinite loop

  • January 18, 2023
  • 8 replies
  • 3376 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.

8 replies

KnarfB
Super User
January 18, 2023

your code snippets?

Angle
AngleAuthor
Associate III
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 */

}

Angle
AngleAuthor
Associate III
January 18, 2023

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

0693W00000Y8VJBQA3.png

gbm
Super User
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.

My STM32 stuff on github - compact USB device stack and more: https://github.com/gbm-ii/gbmUSBdevice
Angle
AngleAuthor
Associate III
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