打造一个通用性MCU架构,支持CX32/AT32/NRF51/NRF52等。 OS支持RTX4/RTX5/FreeRtos。 采用VsCode+GCC组合,VsCode+KEIL5,超强开发方式。 QQ群:524408033

LiSun

打造一个通用性MCU架构,支持CX32/AT32/NRF51/NRF52等。 OS支持RTX4/RTX5/FreeRtos。 采用VsCode+GCC组合,VsCode+KEIL5,超强开发方式。 QQ群:524408033

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

现象:HTTPS建立连接的同时,MQTT也建立连接。双方都在签名证书,导致CPU抢占,致使看门狗超时。

解决:在tls层加互斥锁,防止同时建立连接。

修改文件:x\Espressif\components\esp-tls\esp_tls_mbedtls.c
在这里插入图片描述
在这里插入图片描述

部分代码如下。

#include "freertos/FreeRTOS.h"
#include "freertos/semphr.h"

SemaphoreHandle_t _semaphore = NULL;
/**
 * @brief      Create TLS/SSL server session
 */
int esp_mbedtls_server_session_create(esp_tls_cfg_server_t *cfg, int sockfd, esp_tls_t *tls)
{
    if (tls == NULL || cfg == NULL) {
        return -1;
    }
    static bool fast = false;
    if (!fast) {
        fast = true;
        _semaphore = xSemaphoreCreateMutex();
    }
    tls->role = ESP_TLS_SERVER;
    tls->sockfd = sockfd;

    xSemaphoreTake(_semaphore, portMAX_DELAY);
    esp_err_t esp_ret = esp_create_mbedtls_handle(NULL, 0, cfg, tls);
    xSemaphoreGive(_semaphore);

    if (esp_ret != ESP_OK) {
        ESP_LOGE(TAG, "create_ssl_handle failed, returned [0x%04X] (%s)", esp_ret, esp_err_to_name(esp_ret));
        ESP_INT_EVENT_TRACKER_CAPTURE(tls->error_handle, ESP_TLS_ERR_TYPE_ESP, esp_ret);
        tls->conn_state = ESP_TLS_FAIL;
        return -1;
    }
    tls->read = esp_mbedtls_read;
    tls->write = esp_mbedtls_write;
    int ret;
    while ((ret = mbedtls_ssl_handshake(&tls->ssl)) != 0) {
        if (ret != ESP_TLS_ERR_SSL_WANT_READ && ret != ESP_TLS_ERR_SSL_WANT_WRITE) {
            ESP_LOGE(TAG, "mbedtls_ssl_handshake returned -0x%04X", -ret);
            mbedtls_print_error_msg(ret);
            tls->conn_state = ESP_TLS_FAIL;
            return ret;
        }
    }
    return 0;
}
posted on 2022-08-13 11:00  xuejianqiang  阅读(198)  评论(0编辑  收藏  举报
打造一个通用性MCU架构,支持CX32/AT32/NRF51/NRF52等。 OS支持RTX4/RTX5/FreeRtos。 采用VsCode+GCC组合,VsCode+KEIL5,超强开发方式。 QQ群:524408033