Easyelectronics.ru

Электроника для всех
Текущее время: 20 ноя 2017, 05:21

Часовой пояс: UTC + 5 часов



    • 10 шт. 2-слоя 100*100mm 2$. Быстрый заказ: JLCPCB.com
    • JLCPCB - это крупнейшая фабрика PCB прототипов в Китае.
    • Имеющий более 290,000 клиентов и выполняющий более 8,000 заказов в день.
    • LCSC - Крупнейший китайский онлайн магазин радиодеталей.

Начать новую тему Ответить на тему  [ Сообщений: 37 ]  На страницу Пред.  1, 2
Автор Сообщение
 Заголовок сообщения: Re: засада со sprintf
СообщениеДобавлено: 14 апр 2010, 18:22 
Старожил
Аватара пользователя

Зарегистрирован: 26 янв 2010, 21:55
Сообщения: 5457
Откуда: Уругвайская АССР
Цитата:
В gcc расположение во флешь сделано через макрос PROGMEM для авр (поправьте если не прав - никогда с авр дела не имел)- у других компиляторов - по другому, для других архитектур для gcc - ещё как-то.

(Насвистывая то ли себе под нос, то ли куда-то в сторону, тихо, так, чтобы никто не слышал) Переносимость, переносимость... Любимым аргументом писателей на си является переносимость... Иконой из угла на нас глядит сурово пресветлый лик ПереносимостиИзображение

_________________
Без гнева и жестокости, сегодня Смерть взмахнёт косой, и ангел тайными дорогами мой милый Кубик унесёт с собой.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: засада со sprintf
СообщениеДобавлено: 14 апр 2010, 18:32 
Только пришел

Зарегистрирован: 05 фев 2010, 13:01
Сообщения: 26
В gcc расположением во флеш или рам занимается компоновщик ld. На размещение секций можно влиять путем написания скрипта сценария компоновки. Если в опциях компоновки указать ключ
-T <имя файла скрипта>, то будет использоваться Ваш сценарий, а не установленный по-умолчанию. Результат размещения кода и данных по конкретным адресам всегда можно посмотреть в листинге, генерируемом программой objdump( arm-elf-objdump, avr-objdump и т.д) .

А ошибка объявления char * p = "ABC" действительно очень коварная, поскольку компилятор при компиляции не выдает ни ошибок , ни предупреждений.

Логично было бы хранить копию константы в ОЗУ и с ней работать, как написал MasterAlexei ,
поскольку объявляется указатель char * , а не const char *. Но имеем, что имеем.
В arm-elf-gcc константы "ABC" и "DEF" тоже размещаются во FLASH- памяти. По крайней мере у меня на LPC2138 так:

1b4: 4241 negs r1, r0
1b6: 0043 lsls r3, r0, #1
1b8: 4544 cmp r4, r8
1ba: 0046 lsls r6, r0, #1


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: засада со sprintf
СообщениеДобавлено: 14 апр 2010, 21:12 
Старожил

Зарегистрирован: 22 мар 2010, 22:54
Сообщения: 3996
amx писал(а):
а где все это добро располагается - отдаётся на откуп компиляторо-писателей.

пусть так, но какой смысл копировать константу в озу? а "ABC" - именно константа. вот я и говорю, что _возможно_, что гцц копирует в озу, только для того, чтобы можно было сделать char *a="ABC". это и есть трюк. в других (может не всех) архитектурах все константы оставляют во флеше.
Горнист писал(а):
Иконой из угла на нас глядит сурово пресветлый лик ПереносимостиИзображение

зря смеетесь. если писать вот так, не понимая, что делаешь, тогда да, какая может быть переносимость. но примеров очень много, когда огромный код ЛЕГКО переносится куда угодно:) я не про компы, я про контроллеры.
dev3 писал(а):
В arm-elf-gcc константы "ABC" и "DEF" тоже размещаются во FLASH- памяти.

ну, оно так и должно быть. просто у авр доступ к флешу осуществляется не так же как к озу.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: засада со sprintf
СообщениеДобавлено: 15 апр 2010, 00:10 
Старожил

Зарегистрирован: 03 мар 2010, 14:10
Сообщения: 1514
Откуда: Беларусь, Минск
Ink писал(а):
пусть так, но какой смысл копировать константу в озу? а "ABC" - именно константа. вот я и говорю, что _возможно_, что гцц копирует в озу, только для того, чтобы можно было сделать char *a="ABC". это и есть трюк.
копирует константу в озу и для того что б была возможность использовать один указатель как на константные так и на переменные строки (в других компиляторах имеем зоопарк ключевых слов аля flash/rom/ram/near/far и т.д.), и это не единственный костыль из многочисленного количества, которые существуют исключительно на 8-битниках
Ink писал(а):
в других (может не всех) архитектурах все константы оставляют во флеше.
во первых такие изощрения являются прямым следствием гарвардности архитектуры авр и малым количеством бит адресной шины, для гарвардного АРМа с 32 битами адреса или для архитектуры фон Неймана такой проблемы вообще не стоит.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: засада со sprintf
СообщениеДобавлено: 13 янв 2017, 23:42 
Заглядывает иногда

Зарегистрирован: 03 окт 2010, 01:49
Сообщения: 176
Здравствуйте.

У меня тоже возникла засада с этой функцией, только в отличие от топикстартера, у меня значение меняется, но вся беда в том, что не там где надо...
Код:
/////// Объявления
char tmp_str[20] = "";          // временная переменная для строк
typedef struct {
  int32_t temperature;
  uint32_t pressure;
  uint32_t humidity;
  float altitude;
} Data_TypeDef;
Data_TypeDef Data;

