Тупость или подводный камень

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

Сообщение ARV »

ikarab писал(а):ARV, ты мог бы проектик прицепить с таким "залетом" чтоб реально убедится исправлено ли нет и запросить исправление ?

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

Мой уютный бложик... заходите!
Аватара пользователя
__Alexander
Потрогал лапой паяльник
Сообщения: 335
Зарегистрирован: Вт сен 11, 2007 10:27:08
Откуда: Киев

Сообщение __Alexander »

Скажу даже больше, вот проверил на скорую руку. Брал только HEX, зашил в железо и его же всунул в протеус 7.2 сп2.
У вас там код:

//printf("%3d : %f %f\n",i,a1,cos(arg));
printf("%f\n",3.14/i);

т.е. скомпилирована на работу вторая строка, где Вы пишите, что она всегда будет работать.

Результаты на картинках.

У меня такое впечатление, что ну ее, эту printf :))
Вложения
zhelezo.jpg
Это в реальном железе
(30.97 КБ) 291 скачивание
proteus.jpg
Это в протеус 7.2 сп2
(5.73 КБ) 400 скачиваний
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

__Alexander писал(а):У меня такое впечатление, что ну ее, эту printf :))
гениально! протеус лажает, а ну ее - printf! без вины виноватая функция...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
__Alexander
Потрогал лапой паяльник
Сообщения: 335
Зарегистрирован: Вт сен 11, 2007 10:27:08
Откуда: Киев

Сообщение __Alexander »

Дык, а слово inf в первой строке откуда?

Мне не очень понятно, как в HEXе могут изменяться адреса? Это уже готовый для железа файл, где все переменные и функции уже лежат по своим адресам. Получается что сама АВР может откидывать эти адреса?

Надо будет попробывать, например скомпилировать строку rcall label1,
потом в hex поменять адрес на больше чем объем ПП и прошить, по вашим экспериментам выходит что PC досчитает до конца и продолжит считать с нуля, и возможно даже продолжить работать, перейдя на нулевой адрес. Все возможно, будет время, проверим.
С функцией printf у меня никак, так как я не знаю где настраивается в IAR согласования ее с конкретным УАПП.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

__Alexander писал(а):Дык, а слово inf в первой строке откуда?
оттуда :) если вы посмотрите на текст программы, то увидите, что при первой итерации цикла происходит деление на 0. так как никакой защиты от деления на 0 в Си для МК нет (во всяком случае, нет для AVR), то просто происходит деление с результатом бесконечность - infinity :) вот printf и выводит inf.
__Alexander писал(а):Мне не очень понятно, как в HEXе могут изменяться адреса? Это уже готовый для железа файл, где все переменные и функции уже лежат по своим адресам. Получается что сама АВР может откидывать эти адреса?
вы невнимательно читали мою статью, и не потрудились изучить даташиты... в файле и прошивке ничто никуда не отбрасывается, просто в программном счетчике команд физически нет старших разрядов, а есть столько младших, сколько необходимо для адресации имеющейся памяти. вдумайтесь в это, и вам все станет ясно. :)
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
__Alexander
Потрогал лапой паяльник
Сообщения: 335
Зарегистрирован: Вт сен 11, 2007 10:27:08
Откуда: Киев

Сообщение __Alexander »

Не знаю, надо проверять. По крайней мере вот скрин с АВР студио, счетчик показывает правильно. И протеус тоже нормально отрабатывает.
Вложения
studio.jpg
(49.42 КБ) 373 скачивания
Аватара пользователя
Negor
Вымогатель припоя
Сообщения: 586
Зарегистрирован: Ср мар 07, 2007 22:58:02
Откуда: Черкассы, Украина
Контактная информация:

Сообщение Negor »

А ты протеус под студией запускаеш или отдельно?
There is only 10 kind of people: those who understands binary code and those who dont!!!
Аватара пользователя
__Alexander
Потрогал лапой паяльник
Сообщения: 335
Зарегистрирован: Вт сен 11, 2007 10:27:08
Откуда: Киев

