#include "main.h" #include "ad0x0_memman.h" #include //uint8_t ad0x0_mm_last_get_handle=0,ad0x0_mm_last_free_handle=0; volatile uint32_t ad0x0_memman_lock_wait=0; void ad0x0_memman_init(ad0x0_memman_desc_t *_mdesc){ _mdesc->cur_ei=0; _mdesc->lock=0; for(uint16_t i=0;i<_mdesc->total_count;i++){ _mdesc->puba[i]=_mdesc->pla[i]=i; } } uint8_t ad0x0_memman_get(ad0x0_memman_desc_t *_mdesc,uint8_t *_out_index){ //либо локи либо прерывание. и то и то пересмотреть //while(_mdesc->lock){}; if(_mdesc->lock){ ad0x0_memman_lock_wait++; return 0; } int was_masked=__disable_irq(); _mdesc->lock=1; /*cur_ei - это индекс текущего свободного блока*/ if(_mdesc->cur_ei>=(_mdesc->total_count)){ if(!was_masked)__enable_irq(); _mdesc->lock=0; return 0; } *_out_index=_mdesc->puba[_mdesc->cur_ei];//сука гнида чмо...... 3 часа протрахался, прежде чем нашел //ad0x0_mm_last_get_handle=*_out_index; _mdesc->cur_ei++; _mdesc->lock=0; if(!was_masked)__enable_irq(); return 1; } uint8_t ad0x0_memman_free(ad0x0_memman_desc_t *_mdesc,uint8_t _index){ //либо локи либо прерывание. и то и то пересмотреть /*cur_ei - это индекс текущего свободного блока*/ if(!_mdesc->cur_ei){ _mdesc->perr(); return 0;//это надо проверять. При использовании прерываний всякое может случаться } int was_masked=__disable_irq(); /*это планировалась процедура на пару строчек... - хер там... миллион проверок и главный вопрос - что если вызвать фри для заведомо свободной ячейки??? тогда мы */ //if(_mdesc->puba[_index]>=_mdesc->cur_ei){ - две сука просранных недели я эту ошибку искал... невнимательность((( //if(_mdesc->pla[_index]>=_mdesc->cur_ei){ _mdesc->perr(); } //ad0x0_mm_last_free_handle=_index; _mdesc->cur_ei--;//на последний занятый //если освобожаемый блок был последним занятым, то перестановок в массивах не требуется if(_mdesc->pla[_index] == _mdesc->cur_ei){ if(!was_masked)__enable_irq(); return 1; } /*последний занятый поменять с освобождаемым*/ uint8_t lui = _mdesc->puba[_mdesc->cur_ei];//индекс в pla последнего занятого _mdesc->puba[_mdesc->cur_ei]=_index;//освобожденный в конец списка //if(_mdesc->pla[lui]!=_mdesc->cur_ei){ _mdesc->perr(); } _mdesc->pla[lui]=_mdesc->pla[_index];// _mdesc->pla[_index]=_mdesc->cur_ei;// //if(_mdesc->puba[ _mdesc->pla[lui] ]!=_index){ _mdesc->perr(); } _mdesc->puba[ _mdesc->pla[lui] ]=lui;// if(!was_masked)__enable_irq(); return 1; }