Vit (12.08.2013 23:12 - 23:19, просмотров: 183) ответил 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;
}
}