ad0x0_memman.c 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. #include "main.h"
  2. #include "ad0x0_memman.h"
  3. #include <string.h>
  4. //uint8_t ad0x0_mm_last_get_handle=0,ad0x0_mm_last_free_handle=0;
  5. volatile uint32_t ad0x0_memman_lock_wait=0;
  6. void ad0x0_memman_init(ad0x0_memman_desc_t *_mdesc){
  7. _mdesc->cur_ei=0;
  8. _mdesc->lock=0;
  9. for(uint16_t i=0;i<_mdesc->total_count;i++){
  10. _mdesc->puba[i]=_mdesc->pla[i]=i;
  11. }
  12. }
  13. uint8_t ad0x0_memman_get(ad0x0_memman_desc_t *_mdesc,uint8_t *_out_index){
  14. //либо локи либо прерывание. и то и то пересмотреть
  15. //while(_mdesc->lock){};
  16. if(_mdesc->lock){
  17. ad0x0_memman_lock_wait++;
  18. return 0;
  19. }
  20. int was_masked=__disable_irq();
  21. _mdesc->lock=1;
  22. /*cur_ei - это индекс текущего свободного блока*/
  23. if(_mdesc->cur_ei>=(_mdesc->total_count)){
  24. if(!was_masked)__enable_irq();
  25. _mdesc->lock=0;
  26. return 0;
  27. }
  28. *_out_index=_mdesc->puba[_mdesc->cur_ei];//сука гнида чмо...... 3 часа протрахался, прежде чем нашел
  29. //ad0x0_mm_last_get_handle=*_out_index;
  30. _mdesc->cur_ei++;
  31. _mdesc->lock=0;
  32. if(!was_masked)__enable_irq();
  33. return 1;
  34. }
  35. uint8_t ad0x0_memman_free(ad0x0_memman_desc_t *_mdesc,uint8_t _index){
  36. //либо локи либо прерывание. и то и то пересмотреть
  37. /*cur_ei - это индекс текущего свободного блока*/
  38. if(!_mdesc->cur_ei){
  39. _mdesc->perr();
  40. return 0;//это надо проверять. При использовании прерываний всякое может случаться
  41. }
  42. int was_masked=__disable_irq();
  43. /*это планировалась процедура на пару строчек... - хер там...
  44. миллион проверок и главный вопрос - что если вызвать фри для
  45. заведомо свободной ячейки??? тогда мы */
  46. //if(_mdesc->puba[_index]>=_mdesc->cur_ei){ - две сука просранных недели я эту ошибку искал... невнимательность(((
  47. //if(_mdesc->pla[_index]>=_mdesc->cur_ei){ _mdesc->perr(); }
  48. //ad0x0_mm_last_free_handle=_index;
  49. _mdesc->cur_ei--;//на последний занятый
  50. //если освобожаемый блок был последним занятым, то перестановок в массивах не требуется
  51. if(_mdesc->pla[_index] == _mdesc->cur_ei){
  52. if(!was_masked)__enable_irq();
  53. return 1;
  54. }
  55. /*последний занятый поменять с освобождаемым*/
  56. uint8_t lui = _mdesc->puba[_mdesc->cur_ei];//индекс в pla последнего занятого
  57. _mdesc->puba[_mdesc->cur_ei]=_index;//освобожденный в конец списка
  58. //if(_mdesc->pla[lui]!=_mdesc->cur_ei){ _mdesc->perr(); }
  59. _mdesc->pla[lui]=_mdesc->pla[_index];//
  60. _mdesc->pla[_index]=_mdesc->cur_ei;//
  61. //if(_mdesc->puba[ _mdesc->pla[lui] ]!=_index){ _mdesc->perr(); }
  62. _mdesc->puba[ _mdesc->pla[lui] ]=lui;//
  63. if(!was_masked)__enable_irq();
  64. return 1;
  65. }