Сообщение __Alexander »

отдельно. в протеус грузил уже готовый при помощи студио hex.

Да и соссно какая разница? Вот скрин хекса этого кода из АВРСтудио, скрин как он располагается в Пони-прог (и соответственно в железе) и скрин памяти программ меги128 в протеусе. Я специально расположил подпрограмму и переход к ней в самый конец памяти программ. Разницы никакой, все на своих местах как и должно быть, что в протеусе, что и в реальности.

Я не спорю, что все с этим протеусом может быть, но для себя сделал вывод, никаких функций, которые непонятно что могут в результате дать, буду ждать на вход одно, а тут нечто типа inf придет. Лучше пользоваться проверенными способами. :))
Вложения
prot.jpg
Память программ меги128 Протеус
(32.12 КБ) 367 скачиваний
pony.jpg
Память программ меги128 Пони-прог
(54.1 КБ) 232 скачивания
hex.jpg
Память программ меги128. хекс созданный АВРСтудио
(14.41 КБ) 350 скачиваний
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

__Alexander писал(а):отдельно. в протеус грузил уже готовый при помощи студио hex.
Да и соссно какая разница? . . .
для себя сделал вывод, никаких функций, которые непонятно что могут в результате дать, буду ждать на вход одно, а тут нечто типа inf придет. Лучше пользоваться проверенными способами. :))
мда... разница ОГРОМНА! студия правильно обрабатывает при отладве описанную мной ситуацию, а протеус - неправильно. HEX тут ни при чем - это чисто проблема СИМУЛЯТОРА ПРОТЕУС.

а последний тезис просто убивает... интересно, какие проверенные способы "правильно" выведут у вас результат 15.8/0.0? может, вы еще и циклы перестанете использовать - они ведь могут зациклиться бесконечно... не смешите народ! :)

P.S. Кстати, inf - это число float бесконечно большой величины.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
__Alexander
Потрогал лапой паяльник
Сообщения: 335
Зарегистрирован: Вт сен 11, 2007 10:27:08
Откуда: Киев

Сообщение __Alexander »

Warning[Pe222]: floating-point operation result is out of range C:\ttt\111\1.c 66
По крайней мере компилятор предупреждает про деление на ноль.

А проверенный способ, это функция, которая лежит непосредственно в проекте, и есть уверенность что она сама не будет вызывать кучу функций для своей работы. И вот когда закончится стек, вот тогда и адрес возврата будет считаться через одно место, но работать будет. Хотя не думаю что тут именно такая ситуация, в меге8 как никак кило ОЗУ.

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

Сообщение ARV »

__Alexander писал(а):А проверенный способ, это функция, которая лежит непосредственно в проекте, и есть уверенность что она сама не будет вызывать кучу функций для своей работы. И вот когда закончится стек, вот тогда и адрес возврата будет считаться через одно место, но работать будет. Хотя не думаю что тут именно такая ситуация, в меге8 как никак кило ОЗУ.
нифига вы не рубите в ситуации... ваши слова напоминают бред... извините...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
__Alexander
Потрогал лапой паяльник
Сообщения: 335
Зарегистрирован: Вт сен 11, 2007 10:27:08
Откуда: Киев

Сообщение __Alexander »

ARV писал(а):
__Alexander писал(а):А проверенный способ, это функция, которая лежит непосредственно в проекте, и есть уверенность что она сама не будет вызывать кучу функций для своей работы. И вот когда закончится стек, вот тогда и адрес возврата будет считаться через одно место, но работать будет. Хотя не думаю что тут именно такая ситуация, в меге8 как никак кило ОЗУ.
нифига вы не рубите в ситуации... ваши слова напоминают бред... извините...


