123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104 |
- #include "main.h"
- #include "ad0x0_i2c.h"
- #include "../admisc/ad0x0_timman.h"
- #include "../admisc/ad0x0_memman.h"
- #include "ad0x0_i2c_ext.h"
- #include <string.h>
- 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;
- }
|