ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Пятница
19 апреля
432336 Топик полностью
Vit (12.08.2013 23:12 - 23:19, просмотров: 163) ответил mazur на Переношу асмовские наработки на си. Очередные затруднения. Есть очередь таймеров в ОЗУ. Блоки по 3 байта. Первый байт-статус. Два - счетчик. Подобные конструкции у меня часты. Также есть наработки с памятью программ.
объявление с выделением места struct {u08 st_flags; u16 st_cnt} Sys_Timers_Queue [ST_QUANTITY]; делается не в хедере в хедере лучше сделать #define ST_QUANTITY 3 typedef struct Sys_Timers{u08 st_flags; u16 st_cnt}Sys_Timers; extern Sys_Timers Sys_Timers_Queue[]; в сишнике Sys_Timers Sys_Timers_Queue [ST_QUANTITY]; каммент // Если время не вышло, то переход к обработке следующего таймера. поставил в тупик - дальше не смог читать. если задача обслужить дцать структур декрементируемых счетчиков и после досчета до нуля более не трогать и нахрена-то выставить флаг, то это флаг лишний - само значение ноль уже обозначает окончание обратного отсчета. для 8-и-битника можно использовать макрос, который проверяет на ноль сначала старший, потом младший байт u16 - что-то типа #define COUNTDOWN_DONE(X) ( ((X)>>8) ? (false) : ( ((u08)(X)) ? (false) : (true) ) такого типа конструкцию можно использовать в фоне без запрещения прерываний структуры можно снабдить полем ссылки и связывать в список, а не колбаситься с конфигурированием длины массива структур. typedef struct tmr{ struct tmr * next; u16 cnt; }tmr; tmr * Sys_Timer_List = NULL; tmr * Sys_Timer_Append(tmr * timer){ if(timer == NULL) return NULL; timer->next = NULL; // по желанию - защита от дидлока if(Sys_Timer_List == NULL){ Sys_Timer_List = timer; }else{ tmr * node; node = Sys_Timer_List; while(node->next){ node = node->next; } //тут node->next == NULL node->next = timer; } return Sys_Timer_List; } в обработчике { tmr * node; node = Sys_Timer_List; while(node != NULL){ if(node->cnt){ cnt--; // if(node->cnt == 0){ //здесь можно было бы удалить таймер из списка } } node = node->next; } }