Да Вы что? Конечно не рублю... и конечно бред, показав на картинках, что программа переходит в самый конец памяти программ, там выполняет подпрограмму и возвращается назад, НЕ откидывая!!! никаких бит в адресе, это конечно бред, может я и дурак, но я виню не протеус, а функции, результаты которых невозможно предсказать (или надо быть гуру, чтобы знать, что конкретная функция может возвратить).

А по поводу стека (из ДШ):
Stack Pointer The Stack is mainly used for storing temporary data, for storing local variables and for storing return addresses after interrupts and subroutine calls. The Stack Pointer register always points to the top of the Stack. Note that the Stack is implemented as growing from higher memory locations to lower memory locations. This implies that a Stack
PUSH command decreases the Stack Pointer. The Stack Pointer points to the data SRAM Stack area where the Subroutine and Inter- rupt Stacks are located. This Stack space in the data SRAM must be defined by the
program before any subroutine calls are executed or interrupts are enabled. The Stack Pointer must be set to point above 0x60. The Stack Pointer is decremented by one when data is pushed onto the Stack with the PUSH instruction, and it is decremented by two when the return address is pushed onto the Stack with subroutine call or interrupt. The Stack Pointer is incremented by one when data is popped from the Stack with the POP instruction, and it is incremented by two when address is popped from the Stack with return from subroutine RET or return from interrupt RETI.

Соссно, The Stack Pointer must be set to point above 0x60, и ограничивается только объемом ОЗУ, и если Вы ОЗУ заняли под переменные, и под стек оставили один байт и компилятору сообщили игнорировать эту ситуацию, то и флаг вам в руки. И не удивительно что будет считать через жопу. Память то не резиновая. Со стеком, как и писалось в постах выше, надо тоже работать правильно.

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

Функция strlen, ничего обидного вроде бы нет, возвращает длину строки. Но!, если указать строку с явным указанием длины, типа Stroka[5] = {1,2,3,4,5};
и вызвать эту функцию, то даст результат 8.
А если так,
Stroka[] = {1,2,3,4,5};
то даст результат 5, как и должно быть.

Где косяк? И вы еще хотите, чтобы я изучал что могут вернуть все функции в каждом компиляторе? Можно и с ума сойти.

Да, и еще одно, где эта printf в IAR (а может даже в winavr) переключается между УАПП, ведь, начиная с меги 64 их там ДВА! Как переключить эту printf в порт TXD1, RXD1 ?
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

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

1. В описанном мной случае стек абсолютно ни при чем: вы сами можете видеть, сколько памяти занято под переменные программы. зная, сколько ОЗу всего, вы можете вычислить, сколько там остается под стек - более чем достаточно.
2. при проблемах со стеком программа скорее всего зависнет или будет выдавать абсолютно бредовые данные. в реальном железе мои программы отрабатывают отлично, лажа только в протеусе - так кто виноват? один и тот же hex в протеусе лажает, а в живом МК - нет? видимо, виноват WinAVR :)
3. я вам реально продемонстрировал, что надо сделать и как, чтобы обнаружить глюк протеуса. надо занять побольше памяти программ (все равно чем - я использовал printf и плавающую точку лишь потому, что мне так вздумалось, можно было просто 7К массив объявить во FLASH например). Данная проблема возникает, когда между вызывающей и вызываемой функцией "расстояние по адресам" превышает - в младших мегах нет команды дальнего вызова подпрограмм, есть только "короткий" относительный вызов RCALL. WinAVR генерирует абсолютно корректный код, позволяющий обойти ограничение в перехода - протеус этот код не проглатывает. это доказано.
4. если вы напишите проект без применения printf и т.п. библиотечных функций (которыми пользуются миллионы программистов в мире), но ваш проект будет все-таки чуть больше, чем 100 строк программы в единственном файле - вы можете нарваться на этот самый эффект все равно - главное не функция, не стек, а расстояние в адресах. причем в железе все будет железно пахать.
5. что касается вашего примера якобы неправильной работы strlen(), то он подтверждает лишь то, что вы не владеете языком Си. Вы даже не имеете представления о том, что между str[] и str[5] существует ОГРОМНАЯ разница!!! первое - это строка, второе - это МАССИВ!!!. лекцию читать не стану, надеюсь, вы сумеете найти в себе силы все-таки внимательно почитать книги (заодно, возможно, вы поймете, что вообще вниметельно читать полезно - даже мои скромные заметки о протеусе) и разобраться в разнице самостоятельно.
6. Что касается переключения на USART1 стандартного ввода-вывода, то я, хотя и знаю, как это сделать в WinAVR (про IAR не скажу - не пользуюсь им), вас грузить понапрасну не стану - максимум, чего в этом случае я смогу от вас ожидать, так это очередных воплей про то, как глупо все устроено, слишком много надо помнить и знать и т.п. Если вы разберетесь в предыдущем на 100% - тогда можно и о вводе-выводе поговорить, а без базовых знаний - не стОит.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
urry
Сверлит текстолит когтями
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница
Контактная информация:

