12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970 |
- #include "main.h"
- #include "ad0x0_memman.h"
- #include <string.h>
- //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;
- }
|