///// основной код
main{
некая функция записи значений в структуру;

sprintf(tmp_str,"Т воздуха: %i.%02u C", Data.temperature/100 , Data.temperature%100);
LCD_SendString(0,0,tmp_str);

sprintf(tmp_str,"Влажность: %u.%03u %%", Data.humidity/1000 , Data.humidity%1000);
LCD_SendString(0,1,tmp_str);

sprintf(tmp_str,"Давление: %u.%03u mm", Data.pressure/1000 , Data.pressure%1000); /// вот тут проблемное место
LCD_SendStringFl(0,2,tmp_str);

тут дальше вывод высоты над уровнем моря;
}

Суть проблемы в том, что когда мы выполняем sprintf (отмеченную проблемным местом в коде) изменяется значение переменной "Data.temperature".
Изменяется всегда и стабильно на значение 2304 (0x900).
Как такое может быть?

За 20 символов мы не вылазим, хоть как раз в этом (проблемном) месте и впритык.

_________________
Все микрухи работают на волшебном дыме. Стоит только его выпустить - микруха мертва.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: засада со sprintf
СообщениеДобавлено: 14 янв 2017, 00:04 
Старожил
Аватара пользователя

Зарегистрирован: 27 мар 2015, 04:10
Сообщения: 1282
Откуда: Харьков
Значит вылазите. Ну или как минимум вылазит конец строки который вы не замечаете.
Сделайте
char tmp_str[25] = "";


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: засада со sprintf
СообщениеДобавлено: 14 янв 2017, 00:08 
Старожил

Зарегистрирован: 19 мар 2013, 19:37
Сообщения: 2254
Откуда: Санкт-Петербург
В библиотеке, кстати, snprintf или _snprintf_s есть? sprintf - для студентов и любителей проблем...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: засада со sprintf
СообщениеДобавлено: 14 янв 2017, 00:32 
Заглядывает иногда

Зарегистрирован: 03 окт 2010, 01:49
Сообщения: 176
alexsam писал(а):
Значит вылазите. Ну или как минимум вылазит конец строки который вы не замечаете.
Сделайте
char tmp_str[25] = "";

Сделал 22. Да, действительно, помогло.
Но что странно, конец не вылазит за диапазон.
Вложение:
Снимок.PNG
Снимок.PNG [ 11 Кб | Просмотров: 1081 ]

Видимо очередная "фича".

aamonster писал(а):
В библиотеке, кстати, snprintf или _snprintf_s есть? sprintf - для студентов и любителей проблем...

Есть только sprintf.
Компилятор IAR.

Спасибо всем откликнувшимся!

_________________
Все микрухи работают на волшебном дыме. Стоит только его выпустить - микруха мертва.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: засада со sprintf
СообщениеДобавлено: 14 янв 2017, 00:35 
Старожил

Зарегистрирован: 19 мар 2013, 19:37
Сообщения: 2254
Откуда: Санкт-Петербург
В смысле - не вылазит? А завершающий нулевой символ?
Забейте строку каким-нибудь символом и посмотрите, чтобы понятно было.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: засада со sprintf
СообщениеДобавлено: 14 янв 2017, 00:53 
Заглядывает иногда

Зарегистрирован: 03 окт 2010, 01:49
Сообщения: 176
aamonster писал(а):
В смысле - не вылазит? А завершающий нулевой символ?
Забейте строку каким-нибудь символом и посмотрите, чтобы понятно было.

Точно! Совсем про это забыл.

Спасибо Вам большое, за разъяснения.

_________________
Все микрухи работают на волшебном дыме. Стоит только его выпустить - микруха мертва.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: засада со sprintf
СообщениеДобавлено: 18 янв 2017, 02:18 
Старожил
Аватара пользователя

Зарегистрирован: 01 ноя 2011, 23:51
Сообщения: 432
Цитата:
во первых такие изощрения являются прямым следствием гарвардности архитектуры авр и малым количеством бит адресной шины, для гарвардного АРМа с 32 битами адреса или для архитектуры фон Неймана такой проблемы вообще не стоит.


Немного дурацкий вопрос а разве stm32 не Фон-Неймановская архитектура? Там же вроде память программ и данных одним куском? (Возможно я ошибаюсь!)
Ну а кроме того ведь на ПК все тоже самое. такая запись приведет к созданию константы которая на этапе запуска программы копируется в ОЗУ. Разве нет? По сути так.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: засада со sprintf
СообщениеДобавлено: 18 янв 2017, 09:59 
Старожил

Зарегистрирован: 19 мар 2013, 19:37
Сообщения: 2254
Откуда: Санкт-Петербург
На PC (точнее, под виндой и, вероятно, другими десктопными операционками) сейчас всё вообще заморочно, afaik выполняемый файл не грузится в память сразу, а мапится в адресное пространство средствами ОС (т.е. помечается - по таким адресам такой файл). При этом изначально к этим адресам память не подсоединена вообще. И уже при попытке обратиться к этим адресам - процессор чует беду, выдаёт page fault, операционка его обрабатывает, смотрит сбойный адрес, подключает к нему новую страницу памяти, загружает туда кусок файла - и можно работать.
Но адресное пространство для кода и данных при этом всё равно одно.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 37 ]  На страницу Пред.  1, 2

Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB