Нашли или выдавили из себя код, который нельзя назвать нормальным,
на который без улыбки не взглянешь?
Не торопитесь его удалять или рефакторить, — запостите его на
говнокод.ру, посмеёмся вместе!
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
Master_Slave_Check();
if (CtrlBrd_Mode == 1) //MasterMode
{
SSPC_Check_Proc();
Read_ADC();
Logic();
RS_Enable();
Obmen_RS();
//CAN_Enable();
//Obmen_CAN();
//if (SoftFlag.Flag1.bit.History_Wr_Req)
//{
// SoftFlag.Flag1.bit.History_Wr_Req = 0;
// Write_History();
//}
HAL_IWDG_Refresh(&hiwdg); //Dog reset
Migalka(); //Working LED blink
}
else if (CtrlBrd_Mode == 0) //SlaveMode
{
Slave_DeInit();
while(1)
{
Master_Slave_Check();
if (CtrlBrd_Mode == 1) //если плата снова стала мастером, когда сдох основной мастер,
HW_RESET(); //делаем аппаратный сброс для перезапуска (нога выставляется в 1, отпирает транзюк VT9, который садит на землю вход управления тракой)
HAL_IWDG_Refresh(&hiwdg); //Dog reset
Migalka();
}
}
}
/* USER CODE END WHILE */
}
Так реализовал параллельную работу двух одинаковых плат управления, одна из которых висит в режиме ожидания.
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
Master_Slave_Check();
if ($CtrlBrd_Mode == 1) //MasterMode
{
SSPC_Check_Proc();
Read_ADC();
Logic();
RS_Enable();
Obmen_RS();
//CAN_Enable();
//Obmen_CAN();
//if (SoftFlag.Flag1.bit.History_Wr_Req)
//{
// SoftFlag.Flag1.bit.History_Wr_Req = 0;
// Write_History();
//}
HAL_IWDG_Refresh(&$hiwdg); //Dog reset
Migalka(); //Working LED blink
}
else if ($CtrlBrd_Mode == 0) //SlaveMode
{
Slave_DeInit();
while(1)
{
Master_Slave_Check();
if ($CtrlBrd_Mode == 1) //если плата снова стала мастером, когда сдох основной мастер,
HW_RESET(); //делаем аппаратный сброс для перезапуска (нога выставляется в 1, отпирает транзюк VT9, который садит на землю вход управления тракой)
HAL_IWDG_Refresh(&$hiwdg); //Dog reset
Migalka();
}
}
}
/* USER CODE END WHILE */
}
Может, они там фехтуют пенисами, как моллюски-гермафродиты... Не, мне вот это понравилось: HW_RESET(); //делаем аппаратный сброс для перезапуска (нога выставляется в 1, отпирает транзюк VT9, который садит на землю вход управления тракой)
Неужели только так можно перезагрузить контроллер? Вот x86, помнится, перезагружался через контроллер клавиатуры, но тут вроде бы должна быть соответствующая инструкция... ну или через while(1); // Укуси меня собака
(на x86 WDT не перезагружает процессор, а выдает сигнал на соответствующий выход, и если на плате он не разведен на Reset, то рестарт становится нетривиальной задачей...)
if ((Discrete1_State == 0) && ((Discrete2_State == 0) || (Discrete3_State == 0)))
CtrlBrd_Mode = 1;
}
//первый вход - просто перемычка, я сам задаю, кто мастер, а кто слэйв. Другие два входа нюхают выходы со второй платы.
//Не очень надежно, но другого пока не высрал)
> не очень надёжно
Есть шанс, что после включения основной платы она сразу же станет мастером, а резервная плата узнает об этом только на следующей итерации.
Ну вот если слейв дохлый, то мастер не запустится если в CtrlBrd_Mode изначально не 1. Т.е. начальное значение таки важно, а правило 1 никогда не используется 🙂
1) Перемычка может стоять
2) Приоритет определяется адресом: при передаче адреса происходит одновременный мониторинг шины, несовпадение переданного бита означает присутствие на шине устройства с бóльшим приоритетом.
3) Сражаются, пока один не отгрызет пенис другого
4) При возникновении коллизии запускается алгоритм определения (например, CSMA/CD: генерируется сигнал помехи, чтобы партнер тоже перешел в режим определения, затем после [квази]случайной задержки и отсутствии приема происходит повтор передачи)
> логические цепи
Блин, на deathworld marathon пиздец какой-то. Начальные ресурсы прямо в упор к зергушатникам. Полчаса ныкался в ближайшем лесу. Отресёрчил турельки, построил парочку. С радости добавил ещё пару майнеров. Набежало штук 50 местных обитателей, кровь-кишки-гейм-овер. Какие тут логические цепи...
3 часа на новой мапе. Еле-еле успел огородиться, джва раза терял генераторы. База похожа на ёбаную кастрюлю с лапшой - всё натыкано в спешке и как-попало. По ночам хоть глаз выколи - нет времени расставить лампочки. Кругом хруст бетона, хрипы жуков, вспышки пулемётов. Эволюция местных обитателей дошла до 20%, скоро стены и обычные патроны не смогут их сдерживать... Добро пожаловать в ад.
Так можно, да, но в сисярпе так никто делать не будет, потому что while(true).
А вот наличие указателей не говорит однозначно о том, что это не C#, они ведь там есть (правда, такой код нужно помечать как unsafe).
Референс для референс тайпа нужен, если ты хочешь внутри метода не просто модифицировать объект, а самой ссылке присвоить новый объект, т.е. изменить сам референс, да. Типа вот такого:
void M1(MyRefType obj) => obj = new MyRefType();
void M2(ref MyRefType obj) => obj = new MyRefType();
Первый метод для вызывающего кода не сделает ничего, а второй заменит объект по передаваемой ссылке на новый.
А что, тру != 1 ?
всегда так писал, проблем не было.
& - указывает на адрес объекта в памяти МК. Только так можно передавать структуру или массив в функцию и наоборот.
Вообще, это какие-то HAL-овские заморочки, в кококоторые я до конца не въехал. Начал осваивать данный МК месяц назад, ранее кокококодил под TI TMS320F280x и Миландровские камни.
> но в c# это и так происходит
Структура (в отличие от класса) в сисярпе — это вэлью-тайп, она копируется при передаче в функцию. Чтобы передать ее по ссылке, нужно добавить ref (если только метод не async) или по хардкору юзать указатели как в сишечке.
HW_RESET(); //делаем аппаратный сброс для перезапуска (нога выставляется в 1, отпирает транзюк VT9, который садит на землю вход управления тракой)
Неужели только так можно перезагрузить контроллер? Вот x86, помнится, перезагружался через контроллер клавиатуры, но тут вроде бы должна быть соответствующая инструкция... ну или через while(1); // Укуси меня собака
(на x86 WDT не перезагружает процессор, а выдает сигнал на соответствующий выход, и если на плате он не разведен на Reset, то рестарт становится нетривиальной задачей...)
{
if ((Discrete1_State == 1) && ((Discrete2_State == 1) || (Discrete3_State == 1)))
CtrlBrd_Mode = 1;
if ((Discrete1_State == 0) && ((Discrete2_State == 1) || (Discrete3_State == 1)))
CtrlBrd_Mode = 0;
if ((Discrete1_State == 0) && ((Discrete2_State == 0) || (Discrete3_State == 0)))
CtrlBrd_Mode = 1;
}
//первый вход - просто перемычка, я сам задаю, кто мастер, а кто слэйв. Другие два входа нюхают выходы со второй платы.
//Не очень надежно, но другого пока не высрал)
Есть шанс, что после включения основной платы она сразу же станет мастером, а резервная плата узнает об этом только на следующей итерации.
> перемычка
1 - основная плата, 0 - резервная?
> выходы со второй платы
Единичка выставляется на эти выходы при старте контроллера и никогда не убирается. Ноль - обрыв провода или сдох контроллер?
Я правильно понял логику?
З.Ы. Что лежит в CtrlBrd_Mode изначально?
Ккй бгр )))
2) Приоритет определяется адресом: при передаче адреса происходит одновременный мониторинг шины, несовпадение переданного бита означает присутствие на шине устройства с бóльшим приоритетом.
3) Сражаются, пока один не отгрызет пенис другого
4) При возникновении коллизии запускается алгоритм определения (например, CSMA/CD: генерируется сигнал помехи, чтобы партнер тоже перешел в режим определения, затем после [квази]случайной задержки и отсутствии приема происходит повтор передачи)
>C#
существует мнение что ты пиздун
Дык ардуина - это и есть атмега. Просто распаянная на плату и с готовыми железными и софтовыми модулями.
http://rw6ase.narod.ru/00/rk1/mrk2_8.jpg
Под них сложно мозг вывернуть... Но да, большинство практических задач они решают даже без кобенаторов.
Блин, на deathworld marathon пиздец какой-то. Начальные ресурсы прямо в упор к зергушатникам. Полчаса ныкался в ближайшем лесу. Отресёрчил турельки, построил парочку. С радости добавил ещё пару майнеров. Набежало штук 50 местных обитателей, кровь-кишки-гейм-овер. Какие тут логические цепи...
У шарпеев строгая тупизация, там надо писить 1 == 1 тогда уже
А вот наличие указателей не говорит однозначно о том, что это не C#, они ведь там есть (правда, такой код нужно помечать как unsafe).
более того: если передается не валуе тайп а обект, то вообще ничево писать не надо, он же и так через ука3атель работает всегда
реф для референс тайпа вообще не понятно зачем нужен
чтобы изменить сам референс?
в шарпе же так можно (в отличе от крестов) или нет?
если да, то выходит что ref в шарпе означает поинтер в крестах но безопасный
уфф
Первый метод для вызывающего кода не сделает ничего, а второй заменит объект по передаваемой ссылке на новый.
если я так хочу получить аутпут то есть же out
всегда так писал, проблем не было.
& - указывает на адрес объекта в памяти МК. Только так можно передавать структуру или массив в функцию и наоборот.
Вообще, это какие-то HAL-овские заморочки, в кококоторые я до конца не въехал. Начал осваивать данный МК месяц назад, ранее кокококодил под TI TMS320F280x и Миландровские камни.
селиконоую долину придумали надмозги
передавать структуру в функцию в сях действительно лучше по указателю (чо ее копировать тто?) но в c# это и так происходит
* ISO C Standard: 7.16 Boolean type and values <stdbool.h>
*/
#ifndef _STDBOOL_H
#define _STDBOOL_H
#ifndef __cplusplus
#define bool _Bool
#define true 1
#define false 0
#else /* __cplusplus */
/* Supporting <stdbool.h> in C++ is a GCC extension. */
#define _Bool bool
#define bool bool
#define false false
#define true true
#endif /* __cplusplus */
/* Signal that all the definitions are present. */
#define __bool_true_false_are_defined 1
#endif /* stdbool.h */
Подсказываю: это разные языки, они просто называются похоже
Структура (в отличие от класса) в сисярпе — это вэлью-тайп, она копируется при передаче в функцию. Чтобы передать ее по ссылке, нужно добавить ref (если только метод не async) или по хардкору юзать указатели как в сишечке.
именно потому за сишарп
http://govnokod.ru/25712#comment488653