Как можно инициализировать массив констант в цикле?
17.04.2017, 17:35
|
|
|
Вид на жительство
Регистрация: 10.06.2007
Сообщений: 429
Сказал спасибо: 34
Сказали Спасибо 51 раз(а) в 47 сообщении(ях)
|
Re: Как можно инициализировать массив констант в цикле?
Про генерацию таблиц синуса и других функций - можно это делать и при помощи MatLab (я пробовал GNU Octave) как тут описано http://microsin.ru/content/view/809/44/
|
|
|
|
17.04.2017, 20:04
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,481
Сказал спасибо: 396
Сказали Спасибо 2,222 раз(а) в 1,317 сообщении(ях)
|
Re: Как можно инициализировать массив констант в цикле?
Сообщение от AndrFV
|
|
А не проще хранить подобные константы в энергонезависимой памяти контроллера?
|
Конечно проще, и даже полезнее. Особенно при использовании DDS (прямой синтез частот). Как известно, диапазон генерируемых частот напрямую зависит от размера таблицы синусов. Значит, эту таблицу нужно, во-первых, хранить во флеше, во-вторых, вычислять уж точно не силами МК.
Например, просчет таблицы синусов размером в 32K элементов (float) на Cortex M7 идет около 1 секунды при частоте 120 МГц, и таблица занимает 128 кБайт ОЗУ.
|
|
|
|
17.04.2017, 21:23
|
|
|
Вид на жительство
Регистрация: 10.06.2007
Сообщений: 429
Сказал спасибо: 34
Сказали Спасибо 51 раз(а) в 47 сообщении(ях)
|
Re: Как можно инициализировать массив констант в цикле?
NewWriter, извиняюсь за оффтоп, но очень уж интересно - для чего может понадобиться таблица синуса (полная? не четверть периода?) размером в 32К да ещё и float? Или это просто "сферический" пример?
|
|
|
|
17.04.2017, 21:51
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,481
Сказал спасибо: 396
Сказали Спасибо 2,222 раз(а) в 1,317 сообщении(ях)
|
Re: Как можно инициализировать массив констант в цикле?
Отчасти, "сферический пример", а отчасти - DDS. А там просто необходим большой размер таблицы.
Нажмите, чтобы открыть спойлер
|
|
|
|
18.04.2017, 00:39
|
|
|
Вид на жительство
Регистрация: 10.06.2007
Сообщений: 429
Сказал спасибо: 34
Сказали Спасибо 51 раз(а) в 47 сообщении(ях)
|
Re: Как можно инициализировать массив констант в цикле?
NewWriter, меня не столько удивил размер таблицы, сколько float. Разве для DDS необходим float? Или float - это "сферическая" часть (не применяющаяся на практике) этого примера?
|
|
|
|
18.04.2017, 14:08
|
|
|
Прохожий
Регистрация: 01.07.2006
Сообщений: 9
Сказал спасибо: 0
Сказали Спасибо 6 раз(а) в 2 сообщении(ях)
|
Re: Как можно инициализировать массив констант в цикле?
Как можно инициализировать массив констант в цикле?
Константа – это данные, которые не изменяются на протяжении выполнения программы.
В цикле вы хотите заполнить пустой массив данными констант, это изменение данных !
Это компилятор не примет, ибо константа – это данные, которые не изменяются на протяжении выполнения программы.
Учите теорию языка.
|
|
|
|
21.04.2017, 05:55
|
|
|
Частый гость
Регистрация: 06.01.2011
Сообщений: 32
Сказал спасибо: 33
Сказали Спасибо 5 раз(а) в 4 сообщении(ях)
|
Re: Как можно инициализировать массив констант в цикле?
Сообщение от NewWriter
|
Конечно проще, и даже полезнее. Особенно при использовании DDS (прямой синтез частот). Как известно, диапазон генерируемых частот напрямую зависит от размера таблицы синусов. Значит, эту таблицу нужно, во-первых, хранить во флеше, во-вторых, вычислять уж точно не силами МК.
Например, просчет таблицы синусов размером в 32K элементов (float) на Cortex M7 идет около 1 секунды при частоте 120 МГц, и таблица занимает 128 кБайт ОЗУ.
|
Не напрямую зависит. Скорее зависит от изобретательности, всегда ведь можно исхитриться.
Например, можно иметь достаточно грубую таблицу и дополнительно два значения синуса и косинуса для относительно малого угла. Для непрерывной по времени генерации синусоиды с малым шагом угла этого достаточно.
|
|
|
|
21.04.2017, 05:59
|
|
|
Частый гость
Регистрация: 06.01.2011
Сообщений: 32
Сказал спасибо: 33
Сказали Спасибо 5 раз(а) в 4 сообщении(ях)
|
Re: Как можно инициализировать массив констант в цикле?
Сообщение от NewWriter
|
Отчасти, "сферический пример", а отчасти - DDS. А там просто необходим большой размер таблицы.
Нажмите, чтобы открыть спойлер
|
Почему в видео параллельно с периодом синусоиды плывёт амплитуда? Это баг или фича?
|
|
|
|
21.04.2017, 09:45
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,481
Сказал спасибо: 396
Сказали Спасибо 2,222 раз(а) в 1,317 сообщении(ях)
|
Re: Как можно инициализировать массив констант в цикле?
Это фича, так было задумано. Вообще это был тест производительности вычислений на малых частотах МК. Частота там была, кажись, 16 или 24 МГц, точно не помню уже.
Оттуда, соппсна, и значения во float - значение синуса просто умножалось на прямое численное значение амплитуды, которая и менялась параллельно с изменением частоты.
Последний раз редактировалось NewWriter; 21.04.2017 в 09:58.
|
|
|
|
12.05.2017, 00:23
|
|
|
Вид на жительство
Регистрация: 10.06.2007
Сообщений: 429
Сказал спасибо: 34
Сказали Спасибо 51 раз(а) в 47 сообщении(ях)
|
Re: Как можно инициализировать массив констант в цикле?
Сообщение от nikolx
|
Константа – это данные, которые не изменяются на протяжении выполнения программы.
В цикле вы хотите заполнить пустой массив данными констант, это изменение данных !
Это компилятор не примет, ибо константа – это данные, которые не изменяются на протяжении выполнения программы.
Учите теорию языка.
|
Или Вы написали не то, что думали или ошиблись. В языке C (если его теория имелась ввиду) квалификатор const для переменной вовсе не означает, что это данные, которые не изменяются на протяжении выполнения программы. Он означает, что компилятор будет следить, чтобы в неё не происходила запись(со стороны компилируемой программы). Но сама переменная в принципе может изменяться, поэтому имеет смысл запись:
|
PHP код:
|
const volatile int *p;
|
|
Цитата:
|
|
например, для декларирования регистра таймера, который может спонтанно менять свое значение, но в который нельзя сохранять данные (на этот пример в частности указывают и в стандарте языка C).
|
Взято отсюда http://microsin.net/programming/avr/...-volatile.html
Ну а ТС скорее всего имел ввиду создание массива констант во время компиляции а не во время исполнения. Хотя в некоторых микроконтроллерах можно и во время исполнения флешь перезаписывать.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 00:23.
|
|