Разработчики, требуется Ваша помощь. Я буквально пару дней назад приступил к изучению ESP и «влип» в одну проблему. При попытке произвести поиск устройств по 1-Wire (драйвер стянул из NodeMCU) модуль перезагружается. Понимаю, что это связано с длительной работой процедуры (18мс), хотя изначально грешил на GPIO (почему то у меня попытки назначить подтяжки тоже приводили к сбросу...). В результате заменил вызов onewire_search на пустой цикл задержки в 18мс, чтоб точно отделить мух от котлет. Результат — сброс модуля. Вот код «фонового цикла»:
static void ICACHE_FLASH_ATTR
MainLoop(os_event_t *events)
{
static char i = 0;
if (t10msFlag){
//Процедуры с периодом вызова в 10мс. Флаги могут пропадать из за долгого
//вызова. Критичные к джитеру вещи тут нельзя вызывать.
i++;
if (i & 0x80){
//DIRECT_WRITE_HIGH(13);
DIRECT_WRITE_HIGH(5);
}else{
//DIRECT_WRITE_LOW(13);
DIRECT_WRITE_LOW(5);
}
DSSensorsProc();
//Сбрасываем флаг
t10msFlag = 0;
}
//os_delay_us(1000);
system_os_post(MainLoopTaskPrio, 0, 0 );
}
Соответственно, таймер мне каждые 10мс взводит t10msFlag, функция DSSensorsProc — проходная, где самая большая задержка — как раз при вызове поиска. При этом сброс происходит в момент выхода из MainLoop. И сброс происходит не стразу, а модуль «тупит» пару секунд до перезагрузки. К сожалению, ничего толкового не нашел по решению этой пробелы. Посмотрел в NodeMCU, там поиск без всяких бубнов вызывается, в Ардуино он тоже без проблем работает.
Что можете посоветовать? Вот вывод на терминал:
J�
@�S:���N���Ds)�A#��Q*����������ɵ�starting...
Search finish!
Pause finish!
"��
�1s��j�:#����3}�9�BQ*�������љ����starting...
Search finish!
Pause finish!
"��
F�����`��R�
���BQ*�������������starting...
Search finish!
Pause finish!
��r��:6�;�;!G�A�S�H�BQ*����������ɵ�starting...
Search finish!
Pause finish!
static void ICACHE_FLASH_ATTR
MainLoop(os_event_t *events)
{
static char i = 0;
if (t10msFlag){
//Процедуры с периодом вызова в 10мс. Флаги могут пропадать из за долгого
//вызова. Критичные к джитеру вещи тут нельзя вызывать.
i++;
if (i & 0x80){
//DIRECT_WRITE_HIGH(13);
DIRECT_WRITE_HIGH(5);
}else{
//DIRECT_WRITE_LOW(13);
DIRECT_WRITE_LOW(5);
}
DSSensorsProc();
//Сбрасываем флаг
t10msFlag = 0;
}
//os_delay_us(1000);
system_os_post(MainLoopTaskPrio, 0, 0 );
}
Соответственно, таймер мне каждые 10мс взводит t10msFlag, функция DSSensorsProc — проходная, где самая большая задержка — как раз при вызове поиска. При этом сброс происходит в момент выхода из MainLoop. И сброс происходит не стразу, а модуль «тупит» пару секунд до перезагрузки. К сожалению, ничего толкового не нашел по решению этой пробелы. Посмотрел в NodeMCU, там поиск без всяких бубнов вызывается, в Ардуино он тоже без проблем работает.
Что можете посоветовать? Вот вывод на терминал:
J�
@�S:���N���Ds)�A#��Q*����������ɵ�starting...
Search finish!
Pause finish!
"��
�1s��j�:#����3}�9�BQ*�������љ����starting...
Search finish!
Pause finish!
"��
F�����`��R�
���BQ*�������������starting...
Search finish!
Pause finish!
��r��:6�;�;!G�A�S�H�BQ*����������ɵ�starting...
Search finish!
Pause finish!