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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Как заставить помещать строки во флэш?
prottoss
сообщение Nov 2 2006, 19:49
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Всем доброго времени суток!

Столкнулся с такой проблемой: для отладки пользую USART и посылаю собственной функцией usart_print(uchar *str) сообщения вида:

Код
usart_print(("start time at:")
и т.п.

Все бы хорошо, функция отлаженна давно и работает безукоризненно. Но, когда у меня накопилось, в отлаживаемом в данный момент проекте, много сообщений у меня начались глюки в программе выражающиеся, в основном, в том, что программа стала вылетать на reset. После отладки в AVRStudio, оказалось, что добрая часть SRAM заполненна именно моими сообщениями. Установка галки в опциях компилера "Place aggregate initializers in flash memory" ничего не дает. Строки просто дублируются в памяти программ и все. В SRAM они так же присутствуют (((. Конечно, можно все сообщения поместить в отдельные массивы с префиксом __flash, создать еще одну функцию типа usart_print_flash(uchar __flash * str) и делать записи типа
Код
usart_print_flash(msg1)
но это не очень удобно и не очень наглядно. Может быть есть какая то возможность указать компилятору, чтобы динамически создаваемые строки он помещал во флэш, или создавал буфер на лету? ИАР версии 4.10В. Надеюсь, я понятно все объяснил. Спасибо


--------------------
Go to the top of the page
 
+Quote Post
klop
сообщение Nov 2 2006, 20:32
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 433
Регистрация: 28-02-06
Пользователь №: 14 788



Я что то не понял. По моему есть два пути
1. Строки хранятся во FLASH, перед употребление копируются в DM, и оттуда используются.
2. Строки хранятся во FLASH и прямо оттуда используются

А какие еще варианты?
Go to the top of the page
 
+Quote Post
prottoss
сообщение Nov 2 2006, 20:47
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Цитата(klop @ Nov 3 2006, 03:32) *
Я что то не понял. По моему есть два пути
1. Строки хранятся во FLASH, перед употребление копируются в DM, и оттуда используются.
2. Строки хранятся во FLASH и прямо оттуда используются
А какие еще варианты?
Вы все правильно поняли, я задал вопрос - почему с моей функцией не работает " 1. Строки хранятся во FLASH, перед употребление копируются в DM, и оттуда используются.". Они у меня все в DM получаются...


--------------------
Go to the top of the page
 
+Quote Post
klop
сообщение Nov 2 2006, 21:02
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 433
Регистрация: 28-02-06
Пользователь №: 14 788



Цитата(prottoss @ Nov 2 2006, 23:47) *
Цитата(klop @ Nov 3 2006, 03:32) *
Я что то не понял. По моему есть два пути
1. Строки хранятся во FLASH, перед употребление копируются в DM, и оттуда используются.
2. Строки хранятся во FLASH и прямо оттуда используются
А какие еще варианты?
Вы все правильно поняли, я задал вопрос - почему с моей функцией не работает " 1. Строки хранятся во FLASH, перед употребление копируются в DM, и оттуда используются.". Они у меня все в DM получаются...


Хе. Так енто вопросы к компилятору(и языку C). Чтобы не забивать память объявляйте строки во flash, а перед употреблением копируйте их в DM(сами). Не очень красиво конечно но должно работать. Или напишите всетаки функцию которая будет ваши строки прямо из flash выгребать.

Сообщение отредактировал klop - Nov 2 2006, 21:10
Go to the top of the page
 
+Quote Post
prottoss
сообщение Nov 2 2006, 21:26
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Цитата(klop @ Nov 3 2006, 04:02) *
Хе. Так енто вопросы к компилятору(и языку C). Чтобы не забивать память объявляйте строки во flash, а перед употреблением копируйте их в DM(сами). Не очень красиво конечно но должно работать. Или напишите всетаки функцию которая будет ваши строки прямо из flash выгребать.
Хе, дак я про то и вопрашаю, есть ли способ заставить компилятор самому создавать константные строки-сообщения во флэш, и забивать их в мою функцию, когда она встречается в тексте программы. Вот такая конструкция, например это делает:
Код
UCHAR msg1[] = "start time at:";

usart_print((msg1)
Строка компилируется во флэш. Но когда встречается объявление msg1, компилятор генерит код, забивающий в msg1 строку из флэш... Хотелось бы чтобы это работало и без объявления msg1...


--------------------
Go to the top of the page
 
+Quote Post
klop
сообщение Nov 2 2006, 21:43
Сообщение #6


Местный
***

Группа: Свой
Сообщений: 433
Регистрация: 28-02-06
Пользователь №: 14 788



Цитата(prottoss @ Nov 3 2006, 00:26) *
Хе, дак я про то и вопрашаю, есть ли способ заставить компилятор самому создавать константные строки-сообщения во флэш, и забивать их в мою функцию, когда она встречается в тексте программы. Вот такая конструкция, например это делает:
Код
UCHAR msg1[] = "start time at:";

usart_print((msg1)
Строка компилируется во флэш. Но когда встречается объявление msg1, компилятор генерит код, забивающий в msg1 строку из флэш... Хотелось бы чтобы это работало и без объявления msg1...


Нет в лоб не выйдет. Надо объявлять:
unsigned char __flash MyString[] = "xxx";

и потом либо использовать фукцию выгребающую из flash либо копировать(ручками) в DM.
Go to the top of the page
 
+Quote Post
prottoss
сообщение Nov 2 2006, 21:55
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Цитата(klop @ Nov 3 2006, 04:43) *
Нет в лоб не выйдет. Надо объявлять:
unsigned char __flash MyString[] = "xxx";
и потом либо использовать фукцию выгребающую из flash либо копировать(ручками) в DM.
Я же Вам показал, как получается. Если динамически объявляешь массив в памяти данных, и инициализируешь его, то компилятор сам создает в памяти данных ПУСТОЙ масиив, функцию копирования, и данные для инициализации, которые располагает в памяти программ. У Вас есть под рукой AVRStudio и IAR? Вы знаете наверняка, или вам так кажется? Компилятор очень много вещей может делать неявно, на то он и компилятор с языка высокого уровня, а не ассемблер


--------------------
Go to the top of the page
 
+Quote Post
Andy_F
сообщение Nov 2 2006, 22:07
Сообщение #8


Частый гость
**

Группа: Свой
Сообщений: 109
Регистрация: 27-07-06
Из: С.-Петербург
Пользователь №: 19 148



Может быть, поможет подключение pgmspace ? Т.е., пишем

Код
#include <pgmspace.h>


, в опциях проекта в закладке "C compiler" -> "Extra Options"
ставим птицу "Use command line options"
и набираем строчку --string_literals_in_flash

У меня, правда, получилось не очень. Похоже, если при использовании функций из pgmspace происходит прерывание, то работает это дело некорректно.
Go to the top of the page
 
+Quote Post
prottoss
сообщение Nov 2 2006, 22:16
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Цитата(Andy_F @ Nov 3 2006, 05:07) *
Может быть, поможет подключение pgmspace ? Т.е., пишем
Код
#include <pgmspace.h>

, в опциях проекта в закладке "C compiler" -> "Extra Options"
ставим птицу "Use command line options"
и набираем строчку --string_literals_in_flash

У меня, правда, получилось не очень. Похоже, если при использовании функций из pgmspace происходит прерывание, то работает это дело некорректно.
Нет, так не выходит, компилятор сразу вывалил кучу ошибок на все мои строки, типа "Error[Pe167]: argument of type "char __flash *" is incompatible with parameter of type "unsigned char *" E:\AVR.Projects\........... 127 ". Т.е. он все мои строки привратил char __flash и указатели подставляет в мою функцию, а ей надо просто char* ... наверное, придется создать еще одну с указателем на char __flash * (((


--------------------
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Nov 3 2006, 07:48
Сообщение #10


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Вобщем то ключевые слова signed и unsigned обычно применяются к обьектам, содержащим по смыслу числовые значения.
Что же касается символьных обьектов и строк на их основе, то общепринятым типом в этом случае является просто char.
Поэтому и обьявления в pgmspace.h вполне оправданные и корректные.
Go to the top of the page
 
+Quote Post
prottoss
сообщение Nov 3 2006, 07:53
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Цитата(IgorKossak @ Nov 3 2006, 14:48) *
Вобщем то ключевые слова signed и unsigned обычно применяются к обьектам, содержащим по смыслу числовые значения.
Что же касается символьных обьектов и строк на их основе, то общепринятым типом в этом случае является просто char.
Поэтому и обьявления в pgmspace.h вполне оправданные и корректные.
Ну а по поводу первого моего поста что можете сказать? Есть какие нибудь пути решения, кроме pgmspace?


--------------------
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Nov 3 2006, 07:57
Сообщение #12


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Цитата(prottoss @ Nov 3 2006, 09:53) *
Ну а по поводу первого моего поста что можете сказать? Есть какие нибудь пути решения, кроме pgmspace?

pgmspace на мой взгляд - очень приемлемое решение.
Я сам довольно часто (чуть не сказал "всегда") им пользуюсь. Да и зачем писать самому если кто-то уже написал?
Go to the top of the page
 
+Quote Post
prottoss
сообщение Nov 3 2006, 08:30
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Цитата(IgorKossak @ Nov 3 2006, 14:57) *
Цитата(prottoss @ Nov 3 2006, 09:53) *

Ну а по поводу первого моего поста что можете сказать? Есть какие нибудь пути решения, кроме pgmspace?

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

...Полные непонятки (((


--------------------
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Nov 3 2006, 08:55
Сообщение #14


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Определяете строки везде одинаково?
Есть разница между:
Код
__flash char My_String[] = "Некий стринг";

и
Код
printf_P("Другой стринг");


Ещё оди нюанс.
Стринг копируется в ОЗУ если, например, функция его использующая предполагает, что он должен быть взят из ОЗУ, а не из flash.
Go to the top of the page
 
+Quote Post
prottoss
сообщение Nov 3 2006, 08:59
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Цитата(IgorKossak @ Nov 3 2006, 15:49) *
Определяете строки везде одинаково?
Есть разница между:
Код
__flash char My_String[] = "Некий стринг";

и
Код
printf_P("Другой стринг");
Да нет, вы меня не поняли. Я не подключаю модуль pgmspase. Я пользуюсь своей функцией usart_print(char *string). Так вот, некоторые строки в проекте сидят в памяти программ, и достаются от туда автоматом во временный буфер, который создает САМ КОМПИЛЯТОР, т.е. он сам генерит код копирования и создает в куче буфер. Некоторые же строки он помещает прямиком в память данных, и адреса этих строк подставляет в мою функцию. Вот я и не могу отследить логику его определения, ЧТО пихать в ПП, а что в ПД.

И вот, программа, после очередного usart_print улетает на адрес 0х0000. Главное, что строку она выводит, и после RET идет на RESET. Беда какая то(


--------------------
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 07:56
Рейтинг@Mail.ru


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