Просмотр исходного кода

Merge branch 'bugfix/propagate_isr_allocation_failure' into 'master'

Fix MCPWM multiplication overflow

Closes IDFGH-8151 and IDFGH-8155

See merge request espressif/esp-idf!19829
morris 3 лет назад
Родитель
Сommit
82f2ad9b6d

+ 4 - 2
components/driver/deprecated/mcpwm_legacy.c

@@ -298,9 +298,11 @@ esp_err_t mcpwm_set_duty_in_us(mcpwm_unit_t mcpwm_num, mcpwm_timer_t timer_num,
 
     mcpwm_critical_enter(mcpwm_num);
     int real_group_prescale = mcpwm_ll_group_get_clock_prescale(hal->dev);
-    unsigned long int real_timer_clk_hz =
+    // to avid multiplication overflow, use uint64_t here
+    uint64_t real_timer_clk_hz =
         MCPWM_GROUP_CLK_SRC_HZ / real_group_prescale / mcpwm_ll_timer_get_clock_prescale(hal->dev, timer_num);
-    mcpwm_ll_operator_set_compare_value(hal->dev, op, cmp, duty_in_us * real_timer_clk_hz / 1000000);
+    uint64_t compare_val = real_timer_clk_hz * duty_in_us / 1000000;
+    mcpwm_ll_operator_set_compare_value(hal->dev, op, cmp, (uint32_t)compare_val);
     mcpwm_ll_operator_enable_update_compare_on_tez(hal->dev, op, cmp, true);
     mcpwm_critical_exit(mcpwm_num);
     return ESP_OK;

+ 5 - 3
components/driver/deprecated/timer_legacy.c

@@ -284,16 +284,18 @@ esp_err_t timer_isr_callback_add(timer_group_t group_num, timer_idx_t timer_num,
     ESP_RETURN_ON_FALSE(group_num < TIMER_GROUP_MAX, ESP_ERR_INVALID_ARG, TIMER_TAG,  TIMER_GROUP_NUM_ERROR);
     ESP_RETURN_ON_FALSE(timer_num < TIMER_MAX, ESP_ERR_INVALID_ARG, TIMER_TAG,  TIMER_NUM_ERROR);
     ESP_RETURN_ON_FALSE(p_timer_obj[group_num][timer_num] != NULL, ESP_ERR_INVALID_ARG, TIMER_TAG,  TIMER_NEVER_INIT_ERROR);
+    esp_err_t ret = ESP_OK;
 
     timer_disable_intr(group_num, timer_num);
     p_timer_obj[group_num][timer_num]->timer_isr_fun.fn = isr_handler;
     p_timer_obj[group_num][timer_num]->timer_isr_fun.args = args;
     p_timer_obj[group_num][timer_num]->timer_isr_fun.isr_timer_group = group_num;
-    timer_isr_register(group_num, timer_num, timer_isr_default, (void *)p_timer_obj[group_num][timer_num],
-                       intr_alloc_flags, &(p_timer_obj[group_num][timer_num]->timer_isr_fun.timer_isr_handle));
+    ret = timer_isr_register(group_num, timer_num, timer_isr_default, (void *)p_timer_obj[group_num][timer_num],
+                             intr_alloc_flags, &(p_timer_obj[group_num][timer_num]->timer_isr_fun.timer_isr_handle));
+    ESP_RETURN_ON_ERROR(ret, TIMER_TAG, "register interrupt service failed");
     timer_enable_intr(group_num, timer_num);
 
-    return ESP_OK;
+    return ret;
 }
 
 esp_err_t timer_isr_callback_remove(timer_group_t group_num, timer_idx_t timer_num)

+ 3 - 3
components/driver/include/driver/mcpwm_types.h

@@ -98,11 +98,11 @@ typedef struct {
  * @brief MCPWM fault event callback function
  *
  * @param fault MCPWM fault handle
- * @param ev_data MCPWM fault event data, fed by driver
+ * @param edata MCPWM fault event data, fed by driver
  * @param user_ctx User data, set in `mcpwm_fault_register_event_callbacks()`
  * @return whether a task switch is needed after the callback returns
  */
-typedef bool (*mcpwm_fault_event_cb_t)(mcpwm_fault_handle_t fault, const mcpwm_fault_event_data_t *ev_data, void *user_ctx);
+typedef bool (*mcpwm_fault_event_cb_t)(mcpwm_fault_handle_t fault, const mcpwm_fault_event_data_t *edata, void *user_ctx);
 
 /**
  * @brief MCPWM compare event data
@@ -134,7 +134,7 @@ typedef struct {
  * @brief MCPWM capture event callback function
  *
  * @param cap_channel MCPWM capture channel handle
- * @param ev_data MCPWM capture event data, fed by driver
+ * @param edata MCPWM capture event data, fed by driver
  * @param user_ctx User data, set in `mcpwm_capture_channel_register_event_callbacks()`
  * @return Whether a high priority task has been waken up by this function
  */