From cb85dcda77f5cee12ff552c8e9bd331c5a0c2723 Mon Sep 17 00:00:00 2001 From: Carlos Date: Mon, 24 May 2021 15:47:24 +0200 Subject: [PATCH] - remove unnecessary median buffers - change some variable declaration locations - use socket recv instead of read o do error handling after each socket operation --- main/main.c | 300 +++++++++++++++++++++----------------------------- sdkconfig | 22 ++-- sdkconfig.old | 13 +-- 3 files changed, 144 insertions(+), 191 deletions(-) diff --git a/main/main.c b/main/main.c index 2ce8bbf..552bacb 100644 --- a/main/main.c +++ b/main/main.c @@ -168,8 +168,6 @@ SemaphoreHandle_t timer0_syncSampleSemaphoreHandle = NULL; SemaphoreHandle_t latencyBufSemaphoreHandle = NULL; #define MEDIAN_FILTER_LONG_BUF_LEN 299 -#define MEDIAN_FILTER_MINI_BUF_LEN 199 -#define MEDIAN_FILTER_SHORT_BUF_LEN 19 uint8_t latencyBufCnt = 0; static int8_t latencyBuffFull = 0; @@ -177,12 +175,6 @@ static int8_t latencyBuffFull = 0; static sMedianFilter_t latencyMedianFilterLong; static sMedianNode_t latencyMedianLongBuffer[MEDIAN_FILTER_LONG_BUF_LEN]; -static sMedianFilter_t latencyMedianFilterMini; -static sMedianNode_t latencyMedianMiniBuffer[MEDIAN_FILTER_MINI_BUF_LEN]; - -static sMedianFilter_t latencyMedianFilterShort; -static sMedianNode_t latencyMedianShortBuffer[MEDIAN_FILTER_SHORT_BUF_LEN]; - static int64_t latencyToServer = 0; //buffer_.setSize(500); @@ -193,16 +185,9 @@ static int64_t latencyToServer = 0; int64_t short_buffer[SHORT_BUFFER_LEN]; int64_t short_buffer_median[SHORT_BUFFER_LEN]; -#define MINI_BUFFER_LEN 19 -int64_t mini_buffer[MINI_BUFFER_LEN]; -int64_t mini_buffer_median[MINI_BUFFER_LEN]; - static sMedianFilter_t shortMedianFilter; static sMedianNode_t shortMedianBuffer[SHORT_BUFFER_LEN]; -static sMedianFilter_t miniMedianFilter; -static sMedianNode_t miniMedianBuffer[MINI_BUFFER_LEN]; - static int8_t currentDir = 0; //!< current apll direction, see apll_adjust() uint32_t buffer_ms = 400; @@ -559,6 +544,7 @@ int8_t reset_latency_buffer(void) { return -2; } + /* latencyMedianFilterMini.numNodes = MEDIAN_FILTER_MINI_BUF_LEN; latencyMedianFilterMini.medianBuffer = latencyMedianMiniBuffer; if (MEDIANFILTER_Init(&latencyMedianFilterMini) < 0) { @@ -574,6 +560,7 @@ int8_t reset_latency_buffer(void) { return -2; } + */ if (latencyBufSemaphoreHandle == NULL) { ESP_LOGE(TAG, "reset_diff_buffer: latencyBufSemaphoreHandle == NULL"); @@ -969,14 +956,6 @@ static void snapcast_sync_task(void *pvParameters) { currentDir = 1; // force adjust_apll to set correct playback speed adjust_apll(0); - miniMedianFilter.numNodes = MINI_BUFFER_LEN; - miniMedianFilter.medianBuffer = miniMedianBuffer; - if (MEDIANFILTER_Init(&miniMedianFilter) ) { - ESP_LOGE(TAG, "snapcast_sync_task: couldn't init miniMedianFilter. STOP"); - - return; - } - shortMedianFilter.numNodes = SHORT_BUFFER_LEN; shortMedianFilter.medianBuffer = shortMedianBuffer; if (MEDIANFILTER_Init(&shortMedianFilter) ) { @@ -1348,7 +1327,7 @@ void time_sync_msg_cb(void *args) { static void http_get_task(void *pvParameters) { struct sockaddr_in servaddr; char *start; - int sockfd = -1; + int sock = -1; char base_message_serialized[BASE_MESSAGE_SIZE]; char *hello_message_serialized = NULL; int result, size, id_counter; @@ -1359,7 +1338,7 @@ static void http_get_task(void *pvParameters) { // snapcast_sync_task_cfg_t snapcastTaskCfg; struct timeval lastTimeSync = { 0, 0 }; wire_chunk_message_t wire_chunk_message_last = {{0,0}, 0, NULL}; - esp_timer_handle_t timeSyncMessageTimer; + esp_timer_handle_t timeSyncMessageTimer = NULL; const esp_timer_create_args_t tSyncArgs = { .callback = &time_sync_msg_cb, .name = "tSyncMsg" @@ -1368,6 +1347,15 @@ static void http_get_task(void *pvParameters) { int16_t *audio = NULL; int16_t pcm_size = 120; uint16_t channels = CHANNELS; + esp_err_t err = 0; + codec_header_message_t codec_header_message; + server_settings_message_t server_settings_message; + bool received_header = false; + base_message_t base_message; + hello_message_t hello_message; + mdns_result_t *r; + + // create semaphore for time diff buffer to server latencyBufSemaphoreHandle = xSemaphoreCreateMutex(); @@ -1386,114 +1374,118 @@ static void http_get_task(void *pvParameters) { &pcmChunkQueue ); + // init diff buff median filter + latencyMedianFilterLong.numNodes = MEDIAN_FILTER_LONG_BUF_LEN; + latencyMedianFilterLong.medianBuffer = latencyMedianLongBuffer; + ESP_LOGI(TAG, "Enable mdns") ; mdns_init(); while(1) { - latencyBufCnt = 0; - - // init diff buff median filter - latencyMedianFilterLong.numNodes = MEDIAN_FILTER_LONG_BUF_LEN; - latencyMedianFilterLong.medianBuffer = latencyMedianLongBuffer; if (MEDIANFILTER_Init(&latencyMedianFilterLong) < 0) { ESP_LOGE(TAG, "reset_diff_buffer: couldn't init median filter long. STOP"); return; } - latencyMedianFilterMini.numNodes = MEDIAN_FILTER_MINI_BUF_LEN; - latencyMedianFilterMini.medianBuffer = latencyMedianMiniBuffer; - if (MEDIANFILTER_Init(&latencyMedianFilterMini) < 0) { - ESP_LOGE(TAG, "reset_diff_buffer: couldn't init median filter mini. STOP"); + esp_timer_stop(timeSyncMessageTimer); - return; - } + xSemaphoreGive(timeSyncSemaphoreHandle); - latencyMedianFilterShort.numNodes = MEDIAN_FILTER_SHORT_BUF_LEN; - latencyMedianFilterShort.medianBuffer = latencyMedianShortBuffer; - if (MEDIANFILTER_Init(&latencyMedianFilterShort) < 0) { - ESP_LOGE(TAG, "reset_diff_buffer: couldn't init median filter short. STOP"); + if (opusDecoder != NULL) { + opus_decoder_destroy(opusDecoder); + opusDecoder = NULL; + } - return; - } + reset_latency_buffer(); + if (xSemaphoreTake( latencyBufSemaphoreHandle, pdMS_TO_TICKS(1) ) == pdTRUE) { + latencyBuffFull = false; + latencyToServer = 0; - /* Wait for the callback to set the CONNECTED_BIT in the - event group. - */ -// xEventGroupWaitBits(s_wifi_event_group, WIFI_CONNECTED_EVENT, -// false, true, portMAX_DELAY); -// ESP_LOGI(TAG, "Connected to AP"); + xSemaphoreGive( latencyBufSemaphoreHandle ); + } + else { + ESP_LOGW(TAG, "couldn't reset latency"); + } // Find snapcast server // Connect to first snapcast server found - mdns_result_t * r = NULL; - esp_err_t err = 0; + r = NULL; + err = 0; while ( !r || err ) { ESP_LOGI(TAG, "Lookup snapcast service on network"); - esp_err_t err = mdns_query_ptr("_snapcast", "_tcp", 3000, 20, &r); - if(err) { - ESP_LOGE(TAG, "Query Failed"); - } - if(!r){ - ESP_LOGW(TAG, "No results found!"); - } - vTaskDelay(1000/portTICK_PERIOD_MS); + esp_err_t err = mdns_query_ptr("_snapcast", "_tcp", 3000, 20, &r); + if(err) { + ESP_LOGE(TAG, "Query Failed"); + } + + if(!r){ + ESP_LOGW(TAG, "No results found!"); + } + + vTaskDelay(1000/portTICK_PERIOD_MS); } -// ESP_LOGI(TAG,"Found %08x", r->addr->addr.u_addr.ip4.addr); - ESP_LOGI(TAG,"Found %s", inet_ntoa(r->addr->addr.u_addr.ip4.addr)); + + char serverAddr[] = "192.168.1.2"; + ESP_LOGI(TAG,"Found %s:%d", inet_ntop(AF_INET, &(r->addr->addr.u_addr.ip4.addr), serverAddr, sizeof(serverAddr)), r->port); servaddr.sin_family = AF_INET; - servaddr.sin_addr.s_addr = r->addr->addr.u_addr.ip4.addr; // inet_addr("192.168.1.158"); + servaddr.sin_addr.s_addr = r->addr->addr.u_addr.ip4.addr; servaddr.sin_port = htons(r->port); mdns_query_results_free(r); - sockfd = socket(AF_INET, SOCK_STREAM, 0); - if(sockfd < 0) { - ESP_LOGE(TAG, "... Failed to allocate socket."); - vTaskDelay(1000 / portTICK_PERIOD_MS); - continue; - } - ESP_LOGI(TAG, "... allocated socket"); + ESP_LOGI(TAG, "allocate socket"); + sock = socket(AF_INET, SOCK_STREAM, 0); + if(sock < 0) { + ESP_LOGE(TAG, "... Failed to allocate socket."); + vTaskDelay(1000 / portTICK_PERIOD_MS); + continue; + } + ESP_LOGI(TAG, "... allocated socket %d", sock); + + ESP_LOGI(TAG, "connect to socket"); + err = connect(sock, (struct sockaddr*)&servaddr, sizeof(struct sockaddr_in)); + if (err < 0) { + ESP_LOGE(TAG, "%s, %d", strerror(errno), errno); + + shutdown(sock, 2); + closesocket(sock); - if (connect(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) != 0) { - ESP_LOGE(TAG, "%s", strerror(errno)); - close(sockfd); vTaskDelay(4000 / portTICK_PERIOD_MS); + continue; } ESP_LOGI(TAG, "... connected"); - codec_header_message_t codec_header_message; - server_settings_message_t server_settings_message; - result = gettimeofday(&now, NULL); if (result) { ESP_LOGI(TAG, "Failed to gettimeofday\r\n"); return; } - bool received_header = false; - base_message_t base_message = { - SNAPCAST_MESSAGE_HELLO, - 0x0, - 0x0, - { now.tv_sec, now.tv_usec }, - { 0x0, 0x0 }, - 0x0, - }; + received_header = false; - hello_message_t hello_message = { - mac_address, - "ESP32-Caster", - VERSION_STRING, - "libsnapcast", - "esp32", - "xtensa", - 1, - mac_address, - 2, - }; + // init base mesage + base_message.type = SNAPCAST_MESSAGE_HELLO; + base_message.id = 0x0000; + base_message.refersTo = 0x0000; + base_message.sent.sec = now.tv_sec; + base_message.sent.usec = now.tv_usec; + base_message.received.sec = 0; + base_message.received.usec = 0; + base_message.size = 0x00000000; + + // init hello message + hello_message.mac = mac_address; + hello_message.hostname = "ESP32-Caster"; + hello_message.version = (char *)VERSION_STRING; + hello_message.client_name = "libsnapcast"; + hello_message.os = "esp32"; + hello_message.arch = "xtensa"; + hello_message.instance = 1; + hello_message.id = mac_address; + hello_message.protocol_version = 2; if (hello_message_serialized == NULL) { hello_message_serialized = hello_message_serialize(&hello_message, (size_t*) &(base_message.size)); @@ -1513,19 +1505,29 @@ static void http_get_task(void *pvParameters) { return; } - result = write(sockfd, base_message_serialized, BASE_MESSAGE_SIZE); + result = send(sock, base_message_serialized, BASE_MESSAGE_SIZE, 0); if (result < 0) { ESP_LOGW(TAG, "error writing base msg to socket: %s", strerror(errno)); + free(hello_message_serialized); hello_message_serialized = NULL; + + shutdown(sock, 2); + closesocket(sock); + continue; } - result = write(sockfd, hello_message_serialized, base_message.size); + result = send(sock, hello_message_serialized, base_message.size, 0); if (result < 0) { ESP_LOGW(TAG, "error writing hello msg to socket: %s", strerror(errno)); + free(hello_message_serialized); hello_message_serialized = NULL; + + shutdown(sock, 2); + closesocket(sock); + continue; } @@ -1536,7 +1538,8 @@ static void http_get_task(void *pvParameters) { size = 0; result = 0; while (size < BASE_MESSAGE_SIZE) { - result = read(sockfd, &(buff[size]), BASE_MESSAGE_SIZE - size); + //result = read(sock, &(buff[size]), BASE_MESSAGE_SIZE - size); + result = recv(sock, &(buff[size]), BASE_MESSAGE_SIZE - size, 0); if (result < 0) { break; @@ -1546,10 +1549,11 @@ static void http_get_task(void *pvParameters) { if (result < 0) { if (errno != 0 ) { - ESP_LOGW(TAG, "%s, %d", strerror(errno), errno); + ESP_LOGW(TAG, "1: %s, %d", strerror(errno), (int)errno); } - // TODO: error handling needed for robust socket application + shutdown(sock, 2); + closesocket(sock); break; // stop for(;;) will try to reconnect then } @@ -1591,7 +1595,7 @@ static void http_get_task(void *pvParameters) { return; } - result = read(sockfd, &(buff[size]), base_message.size - size); + result = recv(sock, &(buff[size]), base_message.size - size, 0); if (result < 0) { ESP_LOGW(TAG, "Failed to read from server: %d", result); @@ -1603,10 +1607,11 @@ static void http_get_task(void *pvParameters) { if (result < 0) { if (errno != 0 ) { - ESP_LOGI(TAG, "%s, %d", strerror(errno), errno); + ESP_LOGI(TAG, "2: %s, %d", strerror(errno), (int)errno); } - // TODO: error handling needed for robust socket application + shutdown(sock, 2); + closesocket(sock); break; // stop for(;;) will try to reconnect then } @@ -1802,23 +1807,6 @@ static void http_get_task(void *pvParameters) { // free(pcm_chunk_message->payload); // free(pcm_chunk_message); - - /* - // free all memory, - do { - wire_chunk_message_t *chnk = NULL; - - BaseType_t ret = xQueueReceive(pcmChunkQueueHandle, &chnk, pdMS_TO_TICKS(1) ); - if( ret != pdFAIL ) { - if (chnk != NULL) { - free(chnk->payload); - free(chnk); - chnk = NULL; - } - } - } while (uxQueueMessagesWaiting(pcmChunkQueueHandle) > 0); - xQueueReset(pcmChunkQueueHandle); - */ } } } @@ -1828,6 +1816,7 @@ static void http_get_task(void *pvParameters) { ESP_LOGE(TAG, "Decoder not supported"); } + wire_chunk_message_free(&wire_chunk_message); break; @@ -2003,67 +1992,32 @@ static void http_get_task(void *pvParameters) { if (result) { ESP_LOGI(TAG, "Failed to serialize time message\r\b"); continue; + } + + result = send(sock, base_message_serialized, BASE_MESSAGE_SIZE, 0); + if (result < 0) { + ESP_LOGW(TAG, "error writing timesync base msg to socket: %s", strerror(errno)); + + shutdown(sock, 2); + closesocket(sock); + + break; // stop for(;;) will try to reconnect then } - write(sockfd, base_message_serialized, BASE_MESSAGE_SIZE); - write(sockfd, buff, TIME_MESSAGE_SIZE); + result = send(sock, buff, TIME_MESSAGE_SIZE, 0); + if (result < 0) { + ESP_LOGW(TAG, "error writing timesync msg to socket: %s", strerror(errno)); + + shutdown(sock, 2); + closesocket(sock); + + break; // stop for(;;) will try to reconnect then + } // ESP_LOGI(TAG, "sent time sync message %ld.%06ld", now.tv_sec, now.tv_usec); } } } - - esp_timer_stop(timeSyncMessageTimer); - esp_timer_delete(timeSyncMessageTimer); - xSemaphoreGive(timeSyncSemaphoreHandle); - -// if (syncTaskHandle != NULL) { - do { - wire_chunk_message_t *chnk = NULL; - - BaseType_t ret = xQueueReceive(pcmChunkQueueHandle, &chnk, pdMS_TO_TICKS(1) ); - if( ret != pdFAIL ) { - if (chnk != NULL) { - free(chnk->payload); - free(chnk); - chnk = NULL; - } - } - } while (uxQueueMessagesWaiting(pcmChunkQueueHandle) > 0); -// xQueueReset(pcmChunkQueueHandle); - -// vTaskDelete(syncTaskHandle); -// syncTaskHandle = NULL; -// } - -// tg0_timer_deinit(); - - if (opusDecoder != NULL) { - opus_decoder_destroy(opusDecoder); - opusDecoder = NULL; - } - - reset_latency_buffer(); - if (xSemaphoreTake( latencyBufSemaphoreHandle, pdMS_TO_TICKS(1) ) == pdTRUE) { - latencyBuffFull = false; - latencyToServer = 0; - - xSemaphoreGive( latencyBufSemaphoreHandle ); - } - else { - ESP_LOGW(TAG, "couldn't reset latency"); - } - - if (sockfd != -1) { - shutdown(sockfd, 0); - //close(sockfd); - closesocket(sockfd); - - sockfd = -1; - } - - - ESP_LOGI(TAG, "... closing socket\r\n"); } } diff --git a/sdkconfig b/sdkconfig index 24b6c2c..0c6d231 100644 --- a/sdkconfig +++ b/sdkconfig @@ -890,11 +890,11 @@ CONFIG_LWIP_MAX_UDP_PCBS=16 CONFIG_LWIP_UDP_RECVMBOX_SIZE=6 # end of UDP -CONFIG_LWIP_TCPIP_TASK_STACK_SIZE=6000 -# CONFIG_LWIP_TCPIP_TASK_AFFINITY_NO_AFFINITY is not set -CONFIG_LWIP_TCPIP_TASK_AFFINITY_CPU0=y +CONFIG_LWIP_TCPIP_TASK_STACK_SIZE=8192 +CONFIG_LWIP_TCPIP_TASK_AFFINITY_NO_AFFINITY=y +# CONFIG_LWIP_TCPIP_TASK_AFFINITY_CPU0 is not set # CONFIG_LWIP_TCPIP_TASK_AFFINITY_CPU1 is not set -CONFIG_LWIP_TCPIP_TASK_AFFINITY=0x0 +CONFIG_LWIP_TCPIP_TASK_AFFINITY=0x7FFFFFFF # CONFIG_LWIP_PPP_SUPPORT is not set CONFIG_LWIP_IPV6_MEMP_NUM_ND6_QUEUE=3 CONFIG_LWIP_IPV6_ND6_NUM_NEIGHBORS=5 @@ -1043,10 +1043,10 @@ CONFIG_MBEDTLS_ECP_NIST_OPTIM=y CONFIG_MDNS_MAX_SERVICES=10 CONFIG_MDNS_TASK_PRIORITY=1 CONFIG_MDNS_TASK_STACK_SIZE=4096 -# CONFIG_MDNS_TASK_AFFINITY_NO_AFFINITY is not set -CONFIG_MDNS_TASK_AFFINITY_CPU0=y +CONFIG_MDNS_TASK_AFFINITY_NO_AFFINITY=y +# CONFIG_MDNS_TASK_AFFINITY_CPU0 is not set # CONFIG_MDNS_TASK_AFFINITY_CPU1 is not set -CONFIG_MDNS_TASK_AFFINITY=0x0 +CONFIG_MDNS_TASK_AFFINITY=0x7FFFFFFF CONFIG_MDNS_SERVICE_ADD_TIMEOUT_MS=2000 CONFIG_MDNS_TIMER_PERIOD_MS=100 # end of mDNS @@ -1367,11 +1367,11 @@ CONFIG_TCP_OVERSIZE_MSS=y # CONFIG_TCP_OVERSIZE_QUARTER_MSS is not set # CONFIG_TCP_OVERSIZE_DISABLE is not set CONFIG_UDP_RECVMBOX_SIZE=6 -CONFIG_TCPIP_TASK_STACK_SIZE=6000 -# CONFIG_TCPIP_TASK_AFFINITY_NO_AFFINITY is not set -CONFIG_TCPIP_TASK_AFFINITY_CPU0=y +CONFIG_TCPIP_TASK_STACK_SIZE=8192 +CONFIG_TCPIP_TASK_AFFINITY_NO_AFFINITY=y +# CONFIG_TCPIP_TASK_AFFINITY_CPU0 is not set # CONFIG_TCPIP_TASK_AFFINITY_CPU1 is not set -CONFIG_TCPIP_TASK_AFFINITY=0x0 +CONFIG_TCPIP_TASK_AFFINITY=0x7FFFFFFF # CONFIG_PPP_SUPPORT is not set CONFIG_ESP32_PTHREAD_TASK_PRIO_DEFAULT=5 CONFIG_ESP32_PTHREAD_TASK_STACK_SIZE_DEFAULT=3072 diff --git a/sdkconfig.old b/sdkconfig.old index 4933669..f669544 100644 --- a/sdkconfig.old +++ b/sdkconfig.old @@ -286,9 +286,9 @@ CONFIG_ESP_DISPATCHER_DELEGATE_STACK_SIZE=4096 # # Compiler options # -CONFIG_COMPILER_OPTIMIZATION_DEFAULT=y +# CONFIG_COMPILER_OPTIMIZATION_DEFAULT is not set # CONFIG_COMPILER_OPTIMIZATION_SIZE is not set -# CONFIG_COMPILER_OPTIMIZATION_PERF is not set +CONFIG_COMPILER_OPTIMIZATION_PERF=y # CONFIG_COMPILER_OPTIMIZATION_NONE is not set CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_ENABLE=y # CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_SILENT is not set @@ -774,7 +774,6 @@ CONFIG_FREERTOS_TIMER_QUEUE_LENGTH=10 CONFIG_FREERTOS_QUEUE_REGISTRY_SIZE=0 # CONFIG_FREERTOS_USE_TRACE_FACILITY is not set # CONFIG_FREERTOS_GENERATE_RUN_TIME_STATS is not set -CONFIG_FREERTOS_TASK_FUNCTION_WRAPPER=y CONFIG_FREERTOS_CHECK_MUTEX_GIVEN_BY_OWNER=y # CONFIG_FREERTOS_CHECK_PORT_CRITICAL_COMPLIANCE is not set CONFIG_FREERTOS_DEBUG_OCDAWARE=y @@ -1044,10 +1043,10 @@ CONFIG_MBEDTLS_ECP_NIST_OPTIM=y CONFIG_MDNS_MAX_SERVICES=10 CONFIG_MDNS_TASK_PRIORITY=1 CONFIG_MDNS_TASK_STACK_SIZE=4096 -# CONFIG_MDNS_TASK_AFFINITY_NO_AFFINITY is not set -CONFIG_MDNS_TASK_AFFINITY_CPU0=y +CONFIG_MDNS_TASK_AFFINITY_NO_AFFINITY=y +# CONFIG_MDNS_TASK_AFFINITY_CPU0 is not set # CONFIG_MDNS_TASK_AFFINITY_CPU1 is not set -CONFIG_MDNS_TASK_AFFINITY=0x0 +CONFIG_MDNS_TASK_AFFINITY=0x7FFFFFFF CONFIG_MDNS_SERVICE_ADD_TIMEOUT_MS=2000 CONFIG_MDNS_TIMER_PERIOD_MS=100 # end of mDNS @@ -1258,7 +1257,7 @@ CONFIG_MONITOR_BAUD_115200B=y # CONFIG_MONITOR_BAUD_OTHER is not set CONFIG_MONITOR_BAUD_OTHER_VAL=115200 CONFIG_MONITOR_BAUD=115200 -CONFIG_COMPILER_OPTIMIZATION_LEVEL_DEBUG=y +# CONFIG_COMPILER_OPTIMIZATION_LEVEL_DEBUG is not set # CONFIG_COMPILER_OPTIMIZATION_LEVEL_RELEASE is not set CONFIG_OPTIMIZATION_ASSERTIONS_ENABLED=y # CONFIG_OPTIMIZATION_ASSERTIONS_SILENT is not set