Перейти к содержанию

Язык СИ для микроконтроллеров


Рекомендуемые сообщения

3 часа назад, ruhi сказал:

Если хотите что то похитрее, можно использовать указатель на функцию.

А разве нельзя просто вызвать функцию main() как и любую другую?

И потом , есть же оператор EXIT  прекращающий программу на СИ. Разве он не сделает полный RESET  и не начнёт работу с  main() заново?  

Ссылка на комментарий
Поделиться на другие сайты

Только что, Alex сказал:

Простите меня великодушно, но это заблуждение

Не прощу, ибо вы невнимательны :)

3 часа назад, ARV сказал:

Вы должны понимать, что continue, где бы он не обнаружился, найдет самый ближний к нему цикл и начнет с его начала. Хоть внутрь switch его засунь, хоть внутрь if - без разницы.

 

Только что, SDD39 сказал:

А разве нельзя просто вызвать функцию main() как и любую другую?

Можно. А что при этом будет со стеком?

Только что, SDD39 сказал:

И потом , есть же оператор EXIT  прекращающий программу на СИ. Разве он не сделает полный RESET  и не начнёт работу с  main() заново?

exit() - это не оператор, а стандартная функция Си, которая прерывает исполнение main, по сути реализуя выход из main

Так как в embedded-системах нет "окружения", запускающего на исполнение программу, то завершение программы микроконтроллера никак и нигде не регламентировано. То есть я хочу сказать, что неизвестно, что будет после выхода из main

Но я на 100% уверен, что программа для микроконтроллеров AVR, скомпилированная при помощи AVR-GCC, после выхода из main не приведет к сбросу микроконтроллера, а скорее наоборот, превратит его в кирпич (будут запрещены все прерывания и запущен вечный пустой цикл).

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

Ссылка на комментарий
Поделиться на другие сайты

1 минуту назад, ARV сказал:

Не прощу, ибо вы невнимательны :)

Да вроде внимательно читал :) И судил по этому тексту :

4 часа назад, ARV сказал:

continue однозначно обозначает "продолжение работы цикла", и ничего более - что он может делать в switch?! это же оператор "однократного прохода", а не многократного.

Поэтому continue не применим нигде, кроме циклов. Компилятор просто не даст вам это сделать

который означает (по моему мнению, естественно), что continue нечего делать в switch и компилятор не даст его туда вставить.
Но если это не так, прошу прощения за недопонимание :)
 

Ссылка на комментарий
Поделиться на другие сайты

Сравнительное тестирование аккумуляторов EVE Energy и Samsung типоразмера 18650

Инженеры КОМПЭЛ провели сравнительное тестирование аккумуляторов EVE и Samsung популярного для бытовых и индустриальных применений типоразмера 18650. 

Для теста были выбраны аккумуляторы литий-никельмарганцевой системы: по два образца одного наименования каждого производителя – и протестированы на двух значениях тока разряда: 0,5 А и 2,5 А. Испытания проводились в нормальных условиях на электронной нагрузке EBD-USB от ZKEtech, а зарядка осуществлялась от лабораторного источника питания в режиме CC+CV в соответствии с рекомендациями в даташите на определенную модель. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Только что, Alex сказал:

который означает (по моему мнению, естественно), что continue нечего делать в switch и компилятор не даст его туда вставить

Если сам swich не находится в цикле, то continue туда никак не встанет, вот что я имел ввиду.

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

Ссылка на комментарий
Поделиться на другие сайты

Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. 

Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств. Подробнее параметры и результаты тестов новой серии PLM по ссылке.

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

3 минуты назад, ARV сказал:

А что при этом будет со стеком?

Тот же вопрос .. а если вызвать main() через указатель? Разве не получим то же самое , забыл как называется когда функция саму себя вызывает?

 

6 минут назад, ARV сказал:

превратит его в кирпич (будут запрещены все прерывания и запущен вечный пустой цикл).

Возможно. Я таких тонкостей не знаю. Ну тогда наверно  можно вызвать через asm::{"rjmp reset"}?

Ссылка на комментарий
Поделиться на другие сайты

Литиевые батарейки и аккумуляторы от мирового лидера  EVE в Компэл

Компания Компэл, официальный дистрибьютор EVE Energy, бренда №1 по производству химических источников тока (ХИТ) в мире, предлагает продукцию EVE как со склада, так и под заказ. Компания EVE широко известна в странах Европы, Америки и Юго-Восточной Азии уже более 20 лет. Недавно EVE была объявлена поставщиком новых аккумуляторных элементов круглого формата для электрических моделей «нового класса» компании BMW.

Продукция EVE предназначена для самого широкого спектра применений – от бытового до промышленного. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

1 минуту назад, ARV сказал:

Если сам swich не находится в цикле, то continue туда никак не встанет, вот что я имел ввиду.

А, ну так-то да.

Только что, SDD39 сказал:

Разве не получим то же самое , забыл как называется когда функция саму себя вызывает?

Получим. Называется - рекурсия.

Ссылка на комментарий
Поделиться на другие сайты

7 минут назад, ARV сказал:

будут запрещены все прерывания и запущен вечный пустой цикл).

не будут прерывания запрещены, С-стандарт ничего не знает про прерывания.

Кстати поэтому, любая реализация С для МК не соответствует, точнее, выходит за рамки С-стандарта.

Можно сделать все! Но чем больше можно, тем больше нельзя!

Ссылка на комментарий
Поделиться на другие сайты

2 минуты назад, Alex сказал:

А, ну так-то да.

Получим. Называется - рекурсия.

Я написал (и пример привел) что функция определяет, какая функция будет вызвана следующей, читайте внимательнее!

Это похоже на "рефлексию".

Можно сделать все! Но чем больше можно, тем больше нельзя!

Ссылка на комментарий
Поделиться на другие сайты

Только что, ruhi сказал:

не будут прерывания запрещены, С-стандарт ничего не знает про прерывания.

Кстати поэтому, любая реализация С для МК не соответствует, точнее, выходит за рамки С-стандарта

Ну зачем так... А разве язык Си (или стандарт) что-нибудь знает, что будет после выхода из main в программе для персонального компьютера? Этот аспект выходит за рамки стандарта Си вообще, а не только для микроконтроллеров.

Что касается запрета прерываний, то я конкретно указал условия, когда это будет сделано: если программа (прошивка МК) скомпилирована AVR-GCC, то после выхода из main будет именно то, что я и сказал. Это я вам гарантирую.

Только что, ruhi сказал:

функция определяет, какая функция будет вызвана следующей, читайте внимательнее!

Ну если это реализация автомата состояний - почему бы и нет. Но только не в виде, предложенном вами, когда внутри функции модифицируется указатель, находящийся вовне этой функции и определяющий вызов следующей... Ваш подход, как я и говорил, крайне сложно читаемый.

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

Ссылка на комментарий
Поделиться на другие сайты

1 минуту назад, ARV сказал:

Что касается запрета прерываний, то я конкретно указал условия, когда это будет сделано: если программа (прошивка МК) скомпилирована AVR-GCC, то после выхода из main будет именно то, что я и сказал. Это я вам гарантирую.

Не верю :), после выхода по return, скорее процессор будет исполнять ФФ-неинициализированной памяти, пока не вернется к ресету все таки, но проверять лень.

А вот exit может и сделает что Вы написали, должен же он что то делать.

Можно сделать все! Но чем больше можно, тем больше нельзя!

Ссылка на комментарий
Поделиться на другие сайты

Только что, ruhi сказал:

Не верю

Спорим? ;)

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

Ссылка на комментарий
Поделиться на другие сайты

Только что, ruhi сказал:

не спорю

А что так? Сомневаться в моих словах и не спорить?

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

Ссылка на комментарий
Поделиться на другие сайты

Только что, ARV сказал:

А что так? Сомневаться в моих словах и не спорить?

Тоже хочешь авторитетом задавить? :)

Можно сделать все! Но чем больше можно, тем больше нельзя!

Ссылка на комментарий
Поделиться на другие сайты

Только что, ruhi сказал:

Тоже хочешь авторитетом задавить?

Всего лишь хотел бабла срубить. Но вы предложили тоже нормальный вариант.

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

Ссылка на комментарий
Поделиться на другие сайты

24 минуты назад, ruhi сказал:

Я написал (и пример привел) что функция определяет, какая функция будет вызвана следующей, читайте внимательнее!

Что внимательнее читать ? :blink:
Я цитировал вопрос :

30 минут назад, SDD39 сказал:

а если вызвать main() через указатель? Разве не получим то же самое , забыл как называется когда функция саму себя вызывает?

И имел в виду, что неважно через чего вызывать - через указатель, или напрямую.

Ссылка на комментарий
Поделиться на другие сайты

1 час назад, Alex сказал:

Кстати, судя по Вашему коду, у Вас не будет 20*8 мс. Если кнопки не нажаты (я так понял, их 8 штук ?), то будут постоянные переходы, без задержки.

кнопок всего две, 20*8 = 160мсек за 19 циклов =>  3 секунды, которые нужно жать кнопку, чтобы перейти на процедуру записи в еепром.

8 - это коэффициент деления тактовой частоты МК (тиньки 13) с помощью фьюза CLKDIV8. 