Сообщение urry »

ARV писал(а):WinAVR генерирует абсолютно корректный код, позволяющий обойти ограничение в перехода - протеус этот код не проглатывает. это доказано.

По словам Тени, в версии 7.6 протеуса этот баг исправлен.


Существует так называемая "венгерская" запись - строка должна заканчиваться 0.
В Вашем случае, вероятно, правильно написать
Stroka[6] = {1,2,3,4,5,\0};
Хотя корректней через указатели, что-то типа
flash char* stroka="12345";
В этом случае компилятор самостоятельно поставит 0 в конце массива.
Вывод где-то так
do{
out(*stroka++);
}while(*stroka);
Преимущество функции printf - вывод в поток разнородных данных - перевод в текстовый вид флоат, инт и пр.
Не хотите пользоваться - не нужно - но тогда эти функции Вам надо написать самому. Вреда это не принесет.
А вообще, согласен с ARV - Керниган и Ричи в помощь, самплы, апноуты...
Последний раз редактировалось urry Пн июл 06, 2009 10:15:50, всего редактировалось 1 раз.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

urry писал(а):Хотя корректней через указатели, что-то типа
flash char* stroka="12345";
В этом случае компилятор самостоятельно поставит 0 в конце массива.
0 будет подставлен и в случае str[] = {1,2,3}, хотя более корректной записью будет str[] = "123"
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
__Alexander
Потрогал лапой паяльник
Сообщения: 335
Зарегистрирован: Вт сен 11, 2007 10:27:08
Откуда: Киев

Сообщение __Alexander »

Зачем вопли? Никаких вопль, хоть и Си я знаю не полностью, но даже лось прочтет в книгах по Си, что "Символьная строка - это МАССИВ типа char, завершенный символом \0".
И, если разобраться, число в прямоугольных скобках означает количество отдельных записей
char *str[2] = {"Stroka1", "Stroka2"};

Одни знатоки по Си собрались.

И я не виноват, что в ИАРе я не могу сделать так, чтобы протеус залагал, и если ARV каким-то макаром прогой из пяти строк занял 40% памяти программ меги8, то да, извините, с этим у меня хреново.

А с последним ответом, относительно, что сначала sprintf перевести float в строку, а потом обычным putstring вывести на уапп - полностью согласен. И объем поменьше будет.

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

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

Сообщение ARV »

__Alexander писал(а):Зачем вопли? Никаких вопль, хоть и Си я знаю не полностью, но даже лось прочтет в книгах по Си, что "Символьная строка - это МАССИВ типа char, завершенный символом \0".
очевидно, либо вы не читали это, когда говорили о том, что strlen() возвращает 8 вместо 5, либо... :)))
__Alexander писал(а):И, если разобраться, число в прямоугольных скобках означает количество отдельных записей
char *str[2] = {"Stroka1", "Stroka2"};
так-то оно так, только вот представляете ли вы сами, какие именно записи у вас в этом массиве str? какого типа?
__Alexander писал(а):Одни знатоки по Си собрались.
:)))

