AVR ADC & IAR2.28 - Page 2

Do you have a question? Post it now! No Registration Necessary

Threaded View
Re: AVR ADC & IAR2.28
Hello, Askold Volkov !

 >  DO> А, тогда понятно. Hепонятно только почему в ide, уже если ее сделали,
 >  DO> не внести все крыжики.

 > Точно ответить могут только авторы, я же могу только высказать свои догадки.
 > Во-первых, это свежая опция, возможно ее просто не успели внести в
 > IDE к моменту его выпуска. Во-вторых IARовцы очень долго сопротивлялись
 > ее введению, считая идеологически неправильной, и сделали это только
 > под давлением пользователей. И действительно - включение этой опции
 > противоречит стандарту языка.

А копировать ОЗУ константные строки или хотя бы указатели на них противоречит
здравому смыслу. Особенно, если это не опционально.

 >  DO> Видимо пора от нее отказываться к чертовой матери, не дожидаясь
 >  DO> перитонита. Собственно от линковки с установленными крыжиками уже
 >  DO> пришлось отказаться - оно проесто перестало линковаться, и с идущим
 >  DO> линк-файлом тоже. Пришлось править...

 > Странно. А я из среды собираю и ничего.

Может я опять что-то сделал не так, но с некоторого момента (точнее с момента,
когда появились массивы строк) среда стала ругаться, что в каком-то там тини
сегменте мало места. Я поставил модель small, после чего, она стала ругаться
что не знает куда девать сегмент NEAR_Z кажется. Указание соответствующего
линк-файла не помогло, помогло прописывание в нем этого сегмента.

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


Re: AVR ADC & IAR2.28
--
  

"Dima Orlov"  сообщил в новостях следующее:

Quoted text here. Click to load it
We've slightly trimmed the long signature. Click to see the full one.
Re: AVR ADC & IAR2.28
Hello, Askold Volkov !

 >  AK> Это еще каким местом противоречит ?

 > противоречит тем местом, что по стандарту С строковый литерал - это char*, а
 > если он лежит во flash, это уже не char*, а "char __flash *" и передавать
 > его функции, имеющей параметр типа char* нельзя. Hе пойму, правда,
 > что помешало IARовцам автоматически выбирать нужный тип в зависимости
 > от контекста.

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

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


Re: AVR ADC & IAR2.28
    Всем привет!

Dima Orlov писал к Askold Volkov Sat, 31 Jan 2004 22:46:00 +0300:

 ??>> противоречит тем местом, что по стандарту С строковый литерал - это
 ??>> char*, а если он лежит во flash, это уже не char*, а "char __flash *"
 ??>> и передавать его функции, имеющей параметр типа char* нельзя. Hе
 ??>> пойму, правда, что помешало IARовцам автоматически выбирать нужный тип
 ??>> в зависимости от контекста.

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

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

char* a="qwerty";
или
void puts(char* str);
puts("hello");

строка размещалась бы в ОЗУ как и сейчас, а если

char __flash * b="asdf";
или
void puts_P(char __flash * str);
puts_P("hello");

то во flash. Ведь понимают же они:

char aaa[]="qwerty";
и
char __flash bbb[]="asdf";

--
Аскольд Волков, Новосибирск. http://www.inp.nsk.su/~volkov /



Re: AVR ADC & IAR2.28
Привет, 31 января 2004 г., 22:46:00, ты писал(а):

 >> противоречит тем местом, что по стандарту С строковый литерал -
 >> это char*, а
 >> если он лежит во flash, это уже не char*, а "char __flash *" и
 >> передавать
 >> его функции, имеющей параметр типа char* нельзя. Hе пойму, правда,
 >> что помешало IARовцам автоматически выбирать нужный тип в зависимости
 >> от контекста.
DO> Видимо желание сделать двухбайтный указатель. Хотя когда-то я работал с
DO> их же,
DO> правда очень очень старым компилятором для 51 и там указатели были
DO> трехбайтные.
DO> В первом байте была информация о том где лежат данные.

В IAR AVR тоже есть, см. __generic

Всего хорошего.





--
Отправлено через сервер Форумы@mail.ru - http://talk.mail.ru

Re: AVR ADC & IAR2.28
Hello, Askold Volkov !

 >  ??>> противоречит тем местом, что по стандарту С строковый литерал - это
 >  ??>> char*, а если он лежит во flash, это уже не char*, а "char __flash *"
 >  ??>> и передавать его функции, имеющей параметр типа char* нельзя. Hе
 >  ??>> пойму, правда, что помешало IARовцам автоматически выбирать нужный тип
 >  ??>> в зависимости от контекста.

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

 > Дык это у них и тут есть. Указатель типа __generic называется.

