30.04.2018, 15:25
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.03.2010
Сообщений: 2,897
Сказал спасибо: 498
Сказали Спасибо 3,061 раз(а) в 1,425 сообщении(ях)
|
Re: Как реализовать на С
Ну это мы можем
|
|
|
|
30.04.2018, 23:11
|
|
Прописка
Регистрация: 24.11.2016
Адрес: Moscow
Сообщений: 287
Сказал спасибо: 57
Сказали Спасибо 54 раз(а) в 39 сообщении(ях)
|
Re: Как реализовать на С
Сообщение от AR_Favorit
|
Раздел называется "вопросы новичков". Что ты тут ожидал увидеть? ))
|
Ну что-то типа
Код:
|
#include <stdint.h›
typedef struct adc_handlers_st {
uint16_t adc_top_value;
uint8_t (*adc_handler)(void);
} adc_handlers_t;
static uint8_t adc_handler_550(void)
{
return 1;
}
static uint8_t adc_handler_650(void)
{
return 2;
}
static uint8_t adc_handler_750(void)
{
return 3;
}
static uint8_t adc_handler_max(void)
{
return 10;
}
adc_handlers_t adc_handlers[] =
{
{750, adc_handler_max},
{650, adc_handler_750},
{550, adc_handler_650},
{0, adc_handler_550},
};
uint8_t sample(uint16_t adc_value)
{
uint8_t rc=0;
for (uint8_t i=0; i++; i<sizeof(adc_handlers)/sizeof(adc_handlers[0]))
{
if ( adc_handlers[i].adc_top_value<adc_value )
{
rc=(*adc_handlers[i].adc_handler) ();
break;
}
}
return rc;
} |
Последний раз редактировалось ptr; 01.05.2018 в 01:37.
|
|
|
|
30.04.2018, 23:27
|
|
Почётный гражданин KAZUS.RU
Регистрация: 30.09.2006
Сообщений: 1,560
Сказал спасибо: 158
Сказали Спасибо 661 раз(а) в 431 сообщении(ях)
|
Re: Как реализовать на С
Сообщение от ptr
|
Ну что-то типа
|
не лень было это все набивать?
|
|
|
|
01.05.2018, 00:41
|
|
Гражданин KAZUS.RU
Регистрация: 16.06.2005
Сообщений: 945
Сказал спасибо: 25
Сказали Спасибо 175 раз(а) в 124 сообщении(ях)
|
Re: Как реализовать на С
Сообщение от Исбанни
|
замес по теме: "Что лучше - switch, if или if-else?
|
Лучше всего таблица - 1024 (ацп 10 бит) адресов функций обработки. Получили результат ацп, прибавили адрес начала таблицы, извлекли адрес, перешли по нему. Минимальное число тактов, причём ВСЕГДА одинаковое, вне зависимости от числа сравнений. Варианты if, switch будут давать разное время, в зависимости от числа сравнений. Т.е. плюсы очевидны, и они о-го-го. Минусы не менее очевидны, гы-гы-гы. Впрочем, зачем останавливаться? Ведь алгоритм обработки известен, все возможные значения так же известны... Формируется ещё несколько таблиц, по 100 значений, делается очередная итерация - базовый адрес плюс значение... И так далее... В итоге в теоретическом пределе "компилируется" "программа" из кучи связанных таблиц... без операторов, а значит пригодных к исполнению на любой архитектуре как есть, без перекомпиляций и адаптаций. Скорость выполнения программы возрастёт в десятки раз. А насколько упростится ОС - её задача сведётся только к извлечению чисел из таблиц...Хотя наверно не все алгоритмы можно будет свести к набору таблиц... Но это уже вопрос надо исследовать. Сам я этим пока не занимался, бо лень. Хотя если кто-то напишет такой компилятор, может быть и нобелевку получит.
|
|
|
|
01.05.2018, 01:11
|
|
Почётный гражданин KAZUS.RU
Регистрация: 08.10.2007
Сообщений: 2,760
Сказал спасибо: 1,105
Сказали Спасибо 1,037 раз(а) в 569 сообщении(ях)
|
Re: Как реализовать на С
Сообщение от Someone
|
Лучше всего таблица - 1024 (ацп 10 бит) .... Варианты if, switch будут давать разное время, в зависимости от числа сравнений.
|
Что за пурга... Сколко памяти сожрёт та таблица?
Число тактов - да, если делать по-тупому, можно дойти до виндового окна "Идёт подготовка к удалению ярлыка" - видел такое.
Сравнение должно быть типа двоичного дерева: Первое сравнение больше или меньше 512 следующее - с 256 или 768 и т.д. Ради упражнения посчитайте количество шагов с точностью до 1.
|
|
|
|
01.05.2018, 01:16
|
|
Прописка
Регистрация: 24.11.2016
Адрес: Moscow
Сообщений: 287
Сказал спасибо: 57
Сказали Спасибо 54 раз(а) в 39 сообщении(ях)
|
Re: Как реализовать на С
Сообщение от Someone
|
Лучше всего таблица - 1024 (ацп 10 бит) адресов функций обработки.
|
А если АЦП 32 бита, то понадобится 64-битный процессор и 32 гигабайта под эту таблицу?
Боюсь, это тупиковый путь...
|
|
|
|
01.05.2018, 01:21
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.03.2010
Сообщений: 2,897
Сказал спасибо: 498
Сказали Спасибо 3,061 раз(а) в 1,425 сообщении(ях)
|
Re: Как реализовать на С
Сообщение от ptr
|
Код:
|
for (uint8_t i=0; i++; i ‹ sizeof (adc_handlers) ) |
|
Серьезно?
Последний раз редактировалось AR_Favorit; 01.05.2018 в 01:24.
|
|
|
|
01.05.2018, 01:27
|
|
Прописка
Регистрация: 24.11.2016
Адрес: Moscow
Сообщений: 287
Сказал спасибо: 57
Сказали Спасибо 54 раз(а) в 39 сообщении(ях)
|
Re: Как реализовать на С
Сообщение от makakus
|
Сравнение должно быть типа двоичного дерева
|
Классический вариант все же B-Tree, а не двоичное дерево. Конечно, при коэффициенте B-Tree равным 2, это и получится двоичное дерево, вот только этот коэффициент, обычно, выбирают на один-три порядка большим двух: от нескольких десятков до нескольких тысяч.
А вот уже внутри узла или листа B-Tree двоичный поиск оправдан.
|
|
|
|
01.05.2018, 01:37
|
|
Прописка
Регистрация: 24.11.2016
Адрес: Moscow
Сообщений: 287
Сказал спасибо: 57
Сказали Спасибо 54 раз(а) в 39 сообщении(ях)
|
Re: Как реализовать на С
Сообщение от AR_Favorit
|
Серьезно?
|
Нет, поторопился в процессе борьбы с глюками форума из-за некоторых символов. Должно быть:
Код:
|
for (uint8_t i=0; i++; i<sizeof (adc_handlers)/sizeof (adc_handlers[0]) ) |
P.S. По месту тоже исправил.
|
|
|
|
01.05.2018, 08:51
|
|
Модератор
Регистрация: 04.08.2010
Адрес: Москва СЗАО
Сообщений: 11,257
Сказал спасибо: 11,170
Сказали Спасибо 3,859 раз(а) в 2,929 сообщении(ях)
|
Re: Как реализовать на С
При числе обработчиков ‹=256 и разрядности ADC›8 вполне элегантно будет выглядеть таблица индексов обработчиков и к ней таблица адресов обработчиков. Считать индекс по смещению, сдвинуть его влево на битовую длину адреса и получить адрес перехода. При достаточной памяти небольшая плата за скорость. Обычно такого ветвления вполне хватает .
Количество памяти можно оптимизировать с учётом разрядности и возможно нормирования значения для двухполярного со знаком.
Единственная нудная задача - избежать ошибок при заполнении того индексного массива. Подход хорош при большом числе и сложной логике диапазонов.
Тут весьма полезна отдельная программа для генерации массива индексов про диапазонам.
Нехватку своей памяти можно решить с помощью внешней и использовании значения ADC (возможно после сдвига) как адрес для выборки…
И код получится достаточно элегантным .
__________________
rtfm forever должно быть основой для каждого. Альтернатива грустна, поскольку метод слепого щенка успешно работает при весьма малом числе вариантов…
Последний раз редактировалось mike-y-k; 03.05.2018 в 05:18.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 16:05.
|
|