#include "main.h" #include "ad0x0_i2c.h" #include "../admisc/ad0x0_timman.h" #include "../admisc/ad0x0_memman.h" #include "ad0x0_i2c_ext.h" #include static uint8_t ext_ub[AD0X0_I2C_EXT_COUNT],ext_l[AD0X0_I2C_EXT_COUNT]; static ad0x0_i2c_ext_t ext_funcs[AD0X0_I2C_EXT_COUNT]; //когда в еtypedef структуры чтото изменится - я 100% это прое..."упущу" static ad0x0_memman_desc_t ext_mm={ext_ub,ext_l,0,AD0X0_I2C_EXT_COUNT}; static volatile uint8_t ad0x0_ext_lock=0; void ad0x0_i2c_ext_init(void (*perr)(void)){ ext_mm.perr=perr; ad0x0_memman_init(&ext_mm); } ad0x0_i2c_ext_t *ad0x0_i2c_ext_get_pdesc(uint8_t _handle){ return &ext_funcs[_handle]; } void ad0x0_i2c_ext_pre_process(ad0x0_i2c_desc_s *pdi2c,uint8_t _handle){ if(_handle & 0x80){ pdi2c->perrfunc();//УБРАТЬ ПОТОМ } // ext_funcs[_handle].calls_count++; ad0x0_i2c_ext_t *pef=ext_funcs+_handle; if(pef->p_pre_SetTXRXBuf){ pef->p_pre_SetTXRXBuf(pdi2c,pef); } if(pef->_p_pre_cb_func){ pef->_p_pre_cb_func(pef->sf_id, pdi2c, (void*)pef); } //ad0x0_memman_free(&ext_mm,_handle); это в ad0x0_i2c_ext_post_process } void ad0x0_i2c_ext_post_process(ad0x0_i2c_desc_s *pdi2c,uint8_t _handle){ /*хрень в том, что вызов колбэков порождает рекурсивное выделение новых блоков по этому мы идем на жертвы и делаем как ниже, чтобы быстрее освободить ячейку, с другой стороны мы используем стэк... ПЕРЕДЕЛАТЬ*/ if(_handle & 0x80){ pdi2c->perrfunc();//УБРАТЬ ПОТОМ } // ext_funcs[_handle].calls_count++; ad0x0_i2c_ext_t *pef=ext_funcs+_handle; if(pef->_p_post_cb_func){ pef->_p_post_cb_func(pef->sf_id, pdi2c, (void*)pef); } //ото тут как бы повнимательнее: если ссылок ноль, то выкидываем, иначе уменьшаем рекфкаунт ad0x0_i2c_ext_release(_handle); } void ad0x0_i2c_ext_release(uint8_t _handle){ ad0x0_i2c_ext_t *pef=ext_funcs+_handle; if(!pef->reference_count){ ad0x0_memman_free(&ext_mm,_handle); }else pef->reference_count--; } uint8_t ad0x0_i2c_ext_get_count(void){ return ext_mm.cur_ei; } uint8_t ad0x0_i2c_ext_get(uint8_t *_p_out_handle,ad0x0_i2c_ext_t **_p_out_desc){ int was_masked=__disable_irq(); if(ad0x0_ext_lock){ if(!was_masked)__enable_irq(); return 0; } ad0x0_ext_lock=1; if(!ad0x0_memman_get(&ext_mm,_p_out_handle)){ ad0x0_ext_lock=0;//!!!!!!!!!!!!!!!добавил 29.01.2021... ну я и баран....... if(!was_masked)__enable_irq(); return 0; } *_p_out_desc=ext_funcs + *_p_out_handle; memset(*_p_out_desc,0,sizeof(ad0x0_i2c_ext_t)); //(*_p_out_desc)->reference_count=1; /*если две строки переставить местами, то после включения прерываний, пока не выполнился лок=0, вызовется прерывание и все нахер повиснет в обработчике DMA ad0x0 16.10.2020 ПЕРЕПРОВЕРИТЬ ВСЕ УЧАСтки подобные*/ ad0x0_ext_lock=0; if(!was_masked)__enable_irq(); return 1; } void EXT_SetTXRXBuf_i2c(ad0x0_i2c_desc_s *pdi2c,void *_p_ad0x0_i2c_ext_t){ ad0x0_i2c_ext_t *p=_p_ad0x0_i2c_ext_t; pdi2c->tx_pbuf=p->pbuf_tx; pdi2c->rx_pbuf=p->pbuf_rx; pdi2c->addr_w=p->addr_w; pdi2c->addr_r=p->addr_r; pdi2c->pbuf_counter=p->pbuf_count; } void ad0x0_i2c_ext_clear(ad0x0_i2c_ext_t *pf){ memset(pf,0,sizeof(ad0x0_i2c_ext_t)); //pf->pSetTXRXBuf=SetTXRXBuf; }