реклама на сайте
подробности

 
 
> К знатокам, Локальные переменные.
SasaVitebsk
сообщение Sep 6 2007, 00:58
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Пишу достаточно простую прогу. Пытаюсь оптимизировать.

Столкнулся с одной бедой. Попробую описать.

Построено на прерываниях. Между прерываниями разные промежутки. Есть короткие, есть длинные. Как назло именно короткое прерывание сильно загружено. Дабы разгрузить его я пытаюсь часть вычислений вынести в предыдущее не загруженное прерывание. Уже полностью перешёл на указатели, но всё равно шляпа получается.

Проблема в том, что я не могу ввести локальные переменные на два прерывания. Таким образом я ввожу статик. Но тогда во втором прерывании компилятор пытается сохранить значения. А мне это не надо ни капельки. Чтобы этого избежать я ввёл локальные переменные и во втором прерывании выполнил присваивание локальным статик. Код получился значительно компактнее, но всё равно выполняется никому не нужное присваивание. А это 6 указателей!

Теперь сам вопрос.
Могу ли я указать компилятору что можно разрушать переменные в данном прерывании. То есть что не надо их хранить. Или как это сделать. Надо типа переобъявить статические переменные локальными. Не знаю как выразится. Надеюсь поняли.
Go to the top of the page
 
+Quote Post
9 страниц V  « < 3 4 5 6 7 > »   
Start new topic
Ответов (60 - 74)
zltigo
сообщение Sep 22 2007, 18:11
Сообщение #61


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(singlskv @ Sep 22 2007, 20:49) *
Конечно это не голый C...

Это вообще не 'C'. По сравнению с этими телодвижениями заколачивание гвоздей микроскопом выглядят более чем разумно sad.gif.
Цитата
но для микроконтртроллеров он и не бывает без
всяких примочек типа прагм, указаний где лежат данные, и т.д.

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


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
dxp
сообщение Sep 22 2007, 18:56
Сообщение #62


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



Цитата(singlskv @ Sep 23 2007, 00:49) *
Давайте,
код на Gcc для AVR:
Код
// регистровые переменные для работы прерывания системного таймера

register BYTE ADCL_            asm("r2");

[...]

  PINC_  = PINC;
  PIND_  = PIND;
  __asm__ __volatile__ ("reti" ::);  // выходим
}
8 команд + вход и выход, джиттер 1 такт
Конечно это не голый C, но для микроконтртроллеров он и не бывает без
всяких примочек типа прагм, указаний где лежат данные, и т.д.

Во-первых, как уже сказано, это не С. Это асм, обернутый в синтаксис С. В таком стиле проще это все написать на ассемблере - писанины меньше, возни с расширениями С никакой.

Во-вторых, я не понял из этого примера, что вы хотели показать по сравнению с С++? Где и на чем тут С++ должен был "слить"? Пример не то, чтобы неудачный, просто никакой (мимо вопроса).

Цитата(singlskv @ Sep 23 2007, 00:49) *
Интересно, по Вашему линух это достаточно большая программа для того что бы ее
уже необходимо было писать на С++ ?
Почему авторы предпочли писать линух на С ?

Уверены, что современные линухи целиком написаны на С? smile.gif Поинтересуйтесь, какая доля голого С там присутствует, даже если драйвера уже давно пишут на плюсах. А то, что начинался он на С, так это понятно - тогда ни Стандарта еще не было на С++, ни компиляторов приличных (стабильных и эффективных).


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
singlskv
сообщение Sep 22 2007, 19:21
Сообщение #63


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(zltigo @ Sep 22 2007, 22:11) *
Это вообще не 'C'.
Это С для микроконтроллеров, в частности Gcc для AVR.
Цитата
По сравнению с этими телодвижениями заколачивание гвоздей микроскопом выглядят более чем разумно sad.gif.
Вы хотели сказать что неоптимальненько написан данный кусок ? biggrin.gif
Ждем ваших решений.... 07.gif на С++ biggrin.gif

