ARDUINO Arduino Nano: old bootloader и новый bootloader

bort707

★★★★★★✩
21 Сен 2020
2,859
850
В таком случае переменные при выделении им памяти тоже могут получить любое значение, если инициализации не было?
нет, это не влияет. Глобальные переменные в Си инициализируются автоматически, а локальные и после хард-ресета могут получить любые значения, если без инициализации.
Насчет "содержимого памяти" я пожалуй уберу, это не вполне точное замечание.
 

Sergo_ST

★★★★★★✩
15 Мар 2020
798
731
@bort707, Всё верно. Питание с оперативной памяти никто не сдергивал, соответственно все значения останутся на своих местах до момента изменения их программой или отключения питания.

На счёт собаки, я сначала думал что проблема наступает при настройке (те во время изменения регистра нас ресетит), но сейчас дошло что циклический сброс наступает с момента правильного сброса по тайм-ауту при входе в секцию загрузчика. По всей видимости в загрузчике он используется в режиме прерываний или просто отслеживается флаг прерывания, но, видимо при инициализации собака не полностью перенастраивается и бит WDE остаётся на месте, а тк сбрасывать собаку некому вот она и ресетит мк циклически...
 
Изменено:

boris_latysh

✩✩✩✩✩✩✩
3 Фев 2021
38
2
Глобальные переменные в Си инициализируются автоматически, а локальные и после хард-ресета могут получить любые значения
Глобальные переменные в Си инициализируются автоматически - и работают "Глобально".
Локальные переменные в Си инициализируются автоматически - и работают "Локально".
После "ресета" все будет назначено и определено по новой. Там НЕТ никаких "Старых" значений.
 

bort707

★★★★★★✩
21 Сен 2020
2,859
850
cейчас дошло что циклический сброс наступает с момента правильного сброса по тайм-ауту при входе в секцию загрузчика. По всей видимости в загрузчике он используется в режиме прерываний или просто отслеживается флаг прерывания, но, видимо при инициализации собака не полностью перенастраивается и бит WDE остаётся на месте,
Нет, все проще. Если контроллер ресетится бутлоадером, то после рестарта таймер ватчдога автоматически перестраивается на самый короткий период - 15мс. Так сказано в описании к аврлибс:
the watchdog timer remains active even after a system reset (except a power-on condition), using the fastest prescaler value (approximately 15 ms). It is therefore required to turn off the watchdog early during program startup,
Зачем так сделано - не очень ясно, но последствия очевидны. Если в первых же строчках кода после ватчдог-ресета не отключить собаку - будет циклический ребут с интервалом в 15мс. Оптибут сбрасывает ватчдог после рестарта, "старый бутлоадер" - нет, поэтому-то со старым бутом ресетом ч. ватчдог пользоваться невозможно.
В случае с кодом @Старик Похабыч контроллер вообще не ресетится, поэтому этих проблем нет
 
Изменено:

bort707

★★★★★★✩
21 Сен 2020
2,859
850
во всем этом для меня осталась только одна загадка.
Если в коде @Старик Похабыч добавить в вектор прерывания бесконечный цикл:
C++:
ISR(WDT_vect) {
  WDTb++;
  if (WDTb > 2)
  {
    asm("wdr"); // Сбрасываем WDT
    delay(1000);
    while(1) {}; 
    resetFunc();
  }
}
то программа все равно ресетится, причем все так же софт-ресетом.
Компилятор. что ли, while(1) выкидывает? С чего бы?
 
  • Лойс +1
Реакции: WandererNZR

bort707

★★★★★★✩
21 Сен 2020
2,859
850
@Старик Похабыч, так оно должно зависнуть (чего я собственно добивался :) или уйте в хард-ресет. А оно исполняет переход на нулевой адрес, как будто цикла while нет
 

bort707

★★★★★★✩
21 Сен 2020
2,859
850
@Старик Похабыч, сделал, без разницы. пробовал и другие операторы, более содержательные. чем delay() - все равно уходит в софтресет без малейшей задержки
 
Изменено:

bort707

★★★★★★✩
21 Сен 2020
2,859
850
В общем, разобрался. Нет никакой загадки в #32. просто я в тестовом коде сделал ошибку. При добавлении бесконечного цикла код благополучно виснет, как и должен.
@Старик Похабыч, предлагаю все сообщения начиная с #32 потереть, чтобы путать тех, кто это будет читать потом
 

RG22EM

✩✩✩✩✩✩✩
22 Окт 2020
33
4
Избыточное цитирование
Вообще ядра они такие. Я недавно снес у себя miniCore, как утратившую доверие.

Вот такой код на ней не работал корректно. Красные светодиоды на 6 и 7 пинах горели в пол яркости.
При этом если убрать pwr_inint(); то код работал как надо.
На GyverCore (поклон ;) ) все заработало как надо сразу. И еще на каком то ядре, Эдуард Анисимов может назвать на каком. Надобность в "другом" ядре возникла из за питания 328-ой от 3-3.3в и кварце на 8МГц.
C++:
#define BTN_KEY 2              
#define PWR_ENABLE A4          
#define CHRG_TEST A6
#define PWR_TEST A7

#define LED_GEEN_HI A3
#define LED_GEEN_LO 3
#define LED_ORANGE_HI 4
#define LED_ORANGE_LO 5
#define LED_RED_HI 6
#define LED_RED_LO 7

void setup() {
  led_init();
  pwr_inint();
  delay(1000);

  digitalWrite(LED_ORANGE_HI , 1);
  digitalWrite(LED_RED_HI , 1);
  digitalWrite(LED_RED_LO , 1);
}

void loop() {

}

void led_init()
{
  pinMode(LED_RED_HI , OUTPUT);
  pinMode(LED_RED_LO , OUTPUT);
  pinMode(LED_ORANGE_HI, OUTPUT);
  pinMode(LED_ORANGE_LO, OUTPUT);
  pinMode(LED_GEEN_HI, OUTPUT);
  pinMode(LED_GEEN_LO, OUTPUT);
}

void pwr_inint()
{
  pinMode(BTN_KEY, INPUT);
  pinMode(PWR_ENABLE, OUTPUT);
  pinMode(CHRG_TEST, INPUT);
  pinMode(PWR_TEST, INPUT);
}
Под какой версией miniCore?
 

bort707

★★★★★★✩
21 Сен 2020
2,859
850
Надобность в "другом" ядре возникла из за питания 328-ой от 3-3.3в и кварце на 8МГц.
в прошлый раз что-то не обратил внимания. Зачем другое ядро для 328й на 8мгц и 3в? У меня отлично работает на стандартном.
Недолюбливаю кастомные ядра, особенно написанные любителями. Там всегда есть скрытые засады.
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,159
1,267
Москва
Потому что проект так был собран. на 8мгц и 3в. Не мной. Так было. На 16мгц и 3.3в тоже все работало (на штатной прошивке) такая фигня пошла как раз при прошивке на 8мгц.

Да, и про кастомные сборки такого же мнения. Никогда точно не узнаешь где будет эта засад. уж тестировать и новое изучать точно надо на проверенных сборках.
 
  • Лойс +1
Реакции: bort707

bort707

★★★★★★✩
21 Сен 2020
2,859
850

Старик Похабыч

★★★★★★★
14 Авг 2019
4,159
1,267
Москва
Объясняю. Нужны коммуникации с внешними модулями БТ считай по UART , соотв. частота камня должна быть прописана, что бы настроить адекватно надо что бы частота была камня была указана правильно. Штатный лоадер работает на 16 , при нем задержки кривые (естественно). Допустим я бы смог это все соединить, но тот, кому все это отсылалось, нет. Там нужно так. Залей и используй.
Плюс еще делались замеры по времени. Раз в 3-5-10 минут.
 

RG22EM

✩✩✩✩✩✩✩
22 Окт 2020
33
4

Вложения

Старик Похабыч

★★★★★★★
14 Авг 2019
4,159
1,267
Москва
Не исключено. Плата мне уже пришла прошитой, а какой там загрузчик я не проверял.
Но теперь плата уже в другом месте и не проверю.