ICC AVR и стpоки

Oleksandr Redchuk wrote to "Harry Zhurov" snipped-for-privacy@online.nsk.su> on Tue, 23 Sep 2003 08:22:36 +0000 (UTC):

[...]

HZ>> { HZ>> if(slon.IsTrue()) y = 1; HZ>> } HZ>> // -------------------------------------

HZ>> main: HZ>> 9100.... LDS R16,(slon + 2) HZ>> 2300 TST R16 HZ>> F031 BREQ ??main_0 OR> В C-шном варианте это выглядело бы как OR> rcall SlonIsTrue OR> tst r16 OR> breq OR> либо call для мега16 и выше. Т.е. inline не короче.

Как это не короче? В сишном варианте еще есть тело функции, где этот самый lds и ret. Т.е. сишный вариант длиннее на [r]call и ret. И плюс время выполнения.

OR> А если там проверка битового флага в поле, то инлайновый вариант OR> ещё толще будет.

Да с чего это? Я еще понимаю, тип bool вносит оверхед, поэтому нужно еще подумать, стоит ли его применять, но инлайн всегда короче неинлайна на инструкции вызова и возврата, как минимум! А иногда еще есть дополнительный выигрыш от того, что не нужно копировать данные при передаче аргументов, чтобы выполнить соглашения о вызове - в инлайне компилятор ничего копировать не должен и распределяет аргументы как выгодно.

[...]

OR> Ну нет у меня таких задач, где C++ "аж пыщыть" как _нужен_. OR> А ты пытаешься доказать, что его _можно_и_нужно_ применять и OR> для простых задач. А я говорю, что его можно применять _И_ для OR> простых задач, если без него всё равно не жить, а так -- нет смысла, OR> разве что из любопытства или идейных соображений.

А я пытаюсь донести еще более простую мысль: вот есть компилятор, генерит хороший код, оверхеда особого нет - субъективно он даже не заметен, - ну, и чего бы не использовать инструмент? Я ж не призываю все бросить, и начать из идейных или еще каких-нибудь соображений!? Но когда есть Жигуль и Тойота, почему бы не ездить на последней? Она не хуже! Бензина жрет (в среднем) в пределах 10% больше, а ездит быстрее, и комфортнее на ней! В крайнем случае она может и как Жигуль ездить. Аргумент: "А мне не надо такую тачку, я и на Жигулях доеду нормально!" в этой ситуации выглядит смешно.

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

...so long!

### Есть книги, которые приятно взять в руки и... рвать, рвать, рвать!

Reply to
Harry Zhurov
Loading thread data ...

Wed Sep 24 2003 18:34, Harry Zhurov wrote to Yuriy K:

HZ>>> Во-первых, при обращении к переменной, инкапсулированной в модуле HZ>>> (единице трансляции), придется либо делать ее открытой, либо вводить HZ>>> функцию доступа.

YK>> Либо вводить макрос-псевдофункцию для доступа

HZ> Вот именно, что псевдо!

Да хоть горшком назови, лишь бы работало.

YK>> и эмулировать пространства имен префиксами.

HZ> Hе смеши!

Убедительно. :) Hа самом деле разумное применение static и префиксов в программе помогает сделать ее сопровождаемой.

YK>> Пример: YK>> extern U8 rem_oops; YK>> #define rem_set_oops(val) (rem_oops = val) YK>> #define rem_get_oops() rem_oops YK>> Кстати, это будет эффективней чем С++.

HZ> Hе будет! Уверен, сам догадаешься, почему.

Да, inline поможет, убедил.

HZ> А ты, видимо, макросы любишь?

Hет. Просто иногда без них не обойтись.

YK>> Hе понял. Как это без потери эффективности? YK>> Для доступа к защищенной переменной на С++ придется использовать YK>> функцию - член класса. YK>> Для доступа к static переменной на С придется использовать функцию.

YK>> Где потеря эффективнсти?

HZ> А ты про inline функции что-нибудь слышал? Вот и подумай, есть HZ> разница между вызовом функции и встраиванием тела функции в точку вызова. HZ> HINT: встраиваемая функция ведет себя как макрос, только обеспечивает, в HZ> отличие от последнего, контроль типов, области видимости и проч.

Убедил, потери эффективности не будет. Выигрыша тоже. (inline vs. макрос).

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

HZ>>> В итоге получил под дюжину HZ>>> исходных файлов и примерно столько же заголовков. HZ>>> Проект тогда был около 8 кбайт (прошивка).

YK>> И всего-то дюжина файлов. :-))) YK>> 28 *.с + 5 *.asm + 38 заголовков для проекта на 16К кода. Hикаких YK>> проблем. IMHO это больше зависит от личных пристрастий программиста, не YK>> более того. Я, например, не могу сказать чей подход правильней.

HZ> 71 исходник!! Hа таком проекте!! Без комментариев!.. (Hе знаю, как в HZ> смайликах обозначается офигение)

Ж8-0, например :-) Hаверно и другие варианты есть.

HZ> Поди еще и батником собираешь?

IARской IDE. Впрочем можно было бы и батником, разница небольшая. Как справедливо заметил Редчук, в промежутках между компилированием и прошивкой полезно немного думать. :-Р Хотя обычно и лень...

HZ> И еще есть объективная причина: много мелких файлов плохо поддаются HZ> оптимизации, с которой компилятор хорошо справляется о. Особенно это заметно при HZ> оптимизации по размеру.

Мне размера флэша за глаза хватает. Пока запас есть раза в три-четыре, в новых контроллерах будет еще больше, т.к. надо переходить на новые MCU, где флеша меньше 64К не бывает.

HZ> И если уж тут проценты оверхеда плюсов вылавливают,

_Я_ не вылавливаю. Оверхед процентов в тридцать по скорости и два раза по размеру _меня_ волнует слабо. Критичные куски можно и на асме написать.

Вопрос в точности высказываний. Если сказано, что есть - надо доказать что есть. Если сказано, что нет - надо доказать что нет.

HZ>>> Таким образом, (возвращаясь к исходной точке обсуждения) на С можно HZ>>> пытаться проектировать программу в С++ном стиле только путем HZ>>> размножения исходных файлов, что тащит за собой неудобство в работе и HZ>>> оверхед.

YK>> Извини, но я не вижу ни неудобства, ни оверхеда.

HZ> Если 71 исходник на таком не очень большом проекте не вызывает HZ> неудобства, то комментарии излишни.

Еще раз. У _меня_ не вызывает. У кого-то может вызывать. Это характеристика программиста, а не подхода. Причем характеристика не "плохой-хороший", а просто "разный".

HZ> А оверхед возникает из-за вызова HZ> интерфейсных функций - во-первых, на вызов и возврат, во-вторых, если HZ> есть аргументы, то и на копирование аргументов, хоть это проявляется не HZ> всегда. Т.ч. С тут пролетает.

#define тебе поможет.

HZ>>> Поэтому реально, afaik, придерживаются компромисса - пытаются HZ>>> рассовать по файлам наиболее взаимосвязанное, стремясь минимизировать HZ>>> количество файлов.

YK>> Hе надо минимизировать число файлов. Места в директории всем хватит. :)

HZ> Любопытный критерий!

Дык!

YK>> P.S. Я ничего не имею против С++, хороший и полезный язык.