Код Си библиотек написаный на С смотрели ?
Там таких микроскопов завались smile.gif

З.Ы. этот код это единственное непереносимое место в проге, зато все очень быстро и без
заметного джиттера.

Цитата(zltigo @ Sep 20 2007, 10:10) *
Для батарейных девайсов на первый план выходит время вхождение в прерывание? Даже не подозревал sad.gif.
Нет, но вскоре видимо буду. Предстоит замена-Upgrade одного старинного электомеханического девайса. Причем AVR там стоять не будет - слишком в полуспящем режиме батарейка маленькая и задачи опять-таки не битики сбрасывать, а все-таки немножко в цифре фильтровать, LCD управлять опят-таки нужно.....

Цитата
Позвольте об этом судить тем, кто умеет пользоваться инструментом.
Вот именно, ТЕМ КТО УМЕЕТ пользоваться инструментом и выжать из него
все что только можно.

немножко в цифре фильтровать...
LCD опять-таки управлять...
Несомненно для этой этой задачки нужен ARM мегагерц на 200 и С++ lol.gif


Цитата(dxp @ Sep 22 2007, 22:56) *
Во-первых, как уже сказано, это не С. Это асм, обернутый в синтаксис С. В таком стиле проще это все написать на ассемблере - писанины меньше, возни с расширениями С никакой.
Ну я же сразу же предупредил что это С в приложении к микроконтроллеру.
На асм не проще по той причине что дальше в проге идет переработка данных
полученных в прерывании и выгодно их хранить в виде С переменных но хранящихся в регистрах.
Цитата
Во-вторых, я не понял из этого примера, что вы хотели показать по сравнению с С++? Где и на чем тут С++ должен был "слить"? Пример не то, чтобы неудачный, просто никакой (мимо вопроса).
Ну лень было придумывать и писать какой-нить пример где С++ сольет,
вот и взял первое что под руку подвернулось smile.gif
Тока давайте сразу же уточним что под С++ я подразумеваю хотя бы
использование классов, разницу в процедурной реализации на С и С++ рассматривать просто
безсмысленно...
Цитата
Уверены, что современные линухи целиком написаны на С? smile.gif Поинтересуйтесь, какая доля голого С там присутствует, даже если драйвера уже давно пишут на плюсах. А то, что начинался он на С, так это понятно - тогда ни Стандарта еще не было на С++, ни компиляторов приличных (стабильных и эффективных).

Эээ..., ну как Вам сказать ....
Нет, ну конечно Вы правы, там еще довольно много платформозависимого кода на асм.

З.Ы. Время от времени пересобираю линух для AVR32, кода на С++ пока не обнаружил smile.gif
Go to the top of the page
 
+Quote Post
zltigo
сообщение Sep 22 2007, 19:33
Сообщение #64


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(singlskv @ Sep 22 2007, 22:00) *
Вот именно, ТЕМ КТО УМЕЕТ пользоваться инструментом и выжать из него
все что только можно.

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

Отнюдь, использование регистров глобально, наносит неизгладимый отпечаток на весь код.
Цитата
Несомненно для этой этой задачки нужен ARM мегагерц на 200 и С++

