Полученный усредненный результат будет на ~6% меньше фактического т.к. мы делим на 128 вместо 120
На вскидку код получается вот такой:
map.h
Code: Select all
typedef struct {
	uint16_t buffer[120];
	uint16_t *cursor;
}map_t;
map_t map;
#define MAP_START	&map.buffer[0]
#define MAP_END		&map.buffer[119]
for (map.cursor = MAP_START; map.cursor <= MAP_END; map.cursor++) *map.cursor = 0xFFF;	// забиваем в таблицу по дефолту атмосферное давление
map.c
Code: Select all
#include <map.h>
void add_map(uint16_t adc) {
	if (map.cursor == MAP_END)
		map.cursor = MAP_START;
	else	map.cursor++;
	*map.cursor = adc;
}
// Целочислительный алгоритм усреднения без деления:
// в цилке, начиная от текущщей ячейки буфера, выбираем и складываем их вместе, делаем сдвиг >> 16 для деления и отброса дробной части, примерный код:
uint16_t get_avg_map() {
	uint16_t *tmp_cursor;
	uint32_t result;
	// начинаем от текущщей ячейки включительно и до конца таблицы
	for (tmp_cursor = map.cursor; tmp_cursor <= MAP_END; tmp_cursor++) result += *tmp_cursor;
	// продолжаем от начала таблицы и до текущщей ячейки
	for (tmp_cursor = MAP_START; tmp_cursor < map_buffer_cursor; tmp_cursor++) result += *tmp_cursor;
	return ((uint16_t)(result >> 7)); // делим на 128 и приводим тип
}

 но как показывает практика минимальная оптимизация без ухудшения параметров системы никога не бывает избыточной, зато ресурсов железа никогда не бывает много бывает только иногда достаточно
 но как показывает практика минимальная оптимизация без ухудшения параметров системы никога не бывает избыточной, зато ресурсов железа никогда не бывает много бывает только иногда достаточно