__Alexander писал(а): и если ARV каким-то макаром прогой из пяти строк занял 40% памяти программ меги8, то да, извините, с этим у меня хреново.
я именно хотел показать ошибку протеуса, потому нашел способ занять побольше памяти :) а хреново у вас совсем с другим... кстати, позвольте спросить: ваш хваленый IAR какой размер моей проги выдает?

__Alexander писал(а):А с последним ответом, относительно, что сначала sprintf перевести float в строку, а потом обычным putstring вывести на уапп - полностью согласен. И объем поменьше будет.
сомневаюсь я... разница между sprintf и printf лишь в той самой функции вывода символа - одна выводит его в массив, другая - в файловый поток :) так что по размеру все будет плюс-минус десяток байт одинаково :)))
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
urry
Сверлит текстолит когтями
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница
Контактная информация:

Сообщение urry »

__Alexander писал(а):Зачем вопли? Никаких вопль, хоть и Си я знаю не полностью, но даже лось прочтет в книгах по Си, что "Символьная строка - это МАССИВ типа char, завершенный символом \0".
И, если разобраться, число в прямоугольных скобках означает количество отдельных записей
char *str[2] = {"Stroka1", "Stroka2"};

Одни знатоки по Си собрались.

И я не виноват, что в ИАРе я не могу сделать так, чтобы протеус залагал, и если ARV каким-то макаром прогой из пяти строк занял 40% памяти программ меги8, то да, извините, с этим у меня хреново.

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

Если кого-то напряг - извиняйте.

да кого Вы напрягли, кроме себя.. ???
успокойтесь, Вы не самый умный - что бы по этому поводу не говорили окружающие - молодость - таки единственный недостаток, который приходит со временем.
Вспыльчивость - тоже хорошо - местами.
Оживляет форум, например .
Скажем, когда кто-то доказывает, что дважды два не 4, а 5...
Сколько полезного для себя лично вы взяли из этой ветки ?
Много. Наверное. Подумаете, в следующий раз, прежде чем всякую чушь постить.
В смысле - нас же и дети читают... они всему верят...
Я не то чтобы Вас подставляю... простите.. Мне 47 лет, самовыражаться в этом возрасте поздно...Возразить - быть может....
Ну, в личку...
Аватара пользователя
__Alexander
Потрогал лапой паяльник
Сообщения: 335
Зарегистрирован: Вт сен 11, 2007 10:27:08
Откуда: Киев

Сообщение __Alexander »

ARV писал(а):очевидно, либо вы не читали это, когда говорили о том, что strlen() возвращает 8 вместо 5, либо... :)))


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

ARV писал(а):так-то оно так, только вот представляете ли вы сами, какие именно записи у вас в этом массиве str? какого типа?


Понятия не имею, а может мне это и не нужно?


ARV писал(а):я именно хотел показать ошибку протеуса,


Да это я понял, просто проверить не могу. Точнее, с winavr увидел что них не работает, а понять почему не могу, хотя догадываюсь, что в отличие от железа протеус знает параметры МК, и объем памяти и все остальное, может поэтому и извращается.

ARV писал(а):потому нашел способ занять побольше памяти :)


Где? В мэйкфайле что-то указвали?

ARV писал(а):кстати, позвольте спросить: ваш хваленый IAR какой размер моей проги выдает?


Он не хваленный, просто начинал с него, могу и на winavr, но не так жестоко как вы.

Точно проверить не могу, потому-то не знаю как привязать printf к Уарту. Но скомпилился без ошибок, заканчивается на 9F4, что есть 2 548, но че-то все равно многовато для такой проги, четвертая часть елы-палы. С таким разгоном дальше писать то уже некуда.. :)

ARV писал(а): сомневаюсь я... разница между sprintf и printf лишь в той самой функции вывода символа - одна выводит его в массив, другая - в файловый поток :) так что по размеру все будет плюс-минус десяток байт одинаково :)))


Да, с такмим размерами плюс минус десять байт дейтвительно не критично. :))

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

Сообщение ARV »

__Alexander писал(а):
ARV писал(а):очевидно, либо вы не читали это, когда говорили о том, что strlen() возвращает 8 вместо 5, либо... :)))
Подразумевая, что по умолчанию должен быть 0, то как-бы должен выдать размер нулевой записи. И если она там одна, хотя объявлено что их там несколько, то я ниче не понимаю, даже если он дополняется одним символом, то это никак не три!
в си недопустимо что-то подразумевать - надо только быть уверенным на 100%. массив, не содержащий нулей явно, ничем не дополняется, и strlen() петрушит память, пока случайно не наткнется на 0 - например, в моих тестах вместо 8 получалось 10 - все зависит от того, какие переменные следуют в памяти за массивом и чему они равны.

__Alexander писал(а):
ARV писал(а):так-то оно так, только вот представляете ли вы сами, какие именно записи у вас в этом массиве str? какого типа?
Понятия не имею, а может мне это и не нужно?
ну, если вам не нужно понимать, что делает ваша программа - то тогда конечно... только в этом случае лучше не программы писать, а пиво пить...

__Alexander писал(а):
ARV писал(а):я именно хотел показать ошибку протеуса,
Да это я понял, просто проверить не могу. Точнее, с winavr увидел что них не работает, а понять почему не могу, хотя догадываюсь, что в отличие от железа протеус знает параметры МК, и объем памяти и все остальное, может поэтому и извращается.
я не понимаю - почему вы "догадываетесь"? я же вам прямо сказал, почему так происходит! и методику поиска проблемы указал, и расчеты... а вы все гадаете... и что вам не понятно из моей статьи?! кстати, в отличие от железа протеус делает неправильно - называйте это как хотите...

__Alexander писал(а):
ARV писал(а):потому нашел способ занять побольше памяти :)
Где? В мэйкфайле что-то указвали?
блин, да вы просто не читали мою статью!!! :evil: стыдно должно быть - морочить голову столько постов, не удосужившись просто внимательно прочесть статью!!! для вас, ленивца, повторяю: я применил полноценную версию библиотечной функции printf и библиотеку математических функций с плавающей точкой - плавающая точка в вычислениях и форматирование прибавляют весу очень сильно!!!

__Alexander писал(а):
ARV писал(а):кстати, позвольте спросить: ваш хваленый IAR какой размер моей проги выдает?
Он не хваленный, просто начинал с него, могу и на winavr, но не так жестоко как вы.
уверен - и на WinAVR вы не можете точно так же, как и в IAR... вы не знаете основ Си - о чем речь вообще?!

__Alexander писал(а):Точно проверить не могу, потому-то не знаю как привязать printf к Уарту. Но скомпилился без ошибок, заканчивается на 9F4, что есть 2 548, но че-то все равно многовато для такой проги, четвертая часть елы-палы. С таким разгоном дальше писать то уже некуда.. :)
вот когда заставите IAR делать все в полном объеме - тогда и сравним размеры. по моим сведениям IAR делает код примерно на 5-10% меньше, чем WinAVR - но это мизер....

__Alexander писал(а):
ARV писал(а): сомневаюсь я... разница между sprintf и printf лишь в той самой функции вывода символа - одна выводит его в массив, другая - в файловый поток :) так что по размеру все будет плюс-минус десяток байт одинаково :)))
Да, с такмим размерами плюс минус десять байт дейтвительно не критично. :))
И не думаю что это таки детские моменты.
не знаю, что там у вас за моменты... судя по всему, "моментов" у вас немало - если даже с strlen() вы до сих пор разобраться не можете... лепет про "неизвестно что возвращающие библиотечные функции" - детский лепет.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»