Нет, хватит микромощного 16-ти битовика, С (С++ по настроению) и немного чистого ASM, там, где нужно.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
singlskv
сообщение Sep 22 2007, 20:09
Сообщение #65


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(zltigo @ Sep 22 2007, 23:33) *
Если Вы намекаете на свои исходники, то это не умение, это нагромождение голых трюков ясно показывающее неумение нормально продумывать решение задачи. Об этом-же говорят еще и полученные Вами дикие (2mks) цифры реакции на прерывание (да и еще до кучи к нему нечто называемое Вами джиттером того-же порядка)
Вы похоже меня с кем то перепутали, читайте внимательнее посты,
у меня джиттер несколко получше, 1 такт процессора, при 16Мгц это ~60нс
Цитата
, при попытке написать что-то более серьезное, нежели перекладывание байтиков.
Ну если говорить об этой проге, то там не только "перекладывание байтиков".
Там еще и 16 входных цифровых каналов с фильтрацией практически произвольно перемешанные
по PINB, PINC и PIND, 2 канала ADC с фильтрацией, 1-2 PWM, SPI, ну и еще
обмен на 400КГц по I2C (реальная скорость передачи ~25Кбайт/с.
Конечно перекладывание байтиков, но байтиков было много... smile.gif
Цитата
Отнюдь, использование регистров глобально, наносит неизгладимый отпечаток на весь код.
Ну как Вам сказать, реально задействованными оказались только R0-R9 и R14-R31,
R10-R13 компилятору просто не понадобились.
Цитата
Нет, хватит микромощного 16-ти битовика, С (С++ по настроению) и немного чистого ASM, там, где нужно.
MSP430 ?
Правильная AVR при правильном использовании тоже бы подошла,
тока Вы их похоже просто принципиально не используете, даже если для
конкретной задачки их использование будет выгоднее... smile.gif
Go to the top of the page
 
+Quote Post
zltigo
сообщение Sep 22 2007, 20:39
Сообщение #66


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(singlskv @ Sep 22 2007, 23:09) *
Вы похоже меня с кем то перепутали,

Простите, это действительно так sad.gif
Цитата
у меня джиттер несколко получше, 1 такт процессора, при 16Мгц это ~60нс

Не все команды AVR за один такт выполняются, без вызовов/возвратов Вы едва-ли обошлись, по этой причине 4 такта
процессора будут реальной величиной.
Цитата
Правильная AVR при правильном использовании тоже бы подошла,

Нет.
- Режимы энергосбережения много лучше;
- Контроллер LCD;
- 16bit много предпочтительнее для работы с 12bit значениями.
Посколько я не связан обязательствами использовать какой-либо один контроллер и способен достаточно легко переходить, то могу выбирать не только среди "правильных", но и "самых правильных" smile.gif.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
singlskv
сообщение Sep 22 2007, 21:13
Сообщение #67


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(zltigo @ Sep 23 2007, 00:39) *
- 16bit много предпочтительнее для работы с 12bit значениями.
Посколько я не связан обязательствами использовать какой-либо один контроллер и способен достаточно легко переходить, то могу выбирать не только среди "правильных", но и "самых правильных" smile.gif.
Если нужно много достаточно быстрых ADC преобразований, то тогда
MSP c его 16 регистрами памяти ADC конечно рулит,
тока асм там точно будет нужен...

Обязательствами я тоже не очень связан. smile.gif


Цитата(zltigo @ Sep 23 2007, 00:39) *
Не все команды AVR за один такт выполняются, без вызовов/возвратов Вы едва-ли обошлись, по этой причине 4 такта
процессора будут реальной величиной.
Да, Вы правы, RET действительно присутствует, так что джиттер 4-1=3 такта.
Просто в первоначальной реализации, в момент возникновения прерывания, у меня были
команды максимум в 2 такта, но потом по некоторым причинам пришлось переделать и
вставить вызов функции.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Sep 22 2007, 21:36
Сообщение #68


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(singlskv @ Sep 23 2007, 00:13) *
Да, Вы правы, RET действительно присутствует, так что джиттер 4-1=3 такта.

И без "-1", ибо при удачном стечении обстоятельств ждать окончания текущей команды вообще не придется, а при неудачном все 4 такта.


Цитата(singlskv @ Sep 23 2007, 00:13) *
тока асм там точно будет нужен...

ASM проблем нет, если надо. А из нужного, еще неплохая аналоговая начинка присутствует.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
singlskv
сообщение Sep 22 2007, 21:47
Сообщение #69


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Да, далеко мы уже удалились... от темы,
единственно что радует, модератор вряд ли забанит за оффтоп smile.gif
Цитата(zltigo @ Sep 23 2007, 01:36) *
И без "-1", ибо при удачном стечении обстоятельств ждать окончания текущей команды вообще не придется, а при неудачном все 4 такта.
ASM проблем нет, если надо. А из нужного, еще неплохая аналоговая начинка присутствует.
Т.к прерывание синхронное (таймер), джиттер имеет смысл рассчитывать только при
попадании на середину команды, то есть максимумтактов-1.
Если бы все команды были однотактовые то джиттера небыло бы вобще.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Sep 22 2007, 22:22
Сообщение #70


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(singlskv @ Sep 23 2007, 00:47) *
Т.к прерывание синхронное (таймер)..

Синхронность в данном случае дело абсолютно темное, поведение будет зависеть от сдвига и без знания потрохов судить о поведении невозможно.


Цитата(singlskv @ Sep 23 2007, 00:47) *
Да, далеко мы уже удалились... от темы,

Но не от "джиттера" smile.gif.
Продолжения про "джиттер" вносимый плюсами будет?


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
dxp
сообщение Sep 23 2007, 08:59
Сообщение #71


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



Цитата(singlskv @ Sep 23 2007, 02:21) *
Это С для микроконтроллеров, в частности Gcc для AVR.

С - это С. Не бывает С для микроконтроллеров. Бывают расширения компилятора для конкретной платформы.

Цитата(singlskv @ Sep 23 2007, 02:21) *
Вы хотели сказать что неоптимальненько написан данный кусок ? biggrin.gif
Ждем ваших решений.... 07.gif на С++ biggrin.gif

Звучит примерно так: есть код

out PORTB, r16

Ждем реализацию на С++. biggrin.gif

Цитата(singlskv @ Sep 23 2007, 02:21) *
Ну я же сразу же предупредил что это С в приложении к микроконтроллеру.

См выше.

Цитата(singlskv @ Sep 23 2007, 02:21) *
На асм не проще по той причине что дальше в проге идет переработка данных
полученных в прерывании и выгодно их хранить в виде С переменных но хранящихся в регистрах.

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

Цитата(singlskv @ Sep 23 2007, 02:21) *
Ну лень было придумывать и писать какой-нить пример где С++ сольет,
вот и взял первое что под руку подвернулось smile.gif
Тока давайте сразу же уточним что под С++ я подразумеваю хотя бы
использование классов, разницу в процедурной реализации на С и С++ рассматривать просто
безсмысленно...

Так мы сравниваем С vs. C++ или асм (хотя и в фантике из синтаксиса С) vs. С++? Давайте нормальный С код, а не хаки.


Цитата(SasaVitebsk @ Sep 23 2007, 00:17) *
Похоже надо просто садится и писать. Во всяком случае пробовать. А то по книжкам всё равно не дойдёт. smile.gif В книгах детали. Перебороть себя и начинать работать.

Истинно так! Сразу, конечно, не так все гладко будет получаться, как на словах, тут некоторая практика нужна (как и в любом деле), но через короткое время все придет. То самое "чувство объекта". После этого по-старому (по процедурному) уже думать вряд ли захочется. smile.gif

Цитата(singlskv @ Sep 23 2007, 04:13) *
Если нужно много достаточно быстрых ADC преобразований, то тогда
MSP c его 16 регистрами памяти ADC конечно рулит,
тока асм там точно будет нужен...

Не более, чем для AVR.

Цитата(singlskv @ Sep 23 2007, 04:13) *
Обязательствами я тоже не очень связан. smile.gif
Да, Вы правы, RET действительно присутствует, так что джиттер 4-1=3 такта.
Просто в первоначальной реализации, в момент возникновения прерывания, у меня были
команды максимум в 2 такта, но потом по некоторым причинам пришлось переделать и
вставить вызов функции.

Я что-то не пойму - в программе только одно прерывание? Других нет? Если есть еще прерывания, то про какие один-два-три-четые такта джиттера входа в данное прерывание может идти речь?


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
dxp
сообщение Sep 23 2007, 13:52
Сообщение #72


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



Цитата(SasaVitebsk @ Sep 23 2007, 00:17) *
А то по книжкам всё равно не дойдёт. smile.gif В книгах детали.

Дополнение по поводу книг. Обязательно почитайте Гради Буча (Grady Booch) "Объектно-ориентированные анализ и проектирование", там глава 2 "Объектная модель" и глава 3 "Классы и объекты" прямо как раз для вас написаны. Там все то, что я сказал расписано подробнейшим образом с хорошими примерами. Книжка хорошая, написана конкретно, читаеся легко.

А в книжках по С++ действительно львиная доля посвящена деталям языка. Видимо имеется в виду, что читатель с общими концепциями объектного и объектно-ориентированного программирования уже знаком. Хотя в основополагающем труде Б.Страуструпа "Язык программирования С++" целый раздел посвящен вопросам проектирования и вообще подходу к разработке ПО. Очень интересная глава даже если не быть большим специалистом по ++. Глава, кажется, 11, называется "Проектирование и развитие". Там тоже рассматриваются все эти вопросы, причем непосредственно в контексте С++. Настоятельно рекомендую.


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
singlskv
сообщение Sep 23 2007, 14:35
Сообщение #73


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(dxp @ Sep 23 2007, 12:59) *
А если писать на С, то надо предоставить компилятору оптимизировать, включив соответствующую оптимизацию.
Хорошо, почти убедили, конечно это в некоторой степени хак,
НО, без этого хака производительность всей проги будет существенно ниже.
Компилятору таки нужно помагать делать правильный код.
Цитата
Так мы сравниваем С vs. C++ или асм (хотя и в фантике из синтаксиса С) vs. С++? Давайте нормальный С код, а не хаки.
Давайте поступим чуть по другому, Вы приведете пару примеров своего кода
на С++(как минимум с классами) для обслуживания прерываний(я так понимаю что Вы этим пользуетесь ?), ну и мы обсудидим как это можно было бы написать на С.
Дело в том что в прерываниях я никогда не использовал С++ код и мне сложно даже
предположить вариант такого использования при котором я получу какой-то выигрыш...
Цитата
Не более, чем для AVR.
Честно говоря не понял что Вы имели в виду под "не более".
Цитата
Я что-то не пойму - в программе только одно прерывание? Других нет? Если есть еще прерывания, то про какие один-два-три-четые такта джиттера входа в данное прерывание может идти речь?

Да, в этой проге только одно прерывание, все остальное реализуется поллингом,
т.е. обмен с внешней переферией по SPI, запись в EEPROM и быстрый обмен по i2c в режиме slave...
Так что с джиттерами там все точно smile.gif

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


Цитата(zltigo @ Sep 23 2007, 02:22) *
Синхронность в данном случае дело абсолютно темное, поведение будет зависеть от сдвига и без знания потрохов судить о поведении невозможно.
zltigo, не юлите, даташит нам дает однозначный ответ на этот вопрос, джиттер
начнет возникать тока в момент непопадания момента прерывания на однотактовую команду.
Go to the top of the page
 
+Quote Post
dxp
сообщение Sep 23 2007, 16:10
Сообщение #74


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



Цитата(singlskv @ Sep 23 2007, 21:35) *
Хорошо, почти убедили, конечно это в некоторой степени хак,
НО, без этого хака производительность всей проги будет существенно ниже.
Компилятору таки нужно помогать делать правильный код.

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

Цитата(singlskv @ Sep 23 2007, 21:35) *
Давайте поступим чуть по другому, Вы приведете пару примеров своего кода
на С++(как минимум с классами) для обслуживания прерываний(я так понимаю что Вы этим пользуетесь ?), ну и мы обсудим как это можно было бы написать на С.

Да что вы привязались к этим прерываниям? smile.gif Свет на них, что-ли, клином сошелся? smile.gif Ну, использую, ну и что? По эффективности это примерно так же, как и на С, и нет причин почему бы было по-другому. Если обработчик прерываний входит в класс в качестве функции-члена, то он является статической функцией-членом, ибо по-другому просто и быть не может. А статическая функция-член класса - это по сути и по уровню реализации та же самая обычная глобальная функция с той лишь разницей, что:

1) определена она в пространстве имен класса;
2) имеет доступ к закрытым (private) членам своего класса.

