Пришёл ко мне один модуль и я выкладываю свои изыскания.
Я сделал простую программу которая дёргает ногой GPIO2 по прерыванию от таймера.
Напишу сразу выводы
1. Дерганье ногой.
По таймеру я устанавливаю 1 и сразу же устанавливаю 0.
LOCAL void ICACHE_FLASH_ATTR hello_cb(void *arg)
{
REG_SET_BIT(0x60000304, BIT2);
REG_SET_BIT(0x60000308, BIT2);
// gpio_output_set(BIT2, 0, BIT2, 0);
// gpio_output_set(0, BIT2, BIT2, 0);
}
Самое быстрое что получилось дёрнуть это 200нс. Это при условии что мы пишем в регистры напрямую и частота установлена 160мгц. Если использовать функцию gpio_output_set(BIT2, 0, BIT2, 0) и частоту по умолчанию 80мгц то получается 600нс. Это время между двумя командами.
2. Таймер не получилось запустить быстрее чем 20 мкс. При 1 мкс модуль работает полсекунды и виснет. При 5 мкс он тоже не работает. и при 15. вместо одного импульса получаем пачку импульсов.
Как ни странно удаление ICACHE_FLASH_ATTR никак ни повлияло на работу.
Ещё при перестройке частоты на 160мгц (в два раза), длительность импульса уменьшилось. Что понятно. Но период 25мкс остался. Это тоже понятно. Произошёл пересчёт тактов и стало больше тактов. Но при этом если поставить 15 мкс период всё равно сбоит. Это не понятно. Вроде больше тактов стало и должно хватать по крайней мере в два раза для обработки прерывания. Предположу что этот таймер не единственный кто работает по прерыванию, и не важно какая частота, ядро занимает себе такты, и не может отдать время меньше 20 мкс.
3. Похоже таймер имеет низкий приоритет. И делать на нём что то времязависимое и точное нельзя. Его может оборвать в любой момент ядро. По этому похоже и такая длительная обработка прерывания (минимум 20мкс). Это видно по осциллограмме. Импульсы не стоят ровно а дёргаются.
В общем результат не тот на который рассчитывал. Придётся делать по другому. Может кто то имеет какие то секретные знания о том как можно получить стабильный таймер на 1 мкс? и как можно дёрнуть ногой на 80мгц. Был бы рад узнать.
PS: Ещё предложение админам. Может пора сделать FAQ? Типа вопросы как настроить таймер? как дёрнуть ногой? как установить частоту процессора? и.т.д.
Я сделал простую программу которая дёргает ногой GPIO2 по прерыванию от таймера.
Напишу сразу выводы
1. Дерганье ногой.
По таймеру я устанавливаю 1 и сразу же устанавливаю 0.
LOCAL void ICACHE_FLASH_ATTR hello_cb(void *arg)
{
REG_SET_BIT(0x60000304, BIT2);
REG_SET_BIT(0x60000308, BIT2);
// gpio_output_set(BIT2, 0, BIT2, 0);
// gpio_output_set(0, BIT2, BIT2, 0);
}
Самое быстрое что получилось дёрнуть это 200нс. Это при условии что мы пишем в регистры напрямую и частота установлена 160мгц. Если использовать функцию gpio_output_set(BIT2, 0, BIT2, 0) и частоту по умолчанию 80мгц то получается 600нс. Это время между двумя командами.
2. Таймер не получилось запустить быстрее чем 20 мкс. При 1 мкс модуль работает полсекунды и виснет. При 5 мкс он тоже не работает. и при 15. вместо одного импульса получаем пачку импульсов.
Как ни странно удаление ICACHE_FLASH_ATTR никак ни повлияло на работу.
Ещё при перестройке частоты на 160мгц (в два раза), длительность импульса уменьшилось. Что понятно. Но период 25мкс остался. Это тоже понятно. Произошёл пересчёт тактов и стало больше тактов. Но при этом если поставить 15 мкс период всё равно сбоит. Это не понятно. Вроде больше тактов стало и должно хватать по крайней мере в два раза для обработки прерывания. Предположу что этот таймер не единственный кто работает по прерыванию, и не важно какая частота, ядро занимает себе такты, и не может отдать время меньше 20 мкс.
3. Похоже таймер имеет низкий приоритет. И делать на нём что то времязависимое и точное нельзя. Его может оборвать в любой момент ядро. По этому похоже и такая длительная обработка прерывания (минимум 20мкс). Это видно по осциллограмме. Импульсы не стоят ровно а дёргаются.
В общем результат не тот на который рассчитывал. Придётся делать по другому. Может кто то имеет какие то секретные знания о том как можно получить стабильный таймер на 1 мкс? и как можно дёрнуть ногой на 80мгц. Был бы рад узнать.
PS: Ещё предложение админам. Может пора сделать FAQ? Типа вопросы как настроить таймер? как дёрнуть ногой? как установить частоту процессора? и.т.д.
Последнее редактирование: