Переход от асма к си

Обсуждаем контроллеры компании Atmel.
Ответить
Это не хвост, это антенна
Аватара пользователя
Сообщения: 1337
Зарегистрирован: Сб июн 09, 2012 02:14:11
Откуда: ХАРЬКОВ

Сообщение СЦБист »

какая к черту ява ?

вы про язык ?

по поводу ++. с++ это расширение си. с++ в полном обьеме поддерживает си но не наоборот.


флаг I выставлять хоть надо вручную или это тоже сделает компилятор ?
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

СЦБист писал(а):какая к черту ява ?
:))) ЯВУ - язык верхнего уровня.
СЦБист писал(а):флаг I выставлять хоть надо вручную или это тоже сделает компилятор ?
Сделает компилятор, но только тогда, когда Вы укажите сделать это ему. В данном случае было бы очень плохо, если бы он сам разрешал или запрещал их.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Реклама
Это не хвост, это антенна
Аватара пользователя
Сообщения: 1337
Зарегистрирован: Сб июн 09, 2012 02:14:11
Откуда: ХАРЬКОВ

Сообщение СЦБист »

Z_h_e писал(а):[qСделает компилятор, но только тогда, когда Вы укажите сделать это ему. В данном случае было бы очень плохо, если бы он сам разрешал или запрещал их.

когда я напишу функцию обработчика прерываний этот флаг установится ?

так а если мне надо запретить прерывания при записи в eeprom к примеру
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Сообщение COKPOWEHEU »

Где-то читал что С++ создавался как ООП-расширение Си, но в итоге получился отдельный язык, не полностью совместимый с оригиналом. Впрочем, искать подтверждение лень, так что спорить смысла нет.
Флагом I компилятор напрямую почти не управляет. Разрешение-запрет прерываний просто оболочки для ассемблерных команд cli/sei. В обработчике прерывания все происходит и вовсе аппаратно.
Надеюсь, опыт программирования на Си для ПК у вас есть. Без него гораздо сложнее.
когда я напишу функцию обработчика прерываний этот флаг установится ?
так а если мне надо запретить прерывания при записи в eeprom к примеру
А говорите что программировали на асме. В обработчике прерывания флаг I сбрасывается аппаратно, независимо от кода. Чтобы запретить прерывания вручную используются ассемблерные вставки или, что лучше, функции, написанные разработчиками компилятора. Для avr-gcc это cli(), sei(), объявленные в <avr/interrupts.h>
Реклама
Эиком - электронные компоненты и радиодетали
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

Язык Си хоть и верхнего уровня. Но не своевольничает и близок к камню. В том числе по этому широко распространился.

Наличие функции обработчика прерывания - это всего-лишь функция на которую ссылается вектор прерывания. Имена их определены в специальном файле который подключается к проекту.
Маски прерываний и глобальное разрешение также устанавливают ручками.
СЦБист писал(а):так а если мне надо запретить прерывания при записи в eeprom к примеру
Функция записи в еепром из стандартной библиотеки сама это делает.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Реклама
Это не хвост, это антенна
Аватара пользователя
Сообщения: 1337
Зарегистрирован: Сб июн 09, 2012 02:14:11
Откуда: ХАРЬКОВ

Сообщение СЦБист »

COKPOWEHEU писал(а):Где-то читал что С++ создавался как ООП-расширение Си,

тогда ява это расширении с++ .

с++ поддерживает все библиотеки чистого си.

хотя сейчас уже есть новые стандарты ++. но они мне нафик не нужны. их не применишь к

контроллерам.
Z_h_e писал(а):Язык Си хоть и верхнего уровня. Но не своевольничает и близок к камню. В том числе по этому широко распространился.
си это процедурная технология.

структуры не могут содержать методов. следовательно функции отдельно - поля отдельно.







в обработчике флаг i сбросится но потом опять установится.


глобальное разрешение в асме это команда sei

в си ее надо самому активировать с помощью вставки ?

<avr/interrupts.h> подключать нужно или это неявное подключение ?
Последний раз редактировалось СЦБист Сб сен 10, 2016 16:00:37, всего редактировалось 1 раз.
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

Не знаю зачем Вы тут про Яву заговорили, но хотя синтаксис ее несколько похож на Си, есть ОГРОМНОЕ отличие. Транслятор Явы - интерпретатор, а не компилятор как у Си.
си это процедурная технология.
В Си нет такого понятия, хотя это несущественно. Но тему эту уже обсуждали в другом топике.
в си ее надо самому активировать с помощью вставки ?
Зачем Вы спрашиваете одно и тоже, если Вам уже ответили?
Последний раз редактировалось Z_h_e Сб сен 10, 2016 16:03:32, всего редактировалось 1 раз.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Это не хвост, это антенна
Аватара пользователя
Сообщения: 1337
Зарегистрирован: Сб июн 09, 2012 02:14:11
Откуда: ХАРЬКОВ

Сообщение СЦБист »

синтаксис Явы похож больше на # хотя кое что и на ++.

одним словом помесь. но зато память не нужно самому освобождать.


подключил к проекту #include <avr/interrupts.h>

применил sei();

и получил шыш

где этот файл откопать ?
Вложения
Бе.JPG
(65.93 КБ) 438 скачиваний
Друг Кота
Аватара пользователя
Сообщения: 12364
Зарегистрирован: Пт дек 17, 2010 15:07:50
Откуда: Крымский Федеральный Округ

Сообщение просто КОТ »

Z_h_e писал(а):Не знаю зачем Вы тут про Яву заговорили
Потому что кто-то не правильно понял аббревиатуру ЯВУ. :beer:
Изображение
И ты врёшь!!! © Vladisman
Изображение
Контактная информация:
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

СЦБист, Вы же давно тут. И постоянно задает какие-то тривиальные вопросы. Совсем не жалко время других?
СЦБист писал(а):где этот файл откопать ?
Поискать у себя на компе, потом в инете... Какой ответ ожидали?

Код: Выделить всё

#include <avr/interrupt.h>
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Сообщение COKPOWEHEU »

Язык Си хоть и верхнего уровня. Но не своевольничает и близок к камню. В том числе по этому широко распространился.
Поскольку он оперирует не машинными инструкциями, а командами языка, не своевольничать он не может: способ перевода одного в другое далеко не один. Другое дело, что обычно можно предсказать во что именно компилятор развернет то или иное выражение.
Наличие функции обработчика прерывания - это всего-лишь функция на которую ссылается вектор прерывания.
Ну, справедливости ради, в отличие от обычных процедур, сохраняется SREG и РОН.
где этот файл откопать ?
Отыскать наконец документацию по avr-libc и почитать какие есть заголовочные файлы и какие в них функции описаны. Да, и использование malloc в контроллерах - плохая идея.
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 353
Зарегистрирован: Вс янв 19, 2014 22:41:55

Сообщение Siarzhuk »

СЦБист писал(а):с++ это расширение си. с++ в полном обьеме поддерживает си но не наоборот.
А экскаватор это расширение солдата желдорбата с лопатой. То, что кормит плюсы в основной области их применения - в сюхе отсутствует. Ембеддед, кмк, не является этой областью. Хотя шаблоны иногда там весьма к месту. :-)
Одновременным нажатием LIGHT и POWER, РП Sangean ATS-909X (ver 1.29) превращается в ATS-909XR! ;-)
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Сообщение COKPOWEHEU »

Объекты и даже наследование тоже могут оказаться удобными. Надо только помнить, что динамическое выделение памяти а, тем более, использование наследования в таких объектах, для контроллеров крайне нежелательно.
Процитирую ДиХалта, который цитирует Джона Кармака, «хороший С++ код лучше чем хороший С код. Но плохой С++ может быть намного ужасней чем плохой С код».
Это не хвост, это антенна
Аватара пользователя
Сообщения: 1337
Зарегистрирован: Сб июн 09, 2012 02:14:11
Откуда: ХАРЬКОВ

Сообщение СЦБист »

Одни догадки по поводу высокоуровневых ЯП.

Создавайте для этого свои темы и не засирайте этим раздел посвященный МК.
Z_h_e писал(а):СЦ, Вы же давно тут.]



ну так и не отвечайте на мои вопросы раз не желаете.

я с вас не собираюсь нечего вытягивать.
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

Хорошо, не буду.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Это не хвост, это антенна
Аватара пользователя
Сообщения: 1337
Зарегистрирован: Сб июн 09, 2012 02:14:11
Откуда: ХАРЬКОВ

Сообщение СЦБист »

Решил создать свои функции в файле

#include <Rafa_Interrupts.h> так как той хрени в вин авр нету.... ибо знатоки опять чего то не договаривают :)))

все ок.

Код: Выделить всё

void sei()
{
      asm("sei");
}

void cli()
{
      asm("cli");
}
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 353
Зарегистрирован: Вс янв 19, 2014 22:41:55

Сообщение Siarzhuk »

СЦБист писал(а):Одни догадки по поводу высокоуровневых ЯП.
Если я вам начну что-то утверждать, к примеру, про ДЦ - вот это будут догадки с моей стороны. Извольте взаимно не учить тех, кто работой на плюсах занимается профессионально не один десяток лет и в курсе "высокоуровневых ЯП" несколько больше чем только решившие "переходить от асма к си".
COKPOWEHEU писал(а):Объекты и даже наследование тоже могут оказаться удобными. Надо только помнить, что динамическое выделение памяти а, тем более, использование наследования в таких объектах, для контроллеров крайне нежелательно.
Я бы перефразировал, что надо понимать, что происходит за кулисами и какие накладные расходы за это платятся. И может ли используемый контроллер эти расходы потянуть. Объекты - это инкапсуляция и защита, если проект большой и потенциально расширяемый в будущем, причём поддерживаться будет явно менее квалифицированными персонажами - то заложить разумную структуру данных и их методов с самого начала будет разумным решением. Тут на накладные расходы в виде неявного параметра в каждый метод можно закрыть глаза. Полиморфизм? Ну это сразу за кулисами появляется VTM и рантайм производительность проседает при частом их использовании - а оно нам надо? А наша задача настолько вариативна, что появятся объекты с меняющимся поведением? Мне пока такие примеры, именно в области встраиваемых систем, на память не идут. Шаблоны - это конечно, смачный хруст пожираемого за кулисами code сегмента. Но - по крайней мере одно применение я им нашёл - NXP-шный камень с тремя I2C каналами - на каждом сидит от одного до четырёх периферийных устройств, на каждом канале есть устройство, мечтающее на канале помультимастерить. Решение в лоб - каждый канал - отдельный модуль в котором своя стейт-машинка и специфичные методы по работе с конкретной периферией. Количество оперируемых регистров, дайбохпамяти, семь штук. И каждый раз, когда находится ошибка в стейт-машинке - надо править и проверять все три модуля. Да и вообще, честный кодер, при подобной дубликации функционала спать спокойно и глубоко априори не сможет. И вот в одном из посещаюших его в таком состоянии кошмаров невидимая рука пишет на стене:

Код: Выделить всё

template<uint32_t __baseAddress, size_t __bufferSize>
class I2CDriver {
	#define __CONSET	(*(volatile unsigned long *)(__baseAddress + 0x00))
	#define __STAT		(*(volatile unsigned long *)(__baseAddress + 0x04))
	#define __DAT			(*(volatile unsigned long *)(__baseAddress + 0x08))
	#define __ADR			(*(volatile unsigned long *)(__baseAddress + 0x0C))
	#define __SCLH		(*(volatile unsigned long *)(__baseAddress + 0x10))
	#define __SCLL		(*(volatile unsigned long *)(__baseAddress + 0x14))
	#define __CONCLR	(*(volatile unsigned long *)(__baseAddress + 0x18))	
[...]
Методы для канало-специфичной периферии в теле класса только объявляем, а инстанциируем их лишь для тех каналов, на которых она живёт. Компилятор, конечно, создаст три копии стейт-машинки, но все по общему шаблону, контролировать который проще чем три модуля. А если экономить code - то используем классический класс - но тогда вопрос с производительностью - адреса регистров придётся каждый раз вычитывать/высчитывать на лету. Тут и вправду VTM может оказаться быстрее. :)
Одновременным нажатием LIGHT и POWER, РП Sangean ATS-909X (ver 1.29) превращается в ATS-909XR! ;-)
Это не хвост, это антенна
Аватара пользователя
Сообщения: 1337
Зарегистрирован: Сб июн 09, 2012 02:14:11
Откуда: ХАРЬКОВ

Сообщение СЦБист »

Siarzhuk писал(а):[qu
Если я вам начну что-то утверждать,:)

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

я тоже не первый год в ++ и малость ориентируюсь в нем.

хотя сейчас предпочтение отдаю яве.

и на кой столько слов если сейчас вопрос стоит иначе ?
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18783
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

СЦБист писал(а):Решил создать свои функции в файле...
так как той хрени в вин авр нету.... ибо знатоки опять чего то не договаривают
вообще-то если вы не удосужились изучить инструмент, которым решили пользоваться, некорректно утверждать, что в нем чего-то не хватает или кто-то вам чего-то недосказал.

я в свое время сделал собственный вольный перевод документации к WinAVR, ознакомьтесь: https://www.simple-devices.ru/articles/ ... avr-studio

вы будете удивлены, но sei() и cli() в WinAVR существуют именно в "базовом" варианте, надо инклюдить avr/interrupt.h всего-навсего

P.S. проитал вашу фразу про "свои функции", который вы решили разместить в заголовочном файле, и что-то у меня возникли сильнейшие сомнения в том, что вы на самом деле
СЦБист писал(а):не первый год в ++ и малость ориентируюсь в нем
размещение функций в заголовочном файле - это, мягко говоря, очень нехорошая практика программирования...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18783
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

СЦБист писал(а):С++ это расширение Си не более того.
Компилятор АУДрино использует именно классы.
следовательно там чистый ++.
С++ это язык, являющийся дальнейшим развитием Си. это не расширение языка Cи.

что касается Ардуино и AVR-GCC вообще, то этот компилятор может компилировать проекты на Си и проекты на С++. даже можно "замиксовать" проект, т.е. часть исходных файлов на Си в проекте смешать с исходниками на С++. Правда, я бы не советовал так делать: можно не означает нужно.

компилятор avr-gcc сам разберется, на каком языке написан исходник по расширению файла: для С++ надо делать расширение исходника *.с++, *.cpp и т.п. - читайте документацию.

можно собирать проекты и с ассемблерными исходниками, которые должны быть написаны по требованиям gnu-as (мощный диалект ассемблера, скажу я вам, особенно в сравнении с убожеством ассемблера от Atmel).
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Ответить

Вернуться в «AVR»