Т.е. удобство главным образом состоит в поддержке инкапсуляции и абстракции - объект, содержащий внутри себя средства обработки событий, поступающих через это прерывание, остается целостным, его реализация снаружи не видна, общение с ним реализуется только через интерфейс (public члены). Реализация же прерывания в виде статической функции-члена по эффективности ровно та же, что и при реализации с помощью обычной функции.

Цитата(singlskv @ Sep 23 2007, 21:35) *
Дело в том что в прерываниях я никогда не использовал С++ код и мне сложно даже
предположить вариант такого использования при котором я получу какой-то выигрыш...

По эффективности кодогенерации никакого выигрыша по сравнению с С не получится, об этом никто и не говорил. А в смысле логической структуры программы выигрыш несомненно есть - см предыдущую реплику.

Короче. Дискуссия вокруг да около меня что-то уже утомила, поэтому "раскрою карты" (скажу прямо):
  1. основой эффективного писания на С является интенсивное использование составных типов данных (массивы, структуры), указателей, адресной арифметики;
  2. исходя из этого, для того чтобы С код эффективно "ложился" на аппаратуру процессора, от последнего требуются средства поддержки косвенной адресации и адресной арифметики (аппаратные указатели, индексные регистры, режимы обращения со смещением и т.д.);
  3. ключевым понятием С++ является класс;
  4. механизм работы с представлением объектов классов осуществляется на основе указателя this, который содержит адрес "структуры" членов-данных класса;
  5. из этого следует, что на любом процессоре, который имеет сколько-нибудь достаточно развитые средства косвенной адресации и адресной арифметики, код С++ получится по эффективности таким же, как и на С - близким к написанному вручную (имеется в виду код общего назначения - разного рода процессорно-зависимые навороты (типа multifunction instructions), реализуемые на асме, не рассматриваются);