Могу только повториться. Я считаю, что С++ лучше и удобнее С хотя бы потому, что С++ включает в себя С, поэтому никак не может быть хуже.

YK>> Hо и каких-либо особенных преимуществ по сравнению с _хорошо_ написанной ^^^^^^^^^^^^^^^^^^^^^ YK>> программой на С тоже не усматриваю.

HZ> Сколько программ ты написал на С++? Аналогичных тем, которые до этого HZ> писал на С? Hу, чтобы сравнивать/усматривать?

Hа микроконтроллеры - ни одной. Под РС - десяток-другой написал.

WBR, Юрий.

Reply to
Yuriy K

Alexey Boyko wrote to "Harry Zhurov" <Harry Zhurov on Tue, 23 Sep 2003 13:09:20

+0400:

AB> 22 Sep 03 20:44, you wrote to me:

HZ>>>> вполне работоспособен, хотя это и грязный хак, имхо. С не-POD HZ>>>> типом такое не пройдет. AB>>> Почему? HZ>> Что почему? Почему грязный хак?

AB> Вообще-то я спрашивал почему не пройдет.

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

HZ>> Да потому, что действует в обход HZ>> системы типов и компилятор тут не может проверить соответствует ли HZ>> адресуемая память типу объекта, к которому приводится.

AB> В приведенном тобой примере - пройдет.

HZ>> И в случае HZ>> неправильного приведения получишь безобразный баг во всей красе.

AB> Hо ты сделал правильное приведение, не так ли?

Это слишком простой пример. А представь себе, что копирование производится в одной единице трансляции, а приведение в другой. Тут ошибиться не так уж сложно. И компилятор уже ничем не поможет. Поэтому это и есть хак. Хак - не баг, работать оно, возможно, и будет, а, возможно, и нет. Язык и компилятор ничего не гарантируют, а ведь это их прямая обязанность - отслеживать по мере возможностей семантические ошибки.

...so long!

### Пришлите четыре крышечки от унитаза, и вы получите бесплатный рулончик туалетной бумаги.

Reply to
Harry Zhurov

Alexey Boyko wrote to "Harry Zhurov" <Harry Zhurov on Tue, 23 Sep 2003 13:26:52

+0400:

[...]

AB> Hа классах есть только один способ и оптимизировать там нечего. Только на AB> компилятор приходится надеятся.

С чего ты это взял?

AB>>> А в Си inline отменили? HZ>> А в Си inline не было от рождения! Только сейчас в С99 его, вроде HZ>> бы, включили. То, что это есть в любимом GCC,

AB> Повезло мне. А что в ИАР С нету inline?

В ИАР, как и положено сишному компилятору, встраиваемых функций нет.

...so long!

### Брюки важнее жены, потому что существует немало мест, куда можно пойти без жены.

Reply to
Harry Zhurov

Yuriy K wrote to Harry Zhurov on Tue, 23 Sep 2003 17:24:31 +0400:

[...]

HZ>> Т.е. сделать именно то, что на ++ получается нативно. HZ>> И после этого еще не считать ++ную модель лучшей, чем сишную!

YK> Стоп, стоп, стоп. Если мы хотим сравнивать С++ и С, то надо сравнивать YK> _аналогичные_ подходы.

HZ>> Hо и тут при таком подходе в С два недостатка.

HZ>> Во-первых, при обращении к переменной, инкапсулированной в модуле HZ>> (единице трансляции), придется либо делать ее открытой, либо вводить HZ>> функцию доступа.

YK> Либо вводить макрос-псевдофункцию для доступа

Вот именно, что псевдо!

YK> и эмулировать пространства имен префиксами.

Не смеши!

YK> Пример:

YK> --------------------------------------- YK> "rem.h" YK> --------------------------------------- YK> extern U8 rem_oops; YK> #define rem_set_oops(val) (rem_oops = val) YK> #define rem_get_oops() rem_oops YK> --------------------------------------- YK> --------------------------------------- YK> "rem.c" YK> --------------------------------------- YK> U8 rem_oops; YK> --------------------------------------- YK> --------------------------------------- YK> "bla-bla-bla.c" YK> --------------------------------------- YK> if(!rem_get_oops() && is_it_good_time()) YK> { YK> rem_set_oops(OOPS_TIME); YK> } YK> --------------------------------------- YK> Кстати, это будет эффективней чем С++.

Не будет! Уверен, сам догадаешься, почему.

А ты, видимо, макросы любишь?

HZ>> ++ предоставляет простой и логичный способ достичь защищенности HZ>> без потери эффективности.

YK> Hе понял. Как это без потери эффективности? YK> Для доступа к защищенной переменной на С++ придется использовать YK> функцию - член класса. YK> Для доступа к static переменной на С придется использовать функцию.

YK> Где потеря эффективнсти?

А ты про inline функции что-нибудь слышал? Вот и подумай, есть разница между вызовом функции и встраиванием тела функции в точку вызова. HINT: встраиваемая функция ведет себя как макрос, только обеспечивает, в отличие от последнего, контроль типов, области видимости и проч.

HZ>> Во-вторых, и в-главных, такой подход красиво выглядит для таких HZ>> достаточно больших и законченных модулей, как описанный UART, когда для HZ>> него можно выделить отдельный файл. А что делать, когда модулей много и HZ>> они не такие крупные и функционально законченные? Каждому отдельный файл?

YK> Да. Я именно так и делаю.

HZ>> Делал я так! Именно пытался растолкать модули по разным файлам, помещая в HZ>> каждый не более двух-трех (в среднем). В итоге получил под дюжину HZ>> исходных файлов и примерно столько же заголовков. HZ>> Проект тогда был около HZ>> 8 кбайт (прошивка). Впоследствии этот же проект развивался далее, и HZ>> программа была переписана под ... Все удобно разместилось в трех файлах HZ>> при размере (прошивки) около 12 кбайт.

YK> И всего-то дюжина файлов. :-))) YK> 28 *.с + 5 *.asm + 38 заголовков для проекта на 16К кода. Hикаких проблем. YK> IMHO это больше зависит от личных пристрастий программиста, не более того. YK> Я, например, не могу сказать чей подход правильней.

71 исходник!! На таком проекте!! Без комментариев!.. (Не знаю, как в смайликах обозначается офигение)

Поди еще и батником собираешь?

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

HZ>> Таким образом, (возвращаясь к исходной точке обсуждения) на С можно HZ>> пытаться проектировать программу в С++ном стиле только путем размножения HZ>> исходных файлов, что тащит за собой неудобство в работе и оверхед.

YK> Извини, но я не вижу ни неудобства, ни оверхеда.

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

[...]

HZ>> Поэтому реально, afaik, придерживаются компромисса - пытаются HZ>> рассовать по файлам наиболее взаимосвязанное, стремясь минимизировать HZ>> количество файлов.

YK> Hе надо минимизировать число файлов. Места в директории всем хватит. :)

Любопытный критерий!

YK> Hадо названия давать осмысленные.

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

HZ>> Hо и того формализованного способа проектирования, который возможен в HZ>> С++, тут уже нет! О чем и речь.

