Code: Untitled.c Select all
register uint32_t var1 = 123;
DRAM_ATTR uint32_t var2 = 123;
IRAM_ATTR uint32_t var3 = 123;
Can I use IRAM_ATTR on variables or structures?
Code: Untitled.c Select all
register uint32_t var1 = 123;
DRAM_ATTR uint32_t var2 = 123;
IRAM_ATTR uint32_t var3 = 123;
You most likely shouldn't.I usually use "register"
The desired effect being...?to get the same effect?
Ok.My goal: to get the fastest possible calculations
Code: Untitled.c Select all
#define GPIO_Set(x) REG_WRITE(GPIO_OUT_W1TS_REG, 1<<x)
#define GPIO_Clear(x) REG_WRITE(GPIO_OUT_W1TC_REG, 1<<x)
#define GPIO_IN_Read(x) REG_READ(GPIO_IN_REG) & (1 << x)
#define GPIO_IN_ReadAll() REG_READ(GPIO_IN_REG)
#define GPIO_IN_ReadAll2() REG_READ(GPIO_IN1_REG)
#define DEF_PIN_1 GPIO_NUM_16
#define DEF_PIN_2 GPIO_NUM_17
#if CONFIG_ESP32_DEFAULT_CPU_FREQ_80
#define NS_PER_CLK 12.5F
#endif
#if CONFIG_ESP32_DEFAULT_CPU_FREQ_160
#define NS_PER_CLK 6.25F
#endif
#if CONFIG_ESP32_DEFAULT_CPU_FREQ_240
#define NS_PER_CLK 4.166F
#endif
typedef struct
{
uint32_t _us;
uint32_t delay_ns;
float kef;
} TimingsMath_t;
volatile TimingsMath_t DRAM_ATTR TimingsMath[20];
typedef struct
{
uint32_t _us;
uint32_t delay_ns;
float kef;
} Delay_t;
void IRAM_ATTR Core1_( void* p) {
portDISABLE_INTERRUPTS();
for (;;) {
uint32_t gpioValue = 0;
uint8_t sensor_1_status = 0;
uint8_t sensor_2_status = 0;
Delay_t tablePoint[20];
for (size_t i = 0; i < 20; i++)
{ // copy
tablePoint[i]._us = TimingsMath[i]._us;
tablePoint[i].delay_ns = TimingsMath[i].delay_ns;
tablePoint[i].kef = TimingsMath[i].kef;
}
register uint32_t _dT_us_prev_sens1 = 120UL;
register uint32_t _dT_us_prev_sens2 = 120UL;
register uint32_t _dT_us_current = 1000000;
register uint32_t _dT_us_first = 120000;
register uint32_t _baseDelay_ns = 11111;
register uint32_t delay_us = 11111;
uint8_t _start = 4;
register float kefK = 0;
int8_t active_pin_ = -1;
for (;;){
gpioValue = GPIO_IN_ReadAll(); //10tik@160MHz(6,25ns) 7tik@80MHz(8,75ns)
if( ((gpioValue >> 22) & 1) == 1){
sensor_1_status = 5;
}
if(sensor_1_status && --sensor_1_status == 0){
_dT_us_current = micros() - _dT_us_prev_sens1;
_dT_us_prev_sens1 = micros();
active_pin_ = DEF_PIN_1;
}
if( ((gpioValue >> 23) & 1) == 1){ // HIGT/
sensor_2_status = 5;
}
if(sensor_2_status && --sensor_2_status == 0){
_dT_us_current = micros() - _dT_us_prev_sens2;
_dT_us_prev_sens2 = micros();
active_pin_ = DEF_PIN_2 ;
}
if(_start > 0){
--_start;
continue;
}
for (int8_t i = 19; i >= 0 ; i--)
{
if( _dT_us_current <= tablePoint[i]._us ){
_dT_us_first = tablePoint[i]._us;
_baseDelay_ns = tablePoint[i].delay_ns;
kefK = tablePoint[i].kef;
break;
}
}
delay_us = (_baseDelay_ns - (uint32_t)((float)(_dT_us_first - _dT_us_current) *kefK)) /1000 ;
// uint32_t ccnt_st_ = XTHAL_GET_CCOUNT(); // 6,25ns
// while( (XTHAL_GET_CCOUNT() - ccnt_st_ ) < delay_us/NS_PER_CLK ); // 1000ns/6,25=160clk
esp_rom_delay_us( delay_us );
GPIO_Set(active_pin_);
esp_rom_delay_us(50);
GPIO_Clear(active_pin_);
esp_rom_delay_us(150);
active_pin_ = -1;
}
}
vTaskDelete(NULL);
}Code: Untitled.c Select all
start = XTHAL_GET_CCOUNT();
delay_us = (_baseDelay_ns - (uint32_t)((float)(_dT_us_first - _dT_us_current) *kefK)) /1000 ;
start2 = XTHAL_GET_CCOUNT();
startDiff = start2 - start ;
portENABLE_INTERRUPTS();
printf("bench:\t%lu\n", startDiff);
portDISABLE_INTERRUPTS(); Code: Select all
// Make the compiler believe that some volatile magic happens to "value"
// to prevent reordering of code/expression w.r.t. other "volatiles".
static uint32_t vltle(uint32_t value) {
// This assembly is empty (does nothing), but tells the compiler that it may have changed ("+r") the contents of "value"
asm volatile ( "\n" : "+r" (value) );
return value;
}
...
start = XTHAL_GET_CCOUNT();
delay_us = vltle( (_baseDelay_ns - (uint32_t)((float)( vltle( _dT_us_first ) - _dT_us_current) *kefK)) /1000 );
start2 = XTHAL_GET_CCOUNT();
Users browsing this forum: Google [Bot], Qwantbot, Semrush [Bot] and 11 guests