Т.е. класс как таковой не несет в себе ничего такого, что бы нивелировало эффективность кодогенерации по сравнению с С. Вот что я и имел в виду на протяжении всего своего участия в данной теме. Вплоть до того, что если, скажем, компилятору известен адрес объекта класса на этапе компиляции, то ничего ему не мешает сгенерировать прямое (а не косвенное) обращение к члену-данному, если оное в конкретном случае оказывается эффективнее.


Цитата(singlskv @ Sep 23 2007, 21:35) *
Честно говоря не понял что Вы имели в виду под "не более".

Ну, вы упомянули, что для MSP430 потребуется асм для достижения эффективности, на это я и высказался, что не более, чем для AVR. При равной тактовой MSP430 на обработке данных быстрее, чем AVR. У MSP430 медленнее обращение по шинам из-за его фон Неймановости, но за счет 16-разрядности и более прямому ядру он обходит AVR. Только прошу тут тему AVR vs MSP430 не развивать, не топик тут это, да и высказывался я уже подробнейшим образом на эту тему, анализируя "кривые" моменты ядра AVR. Повторять не хочется.

Цитата(singlskv @ Sep 23 2007, 21:35) *
Да, в этой проге только одно прерывание, все остальное реализуется поллингом,
т.е. обмен с внешней переферией по SPI, запись в EEPROM и быстрый обмен по i2c в режиме slave...
Так что с джиттерами там все точно smile.gif

