/* * SPDX-FileCopyrightText: 2017-2024 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 OR MIT *//* ... *///#include"freertos/FreeRTOS.h"#include"freertos/task.h"#include"esp_app_trace_util.h"#include"sdkconfig.h"#defineESP_APPTRACE_PRINT_LOCK0//////////////////////////////////////////////////////////////////////////////////////////////////////////////// Locks ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////#ifESP_APPTRACE_PRINT_LOCKstaticesp_apptrace_lock_ts_log_lock={.mux=portMUX_INITIALIZER_UNLOCKED};#endifintesp_apptrace_log_lock(void){#ifESP_APPTRACE_PRINT_LOCKesp_apptrace_tmo_ttmo;esp_apptrace_tmo_init(&tmo,ESP_APPTRACE_TMO_INFINITE);intret=esp_apptrace_lock_take(&s_log_lock,&tmo);returnret;/* ... */#elsereturn0;#endif}{ ... }voidesp_apptrace_log_unlock(void){#ifESP_APPTRACE_PRINT_LOCKesp_apptrace_lock_give(&s_log_lock);#endif}{ ... }//////////////////////////////////////////////////////////////////////////////////////////////////////////////// TIMEOUT ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////esp_err_tesp_apptrace_tmo_check(esp_apptrace_tmo_t*tmo){if(tmo->tmo!=(int64_t)-1){tmo->elapsed=esp_timer_get_time()-tmo->start;if(tmo->elapsed>=tmo->tmo){returnESP_ERR_TIMEOUT;}{...}}{...}returnESP_OK;}{ ... }//////////////////////////////////////////////////////////////////////////////////////////////////////////////// LOCK ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////esp_err_tesp_apptrace_lock_take(esp_apptrace_lock_t*lock,esp_apptrace_tmo_t*tmo){esp_err_tret;while(1){// Try enter a critical section (i.e., take the spinlock) with 0 timeoutif(portTRY_ENTER_CRITICAL(&(lock->mux),0)==pdTRUE){returnESP_OK;}{...}// Failed to enter the critical section, so interrupts are still enabled. Check if we have timed out.ret=esp_apptrace_tmo_check(tmo);if(ret!=ESP_OK){break;// Timed out, exit now}{...}// Haven't timed out, try again}{...}returnret;}{ ... }esp_err_tesp_apptrace_lock_give(esp_apptrace_lock_t*lock){portEXIT_CRITICAL(&(lock->mux));returnESP_OK;}{ ... }///////////////////////////////////////////////////////////////////////////////////////////////////////////// RING BUFFER ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////uint8_t*esp_apptrace_rb_produce(esp_apptrace_rb_t*rb,uint32_tsize){uint8_t*ptr=rb->data+rb->wr;// check for available spaceif(rb->rd<=rb->wr){// |?R......W??|if(rb->wr+size>=rb->size){if(rb->rd==0){returnNULL;// cannot wrap wr}{...}if(rb->wr+size==rb->size){rb->wr=0;}{...}else{// check if we can wrap wr earlier to get space for requested sizeif(size>rb->rd-1){returnNULL;// cannot wrap wr}{...}// shrink buffer a bit, full size will be restored at rd wrappingrb->cur_size=rb->wr;rb->wr=0;ptr=rb->data;if(rb->rd==rb->cur_size){rb->rd=0;if(rb->cur_size<rb->size){rb->cur_size=rb->size;}{...}}{...}rb->wr+=size;}{...}}{...}else{rb->wr+=size;}{...}}{...}else{// |?W......R??|if(size>rb->rd-rb->wr-1){returnNULL;}{...}rb->wr+=size;}{...}returnptr;}{ ... }uint8_t*esp_apptrace_rb_consume(esp_apptrace_rb_t*rb,uint32_tsize){uint8_t*ptr=rb->data+rb->rd;if(rb->rd<=rb->wr){// |?R......W??|if(rb->rd+size>rb->wr){returnNULL;}{...}rb->rd+=size;}{...}else{// |?W......R??|if(rb->rd+size>rb->cur_size){returnNULL;}{...}elseif(rb->rd+size==rb->cur_size){// restore full size usageif(rb->cur_size<rb->size){rb->cur_size=rb->size;}{...}rb->rd=0;}{...}else{rb->rd+=size;}{...}}{...}returnptr;}{ ... }uint32_tesp_apptrace_rb_read_size_get(esp_apptrace_rb_t*rb){uint32_tsize=0;if(rb->rd<=rb->wr){// |?R......W??|size=rb->wr-rb->rd;}{...}else{// |?W......R??|size=rb->cur_size-rb->rd;}{...}returnsize;}{ ... }uint32_tesp_apptrace_rb_write_size_get(esp_apptrace_rb_t*rb){uint32_tsize=0;if(rb->rd<=rb->wr){// |?R......W??|size=rb->size-rb->wr;if(size&&rb->rd==0){size--;}{...}}{...}else{// |?W......R??|size=rb->rd-rb->wr-1;}{...}returnsize;}{ ... }
Details
Show: from
Types: Columns:
All items filtered out
All items filtered out
This file uses the notable symbols shown below. Click anywhere in the file to view more details.