Тогда непонятно какого хрена они так делают. Другие компиляторы без лишних
разговоров const char *  размещают в ПЗУ,а тут из-за какой-то непонятной
упертости надо через задницу все писать. Вообще по-моему, куда разумнее
прагмами указывать в каком сегменте должны размещаться нижеописанные данные
(код). И кое-где так и сделано.


 > Давно грозятся еще и такую модель памяти сделать. Hо я не о том. Ведь
 > вполне можно было бы сделать, чтобы если в программе написано

 > char* a="qwerty";
 > или
 > void puts(char* str);
 > puts("hello");

 > строка размещалась бы в ОЗУ как и сейчас, а если

 > char __flash * b="asdf";
 > или
 > void puts_P(char __flash * str);
 > puts_P("hello");

 > то во flash. Ведь понимают же они:

 > char aaa[]="qwerty";
 > и
 > char __flash bbb[]="asdf";


Да, непостижимо. Сейчас вот переписал свою программку в этом угробищном стиле.
Только на правильно размещенных данных экономится более сотни байт ОЗУ и
изрядное количество кода. И с АЦП помогло, откуда я это ==1 взял, ума не
приложу, ССЗБ...

Еще вопрос. Тут кто-то написал, что no_init работает только для внешней памяти.
Это действительно так? Я вижу, что мап-файл получается разный при использовании
этого модификатора и без него, но глуже в сгенерированный код не лез пока...
Или спокойнее вообще убрать из стартапа эту автоинициализацию?


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


Re: AVR ADC & IAR2.28
    Всем привет!

Dima Orlov писал к Askold Volkov Sun, 01 Feb 2004 12:25:00 +0300:

 ??>> Дык это у них и тут есть. Указатель типа __generic называется.

 DO> Тогда непонятно какого хрена они так делают.

ну... неэффективно это - постоянно проверять тип указателя и использовать
разные командв для обращения. Да и этот __generic указатель у них тоже через
задницу сделан и позволяет не ко всей памяти обращаться.

 DO> писать. Вообще по-моему, куда разумнее прагмами указывать в каком
 DO> сегменте должны размещаться нижеописанные данные (код). И кое-где так и
 DO> сделано.

а такие прагмы в IARе тоже есть

 DO> Еще вопрос. Тут кто-то написал, что no_init работает только для внешней
 DO> памяти. Это действительно так?

данные, описанные как __no_init просто размещаются в отдельном сегменте и не
инициализируются. А разместить этот сегмент можно в любом месте, указав это
линкеру.

 DO> Или спокойнее вообще убрать из стартапа эту автоинициализацию?

а чем она тебе помешала?

--
Аскольд Волков, Новосибирск. http://www.inp.nsk.su/~volkov /



Re: AVR ADC & IAR2.28
Hello, Askold Volkov !

 >  ??>> Дык это у них и тут есть. Указатель типа __generic называется.

 >  DO> Тогда непонятно какого хрена они так делают.

 > ну... неэффективно это - постоянно проверять тип указателя и использовать
 > разные командв для обращения. Да и этот __generic указатель у них

А объявленное константой содержимое ПЗУ в ОЗУ копировать эффективно? Это очень
зависит...

 > тоже через задницу сделан и позволяет не ко всей памяти обращаться.

Hу так long'ом бы его сделали... Если уж такая борьба за совместимость.

 >  DO> писать. Вообще по-моему, куда разумнее прагмами указывать в каком
 >  DO> сегменте должны размещаться нижеописанные данные (код). И кое-где так и
 >  DO> сделано.

 > а такие прагмы в IARе тоже есть

Я что-то не встретил, правда целиком конечно описание компилятора не читал.
Вообще удручает практически полное отсутствие примеров... Особенно примеров
применения нестандартных вещей. Прерываний, распредения памяти, etc.

 >  DO> Еще вопрос. Тут кто-то написал, что no_init работает только для внешней
 >  DO> памяти. Это действительно так?

 > данные, описанные как __no_init просто размещаются в отдельном сегменте и не
 > инициализируются. А разместить этот сегмент можно в любом месте, указав это
 > линкеру.

Тогда нормально.

 >  DO> Или спокойнее вообще убрать из стартапа эту автоинициализацию?

 > а чем она тебе помешала?

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

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


Re: AVR ADC & IAR2.28
    Всем привет!

Dima Orlov писал к Askold Volkov 01.02.2004:

 DO> А объявленное константой содержимое ПЗУ в ОЗУ копировать эффективно?
 DO> Это очень зависит...

 DO> Hу так long'ом бы его сделали... Если уж такая борьба за совместимость.

А чего ты со мной-то споришь? Ты это IARовцам попробуй объяснить :)

 DO>>> Или спокойнее вообще убрать из стартапа эту автоинициализацию?

 >> а чем она тебе помешала?

 DO> Лишний код. Я то, что нужно обычно инициализирую явно, причем совсем не
 DO> обязательно нулями.

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

--
Аскольд Волков, Новосибирск. http://www.inp.nsk.su/~volkov /


Site Timeline