Ясно. Случай опять же вырожденный. Все построено в угоду одному источнику поступления данных. IMHO, если в программе нужно ловить каждый такт (т.е. это значимо), то тут явно что-то не то на уровне проекта. Исключением является случай, когда тираж изделий составляет десятки тысяч и при этом стоимость процессора заметно "весит" в BOM, т.ч. оптимизация "производительность/цена" выходит на первый план т.к. экономия нескольких центов уже дает заметный экономический эффект.

Цитата(singlskv @ Sep 23 2007, 21:35) *
P.S. Да, и если не сложно, дайте ссылочку про использование С++ для драйверов и
кода ядра линух, интересно оценить почему и зачем они там С++ использовали.

В линухе не силен, но встречал людей на просторах FIDO (в частности в эхах su.c-cpp и ru.cpp), которые успешно писали драйвера для видны (vxd и sys) и линукса на С++. Это не удивило, т.к. объективных препятствий этому нет.


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
singlskv
сообщение Sep 23 2007, 17:20
Сообщение #75


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(dxp @ Sep 23 2007, 20:10) *
То, что компилятору надо помогать, согласен. Но не с помощью хаков.
Ну давайте четко определимся, настоящий хак там был только в одном моменте, это
несохранение SREG за ненадобностью в этом коде...
Цитата
Если без хака не обойтись, это серьезный повод задуматься о применении асма в данном случае. А компилятору надо помогать предназначенными для этого средствами - рулить оптимизацией, а самое главное - использовать эффективные алгоритмы. Низкоуровневую оптимизацию надо предоставить делать компилятору. Программисту следует заниматься оптимизацией на уровне алгоритма - это то, что компиляторы делать достаточно эффективно пока не очень умеют. А уж по регистрам распихать и оптимизировать работу с ними - прямая прерогатива компилятора.
Пример ?
Цитата
Да что вы привязались к этим прерываниям? smile.gif Свет на них, что-ли, клином сошелся? smile.gif Ну, использую, ну и что? По эффективности это примерно так же, как и на С, и нет причин почему бы было по-другому. Если обработчик прерываний входит в класс в качестве функции-члена, то он является статической функцией-членом, ибо по-другому просто и быть не может. А статическая функция-член класса - это по сути и по уровню реализации та же самая обычная глобальная функция с той лишь разницей, что:
Да вроде с прерываний то все и началось smile.gif
Цитата
Я просто заметил что в прерываниях функциональность С++ обычно не используется...
Т.е. удобство главным образом состоит в поддержке инкапсуляции и абстракции - объект, содержащий внутри себя средства обработки событий, поступающих через это прерывание, остается целостным, его реализация снаружи не видна, общение с ним реализуется только через интерфейс (public члены). Реализация же прерывания в виде статической функции-члена по эффективности ровно та же, что и при реализации с помощью обычной функции.
Вот собственно об этом и была речь, и отсутствие С++ кода для работы в прерываниях тоже
о чем то говорит, нету кода, не о чем спорить...