YK> Да, заставить программистов писать код правильно - непростая задача, увы.:( YK> Возможно с применением классов это сделать проще, хотя и не факт

YK> P.S. Я ничего не имею против С++, хороший и полезный язык. YK> Hо и каких-либо особенных преимуществ по сравнению с _хорошо_ написанной YK> программой на С тоже не усматриваю.

Сколько программ ты написал на С++? Аналогичных тем, которые до этого писал на С? Ну, чтобы сравнивать/усматривать?

...so long!

### ""Хоть одним глазком взгляну на Париж..." - мечтал Кутузов." (с) из школьного сочинения.

Reply to
Harry Zhurov

Hello, Harry Zhurov !

Даже если это и так (в чем я лично ну очень сомневаюсь), переносимость C++ программы на другой кристалл гораздо ниже чем С по той причине, что С есть для всех, а С++ по сути только для AVR.

Она не хуже, но она в несколько раз дороже стоит...

С уважением, Дима Орлов.

Reply to
Dima Orlov
23-Sep-03 14:26 Alexey Boyko wrote to Oleksandr Redchuk:

HZ>>> 9100.... LDS R16,(slon + 2) HZ>>> 2300 TST R16 HZ>>> F031 BREQ ??main_0 OR>> В C-шном варианте это выглядело бы как OR>> rcall SlonIsTrue OR>> tst r16 OR>> breq OR>> либо call для мега16 и выше. Т.е. inline не короче. OR>> А если там проверка битового флага в поле, то инлайновый вариант OR>> ещё толще будет.

AB> А если подумать? [...] AB> А во вторых, ты не учел тот факт, что вызов функции сразу же делает AB> невалидными половину регистров, в которых могло быть что-то полезное AB> и потребует повторную загрузку. Ой, ну да, это я сильно привык к KeilC51 global register optimisation :-) В этих условиях привычные #define (вместо inline) оказалось в очень многих случаях выгодно заменить на подпрограммы, возвращающие результат проверки в carry (кстати, было бы весьма неплохо и для AVR - в C или в T возвращать bit_bool :-). Так что в данном случае надо уточнять "по месту".

AB> Можно, конечно, попробовать сделать функцию просто static, и проверить AB> будет ли компилятор смотреть, какие регистры портит вызываемая функция. Кажется, пока не умеет. Да, точно не умеет - в одном месте два уарта (аппаратный и софтовый) вызывают из обработчиков прерываний подпрограммы заталкивания байта в буфер (с раскруткой SLIP) и взятия следующего байта бля передачи (с подстановкой SLIP). Подпрограммы объявлены выше обработчиков как static и сам больше никого не вызывают. Обработчики делают push/pop всем регистрам, которые имеет право испортить "обычная" подпрограмма, хотя на самом деле там и половины их не испорчено.

wbr,

Reply to
Oleksandr Redchuk
23-Sep-03 13:14 Harry Zhurov wrote to Oleksandr Redchuk:

HZ>>> void uartInit(BYTE* Rx_buf, HZ>>> BYTE Rx_size, HZ>>> BYTE* Tx_buf, HZ>>> BYTE Tx_size, HZ>>> BYTE Baud_rate); OR>> Я не понял - почему тут куча параметров, а у конструктора OR>> ниже только baud rate? Значит, это _разные_ по поведению OR>> системы, если там конструктор распределяет себе буфера по своему OR>> усмотрению.

HZ> По функциональности одинаковые. Просто в сишном варианте все сделано Нет. Разные. В С-шном варианте с самого "пользовательского" уровня можно произвольно задать размещение и размер буферов, а в C++ - ном эти вещи забиты где-то внутри реализации.

HZ> традициях С: работа с аппаратным UART'ом, кольцевые буфера, функциональность HZ> протокола обмена пакетами и прочее "живет" отдельно, и весь модуль HZ> представляет HZ> собой конгломерат этих частей. В плюсатом варианте все эти детали HZ> инкапсулированы внутри класса. Соответственно, на С вызывается функция, Точно так же инициализацию буферов фиксированного размера можно сделать внутри С-шной функции и передавать ей только скорость. Или у тебя конструктор через 4-е измерение догадывается, гди и какого размера ты хотел сделать буфера. Нет? Фиксированные распределяет? Ну тогда и C-шному разреши фиксированные распределять.

HZ>>> BYTE UART_block_buf[BLOCK_BUFFER_SIZE]; OR>> Опять - в "классовой" версии буфер из воздуха взялся? OR>> Всё равно где-то кто-то его распределяет.

HZ>>> что нужно держать в голове) не выглядит "исчезающе малой"!!! OR>> Ну так не показывай наружу всё! OR>> На то и существует static в C, чтобы видимость имён ограничить OR>> файлом, в котором они заданы.

HZ> Все это так. И в данном случае, это, конечно, выход для С. И все это HZ> (объявление внутренних программных элементов статическими) попытка HZ> сделать по ++ному. :-))))))))))))))))))))))))))))) Ну извини, развеселил. Если в C объявление как static переменных и функций, которые НЕ НУЖНО показывать наружу - это "попытка сделать по ++ному", то тогда мне только остаётся сказать, что в C++ то, что по умолчанию все члены класса - закрытые, это попытка сделать по-ассемблерному, так как там если не сказано по поводу метки public, то она невидима за пределами файла.

HZ> Т.е. сделать именно то, что на ++ получается нативно. И после HZ> этого еще не считать ++ную модель лучшей, чем сишную! И необходимость писать в классах слова private - это то, что на ассемблере получается нативно.

HZ> Таким образом, (возвращаясь к исходной точке обсуждения) на С можно HZ> пытаться проектировать программу в С++ном стиле только путем размножения HZ> исходных файлов, что тащит за собой неудобство в работе и оверхед. Если Это не есть "попытка проектировать в C++ном стиле".

OR>> Да нет, если стековый кадр нужен, то в прологе порождается OR>> frame pointer на Y и дальше всё "как обычно". Если стековый кадр не OR>> нужен, то Y используется как хочется.

HZ> А как тогда быть с прерываниями? Т.е. вот вошли в функцию, скопировали HZ> SP в HZ> Y, начали использовать Y, и тут - бац! - прерывание! Какой поинтер будет HZ> использоваться в прерывании? Если прерыванию надо, то оно себе сделает, если не надо - делать не будет. Не понимаю, в чём проблемы, что тебе непонятно. Это аналогично push bp / mov bp,sp / sub sp,8 на 80x86, вместо bp идёт Y, sp как sp.

HZ>>> остальной части абзаца комментарий следующий: HZ>>> В энный раз повторяю: все зависит от конкретных условий!!! OR>> О чём и разговор - в огромном количестве "конкретных условий" OR>> за C++ могут быть только два аргумента - "не сбивать руку" OR>> и "очень уж эта мысля понравилась". Остальные расписания "плюсов плюсов" OR>> как-то мало в тех "конкретных условиях" дают.

HZ> Кому как... Но поскольку все уже высказались, то и... закончим, HZ> пожалуй?! Фф-ф-у-у-ухххх :-)

HZ>>> передаче более двух, то это уже повод задуматься о том, нет ли ошибки HZ>>> проектирования; OR>> memcpy(dst, src, len);

HZ> Весьма нечастая низкоуровневая библиотечная функция. Количество ее EEwrite( offset, *pbuf, len); // EEread, EEverify RTCwrite( offset, *pbuf, len); // read, vеrify SendPacket(type, *pdata, len); DisplayInt(position, value, digits); // это у меня для 7-сегментника CompareDates( struct date *da, struct date *db, u08 len); (сравнение дат на раньше/равно/позже, len - это глубина сравнения -- год, год и месяц, .... до секунд включительно, _одним_ operator< эту функцию не заменить). fseek(*stream, offset, whence) fwrite(*ptr, itemsize, items, *stream), в конце концов.

HZ> неприемлемо для низкоуровневого кода). При прочих равных ей лучше HZ> предпочесть HZ> нечто более высокоуровневое и безопасное вроде операторов присваивания Угу. Остаётся только забабахать EEstream << pos(offset) << record; и для каждого типа записей в EEPROM написать отдельный operator<< Спасибочки.

HZ>>> если больше трех, то это причина задуматься о том же; OR>> AT45D_write( chip_no, offset, buf, len);

HZ> Да, а у меня:

HZ> TDataFlash::ReadBuffer(word addr, byte N); HZ> TDataFlash::ReadMemory(word PageAddr, word ByteAddr); Ты тут сделал как бы с двумя аргументами, но либо это синглет для работы с одним чипом (и эти функции могут быть даже статические), либо (я-то говорил про несколько чипов!) на каждый чип надо заводить экземпляр класса и chip1.ReadBuffer() и один из аргументов функции таки приписан слева.

HZ> А если два чипа, то и тем более классы рулят! :) Заводишь два HZ> объекта, при И вместо того, чтобы передать в функцию доступа индекс чипа (один байт) и не заводить никаких переменных в ОЗУ -- передавать в функцию доступа указатель (this. не ты, не ты. компилятор. но код всё равно есть) на объект в ОЗУ, который там надо ещё завести.

HZ> Блин, я с этой дискуссией никак не могу толком взяться за изучение HZ> gcc (известно для чего ;-)) :-))) Мне тоже есть что делать, кстати :-)

wbr,

Reply to
Oleksandr Redchuk
23-Sep-03 12:50 Boris Popov wrote to Oleksandr Redchuk:

BP> -O2 -Wa,-ahlms=gcc161/main.lst BP> -g -mmcu=atmega161 -W -Wall -Wstrict-prototypes -funsigned-char BP> -funsigned-bitfields -fpack-struct -fshort-enums -finline-functions А зачем ты ему на автомате разрешил решать -- какие функции инлайнить? Он при этом достаточно большие функции начинает инлайнить и при этом если они не объявлены как static -- ещё и не-inline копию оставляет. Проверь это место.

BP> GCC(1) параметры указанные выше, GCC(2) без -finline-functions. BP> Весь проект собранный GCC(1)/-Os - 17638, GCC(2)/-Os - 19442.

BP> Действительно, при оптимизации по размеру (ИАР оптимизировал BP> по скорости), соотношение намного лучше - 1.15. На досуге попробую BP> посмотреть, что еще можно поправить в коде или подкрутить в опциях.

Немного игрался.

-fnew-ra -- иногда уменьшает объём кода. Иногда сильно увеличиват. детально не исследовалось.

-fno-reorder-blocks -- как это ни странно, но в одном проекте 20 байт на фоне ~3KB уело. при том, что IAR на этом проекте давал всего байт

100 выиграша (1 файла с -s9, 2файла с -z9).

В этом проекте для gcc стоит -mcall-prologues, который ещё байт 50 экономит за счёт "вызова" подпрограмм для создания/удаления стекового кадра. Кстати, для SIGNAL()-функций он автоматически не использует call-prologues, несмотря на этот ключ, поэтому не нужно было указывать специальные ключи для файла с обработчиками прерываний (OC1A, ADC, UART), как для IAR.

Остальное практически не влияло (ничего не добавляло к -O2).

wbr,

Reply to
Oleksandr Redchuk
22-Sep-03 13:40 Alexey Boyko wrote to "Harry Zhurov" <Harry Zhurov:

OR>>> Я таки попробую (исключительно из любопытства) плюсы если не на OR>>> AVR, то на MSP HZ>> А что, для него уже оно появилось? G++, в смысле?

AB> Если ты не в курсе, то кодогенертор в gcc не знает ни про Си, ни про AB> Си++. AB> Он преобразует из некоторого абстрактного языка в ассемблер. Так что AB> если AB> написан кодогенератор для msp-430, то Си++ появляется как бы автоматически. AB> Hужно только в библиотеке некоторую поддержку дописать. Ну вот она-то, насколько я знаю, ещё и не написана.

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

AB> А в Си inline отменили? Ещё не все C-компиляторы для однокристалок поддерживают C99, в котором, afaik, inline появился. IAR C (не C++) про inline ничего не слышал.

HZ>> Про шаблоны и говорить нечего.

AB> Возьми avr-gcc. Только, насколько я помню - WinAvr с avrfreaks не собран AB> с Си++, так что придется самому собирать. Не с avrefreaks, а с winavr.sourceforge.net Уже с год как с C++ идёт.

wbr,

Reply to
Oleksandr Redchuk
22-Sep-03 12:31 Alexey Boyko wrote to Oleksandr Redchuk:

OR>>>> void UartInit(void) __attribute__ ((section(".init3"))) OR>>>> __attribute__ ((naked)); HZ>>> Т.е. нестандартные расширения? OR>> Да, нестандартные. OR>> Hо одинаковые для avr-gcc, msp430-gcc, arm-gcc, ..... :-)

AB> Ты уверен?

AB> То есть __attribute__ ((section)) есть во всех, Я это и имел ввиду -- нестандартные расширения языка.

AB> а вот секции .init[0..9] AB> есть только в avr-gcc, причем появились не так давно. А это касается запускалки.

AB> А arm-gcc вообщем-то сделан для arm-linux, а не для микроконтроллеров, и AB> стартап, мне например, пришлось вообще свой писать. И если тебе захочется, ты в запускалке себе сделаешь .init[0..9] и из C будешь распихивать инициализационный код куда надо. Разве не так?

wbr,

Reply to
Oleksandr Redchuk

В статье snipped-for-privacy@p4.f.n4624.z2.ftn> Alexey Boyko написал(а):

Нет, с моим кодом.

результаты 'wc -l соответсвующие-исходники' в студию.

Во 1-х, это зависит от целевой платформы, во 2-х, хоть я и провожу аналогию между поддержкой C++ для модулей ядра линукс и настоящей вделанной платформой, они все-таки отличаются. в 3-х, в отличие от g++, в случае ядра линукс, нужно прилагать немало усилий для обхода ограничений этой среды, использованию C++ активно сопротивляющейся, а потому там около половины объема исходников занимают всякие макросы и условия.

Reply to
Dmitry Fedorov

Oleksandr Redchuk wrote to "Harry Zhurov" snipped-for-privacy@online.nsk.su> on Wed, 24 Sep 2003 14:52:16 +0000 (UTC):

[...]

HZ>> Т.е. сделать именно то, что на ++ получается нативно. И после HZ>> этого еще не считать ++ную модель лучшей, чем сишную! OR> И необходимость писать в классах слова private - это OR> то, что на ассемблере получается нативно.

В классах писать private не надо - объявляешь приватное сразу, потом пишешь public для открытого и вуаля. :) Т.ч. все нативно. :))

[...]

HZ>> А как тогда быть с прерываниями? Т.е. вот вошли в функцию, скопировали HZ>> SP в HZ>> Y, начали использовать Y, и тут - бац! - прерывание! Какой поинтер будет HZ>> использоваться в прерывании? OR> Если прерыванию надо, то оно себе сделает, если не надо - делать не OR> будет. Не понимаю, в чём проблемы, что тебе непонятно.

Мне не понятно вот что: зашли в функцию, скопировали SP в Y, начали с ним работать - разместили в этой памяти локальные объекты, Y, ессно, модифицировался - TOS "уплыл" от исходного значения SP на величину размера локальных объектов + место под адрес возврата на случай прерывания/вызов функции. Теперь возникает прерывание, на входе снова берется SP и копируется в Y, и по той же схеме используется память стека. Но это та же самая память, которая уже используется в прерванной функции!? Вот если использовать для прерываний отдельный стек, то тогда, вроде, должно получиться.

[...]

HZ>> неприемлемо для низкоуровневого кода). При прочих равных ей лучше HZ>> предпочесть HZ>> нечто более высокоуровневое и безопасное вроде операторов присваивания OR> Угу. Остаётся только забабахать OR> EEstream << pos(offset) << record; OR> и для каждого типа записей в EEPROM написать отдельный operator<<

Зачем же так извращаться? :) У тебя же не этот убогий ЕС++, а нормальный С++ - один раз пишешь шаблон, и для любого нужного типа инстанцируешь объект. :))

OR> Спасибочки.

Welcome! :)))

...so long!

### Этот газ вызывает головные боли в мышцах и костях.

Reply to
Harry Zhurov
24-Sep-03 17:59 Harry Zhurov wrote to Oleksandr Redchuk:

HZ>>> SP × HZ>>> Y, ÎÁÞÁÌÉ ÉÓÐÏÌØÚÏ×ÁÔØ Y, É ÔÕÔ - ÂÁÃ! - ÐÒÅÒÙ×ÁÎÉÅ! ëÁËÏÊ ÐÏÉÎÔÅÒ ÂÕÄÅÔ HZ>>> ÉÓÐÏÌØÚÏ×ÁÔØÓÑ × ÐÒÅÒÙ×ÁÎÉÉ? OR>> åÓÌÉ ÐÒÅÒÙ×ÁÎÉÀ ÎÁÄÏ, ÔÏ ÏÎÏ ÓÅÂÅ ÓÄÅÌÁÅÔ, ÅÓÌÉ ÎÅ ÎÁÄÏ - ÄÅÌÁÔØ ÎÅ OR>> ÂÕÄÅÔ. îÅ ÐÏÎÉÍÁÀ, × ?Í ÐÒÏÂÌÅÍÙ, ÞÔÏ ÔÅÂÅ ÎÅÐÏÎÑÔÎÏ.

HZ> íÎÅ ÎÅ ÐÏÎÑÔÎÏ ×ÏÔ ÞÔÏ: ÚÁÛÌÉ × ÆÕÎËÃÉÀ, ÓËÏÐÉÒÏ×ÁÌÉ SP × Y, ×ÙÞÌÉ ÉÚ SP ÒÁÚÍÅÒ ÌÏËÁÌØÎÙÈ ÐÅÒÅÍÅÎÎÙÈ HZ> ÎÁÞÁÌÉ Ó ÎÉÍ ÒÁÂÏÔÁÔØ -

HZ> ÆÕÎËÃÉÉ. ôÅÐÅÒØ ×ÏÚÎÉËÁÅÔ ÐÒÅÒÙ×ÁÎÉÅ, ÎÁ ×ÈÏÄÅ ÓÎÏ×Á ÂÅÒÅÔÓÑ SP É õÖÅ ÍÏÄÉÆÉÃÉÒÏ×ÁÎÎÏÅ ÉÌÉ, ÅÓÌÉ ÎÅ ÍÏÄÉÆÉÃÉÒÏ×ÁÎÎÏÅ (ÎÅ ÕÓÐÅÌÉ), ÔÏ É ÐÅÒÅÍÅÎÎÙÅ × ÔÏÊ ÏÂÌÁÓÔÉ Å? ÎÅ ÒÁÚÍÅÝÅÎÙ.

HZ> Y, É ÐÏ ÔÏÊ ÖÅ ÓÈÅÍÅ ÉÓÐÏÌØÚÕÅÔÓÑ ÐÁÍÑÔØ ÓÔÅËÁ. îÏ ÜÔÏ ÔÁ ÖÅ ÓÁÍÁÑ HZ> ÐÁÍÑÔØ, ËÏÔÏÒÁÑ ÕÖÅ ÉÓÐÏÌØÚÕÅÔÓÑ × ÐÒÅÒ×ÁÎÎÏÊ ÆÕÎËÃÉÉ!? ôÙ ÞÔÏ, Å? ÎÅ ÒÁÚÂÉÒÁÌÓÑ ËÁË ÜÔÏ ÓÄÅÌÁÎÏ Õ MSP Ó ÏÄÎÉÍ ÓÔÅËÏÍ? îÕ É 80x86-ÏÅ (16-ÂÉÔÎÏÇÏ ÒÅÖÉÍÁ) push BP mov BP,SP sub SP,8 ; ÓËÁÖÅÍ, 8 ÂÁÊÔ ÌÏËÁÌØÎÙÈ ÐÅÒÅÍÅÎÎÙÈ Ñ ÕÖÅ ÐÉÓÁÌ ËÁË ÐÒÉÍÅÒ

HZ> ÷ÏÔ ÅÓÌÉ ÉÓÐÏÌØÚÏ×ÁÔØ HZ> ÄÌÑ ÐÒÅÒÙ×ÁÎÉÊ ÏÔÄÅÌØÎÙÊ ÓÔÅË, ÔÏ ÔÏÇÄÁ, ×ÒÏÄÅ, ÄÏÌÖÎÏ ÐÏÌÕÞÉÔØÓÑ. ä×Á ÓÔÅËÁ (ÄÁÎÎÙÈ É ÕÐÒÁ×ÌÅÎÉÑ) -- ÍÙÓÌØ ÄÏ×ÏÌØÎÏ ÎÅÐÌÏÈÁÑ. îÏ, Ó ÄÒÕÇÏÊ ÓÔÏÒÏÎÙ, ÔÒÅÂÕÀÝÁÑ ÂÏÌÅÅ ÁËËÕÒÁÔÎÏÇÏ ÒÁÓÐÒÅÄÅÌÅÎÉÑ ÐÁÍÑÔÉ -- ËÁÖÄÏÍÕ ÓÔÅËÕ ÎÁÄÏ ÄÁÔØ, É ËÁÖÄÏÍÕ ÞÔÏÂÙ È×ÁÔÉÌÏ. ó ÔÒÅÔØÅÊ - ÎÅÕÖÅÌÉ ÎÅÔ gcc ÄÌÑ sparc? á Õ ÎÅÇÏ, ÅÓÌÉ Ñ ÐÒÁ×ÉÌØÎÏ ÐÏÍÎÀ, ÓÒÁÚÕ ÐÏ ÖÉÚÎÉ Ä×Á ÕËÁÚÁÔÅÌÑ ÓÔÅËÁ.

wbr,

-- /* Oleksandr Redchuk, Brovary, Ukraine */ /* real '\x40' real '\x2E' kiev '\x2E' ua */

Reply to
Oleksandr Redchuk
24-Sep-03 14:34 Harry Zhurov wrote to Alexey Boyko:

AB>> ðÏ×ÅÚÌÏ ÍÎÅ. á ÞÔÏ × éáò ó ÎÅÔÕ inline?

HZ> ÷ éáò, ËÁË É ÐÏÌÏÖÅÎÏ ÓÉÛÎÏÍÕ ËÏÍÐÉÌÑÔÏÒÕ, ×ÓÔÒÁÉ×ÁÅÍÙÈ ÆÕÎËÃÉÊ ÎÅÔ.

ëÏÍÐÉÌÑÔÏÒÕ, ÓÏÏÔ×ÅÔÓÔ×ÕÀÝÅÍÕ

INTERNATIONAL STANDARD ISO/IEC ISO/IEC 9899:1999 Programming languages - C

inline ÉÍÅÔØ ÐÏÌÏÖÅÎÏ. õÖÅ 3 ÇÏÄÁ ËÁË.

wbr,

-- /* Oleksandr Redchuk, Brovary, Ukraine */ /* real '\x40' real '\x2E' kiev '\x2E' ua */

Reply to
Oleksandr Redchuk

Hello Harry.

24 Sep 03 21:59, Harry Zhurov wrote to Oleksandr Redchuk:

HZ>>> ô.Å. ÓÄÅÌÁÔØ ÉÍÅÎÎÏ ÔÏ, ÞÔÏ ÎÁ ++ ÐÏÌÕÞÁÅÔÓÑ ÎÁÔÉ×ÎÏ. é ÐÏÓÌÅ HZ>>> ÜÔÏÇÏ ÅÝÅ ÎÅ ÓÞÉÔÁÔØ ++ÎÕÀ ÍÏÄÅÌØ ÌÕÞÛÅÊ, ÞÅÍ ÓÉÛÎÕÀ! OR>> é ÎÅÏÂÈÏÄÉÍÏÓÔØ ÐÉÓÁÔØ × ËÌÁÓÓÁÈ ÓÌÏ×Á private - ÜÔÏ OR>> ÔÏ, ÞÔÏ ÎÁ ÁÓÓÅÍÂÌÅÒÅ ÐÏÌÕÞÁÅÔÓÑ ÎÁÔÉ×ÎÏ. HZ> ÷ ËÌÁÓÓÁÈ ÐÉÓÁÔØ private ÎÅ ÎÁÄÏ - ÏÂßÑ×ÌÑÅÛØ ÐÒÉ×ÁÔÎÏÅ ÓÒÁÚÕ, ÐÏÔÏÍ HZ> ÐÉÛÅÛØ public ÄÌÑ ÏÔËÒÙÔÏÇÏ É ×ÕÁÌÑ. :) ô.Þ. ×ÓÅ ÎÁÔÉ×ÎÏ. :))

ÔÅÍÎÉÛØ :) ÈÏpÏÛÉÊ ÓÔÉÌØ ××ÅpÈy pÁÚÍÅÓÔÉÔØ public, Á ÎÉÖÅ ÎÅÇÏ - private

Alexey

Reply to
Alexey Musin

Hello Vladimir.

24 Sep 03 18:35, Vladimir Vassilevsky wrote to Yuriy K:

VV> äÁ ÄÁÖÅ ÍÅÎÀÛÎÙÊ ××ÏÄ/×Ù×ÏÄ ÎÁ Ä×ÕÈÓÔÒÏÞÎÉË ÕÄÏÂÎÅÅ ÐÉÓÁÔØ ÎÁ ++.

ÔÙ ÐpÏ pÅÁÌÉÚÁÃÉÀ ÉÌÉ ÉÓÐÏÌØÚÏ×ÁÎÉÅ? ðpÏ pÅÁÌÉÚÁÃÉÀ ÄÅpÅ×Ï ÍÅÎÀ pÅÁÌÉÚyÅÔÓÑ Ó×ÑÚÎÙÍ ÓÐÉÓËÏÍ, ÐpÉÞÅÍ ÔyÔ ó/ó++/ÌÀÂÏÊ ÄpyÇÏÊ ÑÚÙË ? ðpÏ ÉÓÐÏÌØÚÏ×ÁÎÉÅ ÅÓÔØ ÎÁÂÏp ÍÏÄyÌÅÊ, ËÏÔÏpÙÍ Ñ ÐÏÌØÚyÀÓØ ÄÌÑ ×Ù×ÏÄÁ ÎÁ ÜËpÁÎ 16È4 öëé (ÎÁ ÓÁÍÏÍ ÄÅÌÅ ÉÎÆÁ ÐÏÓÙÌÁÅÔÓÑ ÞÅpÅÚ CAN × ÍÏÄyÌØ, Ë ËÏÔÏpÏÍy ÐÏÄËÌÀÞÅÎ öëé)

=== Begin Windows Clipboard === /* ÓÔÉÒÁÅÍ ÄÉÓÐÌÅÊ É ×Ù×ÏÄÉÍ ÓÔÁÔÉÞÅÓËÕÀ ÉÎÆÏÒÍÁÃÉÀ ÎÁ ÄÉÓÐÌÅÊ */ SsScrPutStr (" ÷ÅÒÓÉÑ ðï", 0, SCR_CONST_STR_FLG | SCR_DISP_CLR_FLG); SsScrPutStr (" "VERSION_STR, 0, SCR_POS_L2 | SCR_POS_P1 | SCR_CONST_STR_FLG); === End Windows Clipboard ===

çÌÁ×ÎÏÅ ÐpÏÂÌÅÍÁ × ++ ÄÌÑ ÍÅÎÑ - ÎÁÄÏ _ÐÏ-ÄpyÇÏÍy_ ÐpÏÅËÔÉpÏ×ÁÔØ. óÉ++ ÐÏËÁ ÎÅ ÐpÉÍÅÎÑÌ, ÎÏ ÔÁÍ ÅÓÔØ ×ËyÓÎÏÓÔÉ ×pÏÄÅ ÛÁÂÌÏÎÏ× (ÎÏ ÉÈ ÎÅÔ × EC++), inline, (pÅÖÅ ÎÁÄÏ ÄÅÌÁÔØ cast.

Alexey

Reply to
Alexey Musin

Hello "Harry.

24 Sep 03 17:34, you wrote to me:

AB>> ÷ÏÏÂÝÅ-ÔÏ Ñ ÓÐÒÁÛÉ×ÁÌ ÐÏÞÅÍÕ ÎÅ ÐÒÏÊÄÅÔ. HZ> ðÏÔÏÍÕ ÞÔÏ, ÎÁÐÒÉÍÅÒ, ÅÓÌÉ ÅÓÔØ ÏÂßÑ×ÌÅÎÎÙÊ ÐÏÌØÚÏ×ÁÔÅÌÅÍ HZ> ËÏÐÉÒÕÀÝÉÊ ÏÐÅÒÁÔÏÒ ÐÒÉÓ×ÁÉ×ÁÎÉÑ, ÔÏ ÜÔÏÔ ÏÐÅÒÁÔÏÒ ÐÏÄÒÁÚÕÍÅ×ÁÅÔ HZ> ÏÐÒÅÄÅÌÅÎÎÕÀ ÓÅÍÁÎÔÉËÕ HZ> ËÏÐÉÒÏ×ÁÎÉÑ, Á ÐÒÏÓÔÏÅ ÐÏÂÉÔÏ×ÏÅ ËÏÐÉÒÏ×ÁÎÉÅ ÉÍÅÅÔ ×ÐÏÌÎÅ ÏÐÒÅÄÅÌÅÎÎÕÀ HZ> ÓÅÍÁÎÔÉËÕ ËÌÏÎÉÒÏ×ÁÎÉÑ, ÞÔÏ ÐÏÚ×ÏÌÑÅÔ ÓÏÚÄÁ×ÁÔØ ÏÂßÅËÔÙ ÎÅÒÁÚÒÅÛÅÎÎÙÍ HZ> ÓÐÏÓÏÂÏÍ. éÌÉ ÅÓÌÉ ÅÓÔØ ÐÒÉ×ÁÔÎÙÅ ÐÏÌÑ, ÔÏ ÄÏÓÔÕÐ Ë ÎÉÍ ÄÏÌÖÅÎ ÂÙÔØ HZ> ÔÏÌØËÏ ÞÅÒÅÚ ÏÐÒÅÄÅÌÅÎÎÙÊ ÉÎÔÅÒÆÅÊÓ, É ÅÓÌÉ ÐÒÏÓÔÏ ÐÏÂÉÔÏ×Ï HZ> ËÏÐÉÒÏ×ÁÔØ, ÔÏ ÜÔÏ ÚÎÁÞÉÔ ÐÏÌÕÞÉÔØ Ë ÎÉÍ ÄÏÓÔÕÐ × ÏÂÈÏÄ ÓÉÓÔÅÍÙ ÔÉÐÏ×, HZ> ÞÔÏ ÅÓÔØ ÅÝÅ ÂÏÌÅÅ ÇÒÑÚÎÙÊ ÈÁË.

HÅ. HÅ ÔÁË. HÅ ÐÒÏÊÄÅÔ ÜÔÏ ÔÏÇÄÁ, ËÏÇÄÁ ÎÁ ÜÔÏÔ ÏÂßÅËÔ ÅÓÔØ ÓÓÙÌËÉ ÉÚ ÄÒÕÇÉÈ ÏÂßÅËÔÏ×, ×ÚÁÉÍÏÄÅÊÓÔ×ÕÀÝÉÈ Ó ÎÉÍ.

AB>> ÷ ÐÒÉ×ÅÄÅÎÎÏÍ ÔÏÂÏÊ ÐÒÉÍÅÒÅ - ÐÒÏÊÄÅÔ. AB>> HÏ ÔÙ ÓÄÅÌÁÌ ÐÒÁ×ÉÌØÎÏÅ ÐÒÉ×ÅÄÅÎÉÅ, ÎÅ ÔÁË ÌÉ?

HZ> üÔÏ ÓÌÉÛËÏÍ ÐÒÏÓÔÏÊ ÐÒÉÍÅÒ.

÷ÏÔ Ë ÎÅÍÕ Ñ É ÐÒÉÃÅÐÉÌÓÑ. ðÌÏÈÉÅ ÐÒÉÍÅÒÙ ÍÙ ÔÕÔ ×ÓÅ ÐÒÉ×ÏÄÉÍ. (É ÎÅ ÔÏÌØËÏ × ÜÔÏÍ ÔÒÅÄÅ)

HZ> á ÐÒÅÄÓÔÁ×Ø ÓÅÂÅ, ÞÔÏ ËÏÐÉÒÏ×ÁÎÉÅ HZ> ÐÒÏÉÚ×ÏÄÉÔÓÑ × ÏÄÎÏÊ ÅÄÉÎÉÃÅ ÔÒÁÎÓÌÑÃÉÉ, Á ÐÒÉ×ÅÄÅÎÉÅ × ÄÒÕÇÏÊ.

þÔÏ ÅÓÔØ ÅÄÉÎÉÃÁ ÔÒÁÎÓÌÑÃÉÉ?

Alexey

Reply to
Alexey Boyko

Hello "Harry.

24 Sep 03 17:34, you wrote to me:

AB>> HÁ ËÌÁÓÓÁÈ ÅÓÔØ ÔÏÌØËÏ ÏÄÉÎ ÓÐÏÓÏÂ É ÏÐÔÉÍÉÚÉÒÏ×ÁÔØ ÔÁÍ ÎÅÞÅÇÏ. AB>> ôÏÌØËÏ ÎÁ ËÏÍÐÉÌÑÔÏÒ ÐÒÉÈÏÄÉÔÓÑ ÎÁÄÅÑÔÓÑ. HZ> ó ÞÅÇÏ ÔÙ ÜÔÏ ×ÚÑÌ?

ru.embedded ÐÏÞÉÔÁÌ ;)

HZ> ### âÒÀËÉ ×ÁÖÎÅÅ ÖÅÎÙ, ÐÏÔÏÍÕ ÞÔÏ ÓÕÝÅÓÔ×ÕÅÔ ÎÅÍÁÌÏ ÍÅÓÔ, ËÕÄÁ ÍÏÖÎÏ HZ> ÐÏÊÔÉ ÂÅÚ ÖÅÎÙ.

;)

Alexey

Reply to
Alexey Boyko

Hello "Harry.

24 Sep 03 17:34, you wrote to me:

AB>> ðÏ ÉÎÄÅËÓÕ × ÍÁÓÓÉ×Å. ïÄÎÏÍÅÒÎÙÅ ÍÁÓÓÉ×Ù ÎÅ ÅÓÔØ ÞÅÍ-ÔÏ ÏÞÅÎØ AB>> ÓÌÏÖÎÙÍ É ÔÑÖÅÌÙÍ ÄÌÑ ÐÏÎÉÍÁÎÉÑ. HZ> á ÏÎÉ × ó/ó++ ÔÏÌØËÏ ÏÄÎÏÍÅÒÎÙÍÉ É ÂÙ×ÁÀÔ. int A[5][4] - ÜÔÏ ÔÏÖÅ HZ> ÏÄÎÏÍÅÒÎÙÊ ÍÁÓÓÉ× ÒÁÚÍÅÒÏÍ [5]*[4].

??? ÞÅÇÏ-ÔÏ ÔÅÂÑ ÎÅ × ÔÕ ÓÔÅÐØ ÐÏÎÅÓÌÏ.

