123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132 |
- #include "main.h"
- #include "ad0x0_spi.h"
- #include "../admisc/ad0x0_timman.h"
- #include "stm32f1xx_hal_spi.h"
- #include "ad0x0_spi_ext.h"
- #include <string.h>
- static uint8_t ext_ub[AD0X0_SPI_EXT_COUNT],ext_l[AD0X0_SPI_EXT_COUNT];
- static ad0x0_spi_ext_t ext_funcs[AD0X0_SPI_EXT_COUNT];
- //когда в еtypedef структуры чтото изменится - я 100% это прое..."упущу"
- static ad0x0_memman_desc_t ext_mm={ext_ub,ext_l,0,AD0X0_SPI_EXT_COUNT};
- static volatile uint8_t ad0x0_ext_lock=0;
- void ext_err(void){
- __ASM("nop");
- }
- void ad0x0_spi_ext_init(void (*perr)(void)){
- //uint8_t *puba,*pla,cur_ei,total_count;
- /*_p_spi_desc->ext_mm.puba=ext_ub;
- _p_spi_desc->ext_mm.pla=ext_l;
- _p_spi_desc->ext_mm.total_count=AD0X0_SPI_EXT_COUNT; */
- ext_mm.perr=perr;
- ad0x0_memman_init(&ext_mm);
- /*ad0x0_spi1_desc.ext_mm.puba=ad0x0_spi1_desc.ext_ub;
- ad0x0_spi1_desc.ext_mm.pla=ad0x0_spi1_desc.ext_l;
- ad0x0_spi1_desc.ext_mm.total_count=AD0X0_SPI_EXT_COUNT;
- ad0x0_memman_init(&ad0x0_spi1_desc.ext_mm);*/
- }
- ad0x0_spi_ext_t *ad0x0_spi_ext_get_pdesc(uint8_t _handle){
- return &ext_funcs[_handle];
- }
- /*void ad0x0_spi_ext_process_old(ad0x0_spi_desc_s *pdspi,uint8_t _handle){
- if(_handle & 0x80){
- pdspi->perrfunc();//УБРАТЬ ПОТОМ
- }
- // ext_funcs[_handle].calls_count++;
- ad0x0_spi_ext_t ef=ext_funcs[_handle];
- //memset(ext_funcs+_handle,0,sizeof(ad0x0_spi_ext_t));
- // ext_funcs[_handle].calls_count=0;
- //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
- ad0x0_memman_free(&ext_mm,_handle);
- ///^^^^^^^^^^^^^^^^
- //if(ef.spi!=pdspi->spix || ef.calls_count>1){ pdspi->perrfunc();//УБРАТЬ ПОТОМ }
- if(pdspi->spix==((SPI_TypeDef *)SPI2_BASE) && ef.pbuf_rx==0 && ef.pSetTXRXBuf!=0)
- {
- pdspi->perrfunc();
- }
- if(ef.pSetTXRXBuf){
- ef.pSetTXRXBuf(pdspi,&ef);
- }
- if(ef._p_cb_func){
- ef._p_cb_func(ef.sf_id, pdspi);
- }
- }*/
- void ad0x0_spi_ext_pre_process(ad0x0_spi_desc_s *pdspi,uint8_t _handle){
- /*хрень в том, что вызов колбэков порождает рекурсивное выделение новых блоков
- по этому мы идем на жертвы и делаем как ниже, чтобы быстрее освободить
- ячейку, с другой стороны мы используем стэк... ПЕРЕДЕЛАТЬ*/
- if(_handle & 0x80){
- pdspi->perrfunc();//УБРАТЬ ПОТОМ
- }
- // ext_funcs[_handle].calls_count++;
- ad0x0_spi_ext_t *pef=ext_funcs+_handle;
- //if(pdspi->spix==((SPI_TypeDef *)SPI2_BASE) && pef->pbuf_rx==0 && pef->pSetTXRXBuf!=0) { pdspi->perrfunc(); }
- if(pef->p_pre_SetTXRXBuf){
- pef->p_pre_SetTXRXBuf(pdspi,pef);
- }
- if(pef->_p_pre_cb_func){
- pef->_p_pre_cb_func(pef->sf_id, pdspi, (void*)pef);
- }
- //ad0x0_memman_free(&ext_mm,_handle); это в ad0x0_spi_ext_post_process
- }
- void ad0x0_spi_ext_post_process(ad0x0_spi_desc_s *pdspi,uint8_t _handle){
- /*хрень в том, что вызов колбэков порождает рекурсивное выделение новых блоков
- по этому мы идем на жертвы и делаем как ниже, чтобы быстрее освободить
- ячейку, с другой стороны мы используем стэк... ПЕРЕДЕЛАТЬ*/
- if(_handle & 0x80){
- pdspi->perrfunc();//УБРАТЬ ПОТОМ
- }
- // ext_funcs[_handle].calls_count++;
- ad0x0_spi_ext_t *pef=ext_funcs+_handle;
- //if(pdspi->spix==((SPI_TypeDef *)SPI2_BASE) && pef->pbuf_rx==0 && pef->pSetTXRXBuf!=0) { pdspi->perrfunc(); }
- if(pef->_p_post_cb_func){
- pef->_p_post_cb_func(pef->sf_id, pdspi, (void*)pef);
- }
- //ото тут как бы повнимательнее: если ссылок ноль, то выкидываем, иначе уменьшаем рекфкаунт
- if(!pef->reference_count){
- ad0x0_memman_free(&ext_mm,_handle);
- }else pef->reference_count--;
- }
- uint8_t ad0x0_spi_ext_get(uint8_t *_p_out_handle,ad0x0_spi_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_spi_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(ad0x0_spi_desc_s *pdspi,void *_p_ad0x0_spi_ext_t){
- ad0x0_spi_ext_t *p=_p_ad0x0_spi_ext_t;
- pdspi->tx_pbuf=p->pbuf_tx;
- pdspi->rx_pbuf=p->pbuf_rx;
- pdspi->pbuf_counter=p->pbuf_count;
- }
- void ad0x0_spi_ext_clear(ad0x0_spi_ext_t *pf){
- memset(pf,0,sizeof(ad0x0_spi_ext_t));
- //pf->pSetTXRXBuf=SetTXRXBuf;
- }
|