Цитата
Ну, вы упомянули, что для MSP430 потребуется асм для достижения эффективности, на это я и высказался, что не более, чем для AVR. При равной тактовой MSP430 на обработке данных быстрее, чем AVR. У MSP430 медленнее обращение по шинам из-за его фон Неймановости, но за счет 16-разрядности и более прямому ядру он обходит AVR. Только прошу тут тему AVR vs MSP430 не развивать, не топик тут это, да и высказывался я уже подробнейшим образом на эту тему, анализируя "кривые" моменты ядра AVR. Повторять не хочется.
дык вроде никто и не спорит, про асм было упоминание тока в том смысле, что если
нужно бысто, то и асм там будет...
Цитата
В линухе не силен, но встречал людей на просторах FIDO (в частности в эхах su.c-cpp и ru.cpp), которые успешно писали драйвера для видны (vxd и sys) и линукса на С++. Это не удивило, т.к. объективных препятствий этому нет.
Дык может и писали, тока в майнстрим исходниках такого почему-то не наблюдал,
таки все таки почему???
Go to the top of the page
 
+Quote Post

9 страниц V  « < 3 4 5 6 7 > » 
Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 01:47
Рейтинг@Mail.ru


Страница сгенерированна за 0.01589 секунд с 7
ELECTRONIX ©2004-2016