AB>> á ÔÁË ÒÕËÁÍÉ ÎÕÖÎÏ ÏÐÉÓÙ×ÁÔØ ÒÁÚÎÙÅ ËÌÁÓÓÙ. åÓÌÉ × ÐÒÏÇÒÁÍÍÕ Ó AB>> ÍÁÓÓÉ×ÁÍÉ ÎÕÖÎÏ ÄÏÂÁ×ÉÔØ ÅÝÅ ÏÄÎÏ ÚÎÁÞÅÎÉÅ, ÎÕÖÎÏ ÐÒÏÓÔÏ ÕÄÌÉÎÎÉÔØ AB>> ÍÁÓÓÉ×Ù, HZ> HÅ, ÎÅ ×ÓÅ ÔÁË ÂÅÚÏÂÌÁÞÎÏ. ðÒÉÄÅÔÓÑ ÏÂßÑ×ÉÔØ ÆÕÎËÃÉÀ É ÐÏÍÅÓÔÉÔØ HZ> ÕËÁÚÁÔÅÌØ ÎÁ ÎÅÅ × _ÓÔÒÏÇÏ_ _ÏÐÒÅÄÅÌÅÎÎÏÅ_ ÍÅÓÔÏ × ÍÁÓÓÉ×Å, É ÎÅ ÄÁÊ HZ> âÏÇ ÏÛÉÂÉÔØÓÑ. á ÅÝÅ ÕÞÔÉ, ÞÔÏ ÆÕÎËÃÉÑ ÎÅ ÏÄÎÁ, ÉÈ ÎÅÓËÏÌØËÏ - × ÎÁÛÅÍ HZ> ÎÅÂÏÌØÛÏÍ ÐÒÉÍÅÒÅ ÉÈ ÂÙÌÏ ÔÒÉ. ô.Å. ÎÕÖÎÏ ÓÏÚÄÁÔØ ÔÒÉ ÆÕÎËÃÉÉ É HZ> ÐÏÍÅÓÔÉÔØ ÕËÁÚÁÔÅÌÉ ÎÁ ÎÉÈ × ÔÒÉ ÒÁÚÎÙÈ ÍÁÓÓÉ×Á ÐÏ ÏÄÉÎÁËÏ×ÏÍÕ HZ> ÉÎÄÅËÓÕ. ÷ÓÅ ÜÔÏ ÒÕËÁÍÉ. é ÎÅ ÏÛÉÂÉÔØÓÑ, Ô.Ë. ËÏÍÐÉÌÑÔÏÒ ÜÔÏ ÎÅ ÓÍÏÖÅÔ HZ> ÐÒÏ×ÅÒÉÔØ. ëÏÒÏÞÅ, ËÕÞÁ ÍÁÎÉÐÕÌÑÃÉÊ, ÔÒÅÂÕÀÝÁÑ ÐÒÅÄÅÌØÎÏÇÏ ×ÎÉÍÁÎÉÑ.

÷ÉÖÕ, ÔÙ ÏÞÅÎØ ÓÉÌØÎÏ ÚÁÐÌÀÓÏ×ÁÌÓÑ. HÉËÁËÉÈ ÆÕÎËÃÉÊ ÐÉÓÁÔØ Ñ ÎÅ ÐÒÅÄÌÁÇÁÌ. ÷ ÍÁÓÓÉ×ÁÈ max, min, delta Ñ ÐÒÅÄÌÁÇÁÌ ÈÒÁÎÉÔØ ÞÉÓÌÁ, Á ÎÅ ÁÄÒÅÓÁ ÆÕÎËÃÉÊ.

AB>> Á ÎÁ ó++ - ÓÏÚÄÁÔØ ÎÏ×ÙÊ ËÌÁÓÓ. óËÏÌØËÏ ÅÝÅ ÓÔÒÏË ÐÏÎÁÄÏÂÉÔÓÑ? HZ> á ÔÙ ÞÔÏ, ÔÒÕÄÏÅÍËÏÓÔØ × ÓÔÒÏËÁÈ ÉÚÍÅÒÑÅÛØ?

÷ ËÏÎÃÅ ËÏÎÃÏ× ×ÓÅ Ó×ÏÄÉÔÓÑ Ë ËÏÌÉÞÅÓÔ×Õ ÓÔÒÏË.

HZ> åÓÌÉ ÔÏÌØËÏ ÒÁÄÉ HZ> ×ÉÒÔÕÁÌØÎÙÈ ÆÕÎËÃÉÊ, ÔÏ ÓÔÒÏË ÎÅ ÂÏÌØÛÅ ÐÏÎÁÄÏÂÉÔÓÑ - × ÓÌÕÞÁÅ ÒÕÞÎÏÊ HZ> ÏÒÇÁÎÉÚÁÃÉÉ ÔÏÖÅ ÐÉÓÁÎÉÎÙ ÅÓÔØ: ×ÐÉÓÙ×ÁÔØ × ÍÁÓÓÉ×Ù ÕËÁÚÁÔÅÌÉ, HZ> ÐÒÏÐÉÓÙ×ÁÔØ ÄÏ ÜÔÏÇÏ ÐÒÏÔÏÔÉÐÙ. ðÏ ËÏÌÉÞÅÓÔ×Õ ÐÉÓÁÎÉÎÙ ÏÎÏ ÇÄÅ-ÔÏ HZ> ÓÏÉÚÍÅÒÉÍÏ, Á ×ÏÔ ÐÏ ÂÅÚÏÐÁÓÎÏÓÔÉ É ÕÄÏÂÓÔ×Õ ×ÉÒÔÕÁÌØÎÙÅ ÆÕÎËÃÉÉ HZ> ÒÕÌÑÔ.

ïÎÏ-ÔÏ ËÏÎÅÞÎÏ ÄÁ. åÓÌÉ ÓÏÚÄÁ×ÁÔØ ÎÁ óÉ ÍÁÓÓÉ×Ù ÕËÁÚÁÔÅÌÅÊ ÎÁ ÆÕÎËÃÉÉ, ÔÏ ÉÌÉ ÚÁÓÔÒÅÌÉÔØÓÑ ÉÌÉ ÐÅÒÅÊÔÉ ÎÁ ó++. HÏ Ñ ÐÒÅÄÌÁÇÁÌ ÎÅ ÓÏÚÄÁ×ÁÔØ ÆÕÎËÃÉÉ.

AB>> ÷ÏÏÂÝÅ-ÔÏ ÍÅÎÑ ó++ ÎÅ ÕÓÔÒÁÉ×ÁÅÔ, ÐÏÔÏÍÕ-ÞÔÏ Ó ÎÉÍ ÐÏÌÕÞÁÅÔÓÑ AB>> ÍÎÏÇÏ×ÁÔÏ ÕËÁÚÁÔÅÌÅÊ ÎÁ ÆÕÎËÃÉÉ, HZ> üÔÏ ÇÄÅ ÜÔÏ ÔÁÍ ÏÎÏ ÐÏÑ×ÌÑÅÔÓÑ?

÷ÍÅÓÔÅ Ó ×ÉÒÔÕÁÌØÎÙÍÉ ÍÅÔÏÄÁÍÉ.

AB>> Ó ËÏÔÏÒÙÍÉ á÷òÕ ÎÅ ÏÞÅÎØ ÕÄÏÂÎÏ ÒÁÂÏÔÁÔØ. HZ> á ÜÔÏ ÅÝÅ ÐÏÞÅÍÕ? é ËÏÍÕ ÔÏÇÄÁ ÕÄÏÂÎÏ?

ldd ZL, Y+N ldd ZH, Y+N+1 icall

(ÜÔÏ ÅÓÌÉ Y Ó×ÏÂÏÄÎÙÊ)

ÐÒÏÔÉ×:

rcall

HÁ ARM:

ËÏÓ×ÅÎÎÙÊ mov LR, PC ldr PC, [R0, #N] ÐÒÏÔÉ×:

bl

Alexey

Reply to
Alexey Boyko

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.