ALEX, Спасибо за участие, обязательно по разбираюсь с вашим вариантом, просто столько информации сразу, голова кругом:wacko:

Опыт - это то, что получаешь, не получив того, что хотел

Ссылка на комментарий
Поделиться на другие сайты

2 минуты назад, wws63 сказал:

8 - это коэффициент деления тактовой частоты МК (тиньки 13) с помощью фьюза CLKDIV8.

Ух, какие сложности :)
А нельзя сразу настроить так, чтобы значения в delay_ms совпадали с реальными ? :huh:

Кстати, по поводу вот этого кода :

		Value_ee = eeprom_read_byte(&data_0); // считываем байт из EEPROM и помещаем его в "Value_ee"
			if (Value_ee == 0xFF)
			   {            
				Value_ee = 0;
				eeprom_write_byte(&data_0, Value_ee); // записываем "Value_ee" в EEPROM  
				setbit (PORTB, SIG);
				_delay_ms(125);
				clrbit (PORTB, SIG);
				goto CYCLE;
			   }
			else
			   {
				Value_ee = 0xFF;
				eeprom_write_byte(&data_0, Value_ee); // записываем "Value_ee" в EEPROM  
				setbit (PORTB, SIG);
				_delay_ms(16);
				clrbit (PORTB, SIG);
				goto CYCLE;
			   }

У Вас 2 одинаковых куска. Зачем их плодить ?
А в итоге, просто инвертируется значение в ячейке еепрома.
Как вариант :

eeprom_write_byte(&data_0, ~eeprom_read_byte(&data_0));
setbit (PORTB, SIG);
_delay_ms(125);
clrbit (PORTB, SIG);

Разницу чувствуете ? :)

Ссылка на комментарий
Поделиться на другие сайты

Поискал немного по гуглу. Лучше всего делать программный ресет через сторожевой таймер. http://www.stepwood.com/mcucodes/2012/04/09/programmnyiy-perezapusk-mikrokontrollerov-avr/

И вот здесь нашёл интересный код на Си http://radiokot.ru/forum/viewtopic.php?t=11330

Цитата

Есть прерывание по 0 адресу – то бишь ресет 
void (*funcptr)( void ) = 0x0000;//Программный RESET 
Обращаешься как funcptr();

Только не понял как это работает. 

Ссылка на комментарий
Поделиться на другие сайты

Только что, SDD39 сказал:

Лучше всего делать программный ресет через сторожевой

Как-то неожиданно с Си перешли на сброс... к чему бы это?

Только что, SDD39 сказал:

Только не понял как это работает

объявляется указатель на функцию без параметров и без возврата значения, этому указателю присваивается адрес 0x0000, а потом обращение к функции по этому указателю по сути осуществляет переход на этот адрес...

Этот подход плох лишь тем, что не инициализирует аппаратную периферию микроконтроллера, что аппаратно делается при сбросе. Поэтому вариант по watchdog предпочтительнее - там генерируется настоящий сброс МК.

Только что, Alex сказал:

Разницу чувствуете ?

Ну да, только я не уверен, что value_ee, от которой вы избавились, далее по ходу пьесы никому не нужна...

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

Ссылка на комментарий
Поделиться на другие сайты

5 минут назад, ARV сказал:

Ну да, только я не уверен, что value_ee, от которой вы избавились, далее по ходу пьесы никому не нужна...

Да, я уже предусмотрел в голове вариант, на этот случай :

eeprom_write_byte(&data_0, Value_ee = ~eeprom_read_byte(&data_0));

Но, судя по предоставленному коду, она временная и дальше не понадобится. Разве что, только мигнуть каким-нибудь светиком с разной длительностью. Но и это не проблема :

_delay_ms(Value_ee ? 16 : 125);

Или через if.

Ссылка на комментарий
Поделиться на другие сайты

2 минуты назад, Alex сказал:

Да, я уже предусмотрел в голове вариант, на этот случай :


eeprom_write_byte(&data_0, Value_ee = ~eeprom_read_byte(&data_0));

 

У меня там ещё и длительность сигнала SIG, зависит от записанного значения в еепром

Опыт - это то, что получаешь, не получив того, что хотел

Ссылка на комментарий
Поделиться на другие сайты

1 минуту назад, wws63 сказал:

У меня там ещё и длительность сигнала SIG, зависит от записанного значения в еепром

Да, видел. Только что обновил своё сообщение.  Не успел сразу :)

6 минут назад, Alex сказал:

Но, судя по предоставленному коду, она временная и дальше не понадобится. Разве что, только мигнуть каким-нибудь светиком с разной длительностью. Но и это не проблема :


_delay_ms(Value_ee ? 16 : 125);

Или через if.

 

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы публикуете как гость. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...