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

 
 
 
Reply to this topicStart new topic
> Подскажите как правильно передать строку в функцию?, Хочу писать putstring("Hello Word\r\n") а не вывходит
mempfis_
сообщение Sep 9 2009, 15:08
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 1 001
Регистрация: 27-06-06
Пользователь №: 18 409



Добрый день.
Сижу ламаю голову вот над каким вопросом - есть самописная функция putstring(unsigned char __flash *pData) которая по указателю считывает строку и передаёт её по уарту в терминал.

Если объявить строку и передать указатель на неё в функцию то всё работает правильно:
Код
__flash unsigned char txt[] = "Start Programm\r\n";
putstring(txt)


Хочу сделать запись проще - при использовании функции сразу писать в ней строку:
Код
putstring("Start Programm\r\n")


Компилятор выдаёт ошибку
Код
Error[Pe167]: argument of type "char const *" is incompatible with parameter of type "unsigned char __flash *"


Привожу к типу unsigned char __flash * в надежде что компилятор поймёт что строку надо разместить во флеш а в функцию передать указатель:
Код
putstring( (unsigned char __flash *) "Start Programm\r\n")


Никакой ругани нет но и не работает совсем.
Прогнал в симуляторе - выяснил что во втором случае передаётся неверный указатель на строку и соответственно читается всякая белеберда из памяти программ.

Собственно вопрос как можно сделать чтобы второй вариант записи работал?
Для наглядности программы хочется чтобы строки писались в самой функции.
Go to the top of the page
 
+Quote Post
Andron_
сообщение Sep 9 2009, 15:17
Сообщение #2


.NET developer
***

Группа: Свой
Сообщений: 218
Регистрация: 20-10-07
Из: Новосибирск
Пользователь №: 31 532



сдается мне, линковщику нужно указать, чтобы он размещал строки во флэш памяти...
Go to the top of the page
 
+Quote Post
Палыч
сообщение Sep 9 2009, 15:21
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Вы бы транслятор указали что ли... ИАР? Дело, имхо, в галке "Place string literals and constants in initialized RAM"
Go to the top of the page
 
+Quote Post
mempfis_
сообщение Sep 9 2009, 15:50
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 001
Регистрация: 27-06-06
Пользователь №: 18 409



Цитата(Палыч @ Sep 9 2009, 18:21) *
Вы бы транслятор указали что ли... ИАР? Дело, имхо, в галке "Place string literals and constants in initialized RAM"


Компилятор IAR AVR 5.20.

Убираю галочку - появляется ошибка:
Код
Error[e16]: Segment NEAR_C (size: 0x8a5 align: 0) is too long for segment definition. At least 0x8a5 more bytes needed. The problem occurred while processing the segment  
placement command "-Z(DATA)NEAR_C=_..X_EXT_ROM_BASE:+_..X_EXT_ROM_SIZE", where at the moment of placement the available memory ranges were  
"DATA:10ff--1"
Error while running Linker


Добавил сегмент STR во флеш, указал размещать в нём эти строки - ситуция та же.
В симуляторе вижу что считывание идёт из флеш, а сама строка расположена в internal sram.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Sep 9 2009, 16:18
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(mempfis_ @ Sep 9 2009, 17:08) *
Хочу сделать запись проще....

Проще, по-гарвардовски, сделали микроконтроллер smile.gif, посему придется Вам перестать хотеть делать проще и делать "сложнее" sad.gif. Насколько смогли, авторы компилятора прикрыли проблему __flash, но дальше ручками sad.gif


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
mempfis_
сообщение Sep 9 2009, 16:59
Сообщение #6


Профессионал
*****

Группа: Свой
Сообщений: 1 001
Регистрация: 27-06-06
Пользователь №: 18 409



Цитата(zltigo @ Sep 9 2009, 19:18) *
Проще, по-гарвардовски, сделали микроконтроллер smile.gif, посему придется Вам перестать хотеть делать проще и делать "сложнее" sad.gif. Насколько смогли, авторы компилятора прикрыли проблему __flash, но дальше ручками sad.gif


Т.е. эта проблема нерешаема на уровне компилятора?
Сделать сложнее смогу smile.gif Жаль программа будет не суперчитабельной sad.gif
Всем спасибо за консультации, буду переделывать код smile.gif

Сообщение отредактировал mempfis_ - Sep 9 2009, 17:05
Go to the top of the page
 
+Quote Post
zltigo
сообщение Sep 9 2009, 17:02
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(mempfis_ @ Sep 9 2009, 18:59) *
Т.е. эта проблема нерешаема на уровне компилятора?

Очевидно, что решаема, но решать (маскировать наличие) во всех аспектах ее не стали.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
SSerge
сообщение Sep 9 2009, 18:06
Сообщение #8


Профессионал
*****

Группа: Свой
Сообщений: 1 719
Регистрация: 13-09-05
Из: Novosibirsk
Пользователь №: 8 528



Или так:
#define PutString(x) do{static char __flash str[]=x; putstring(str);}while(0)


--------------------
Russia est omnis divisa in partes octo.
Go to the top of the page
 
+Quote Post
Rst7
сообщение Sep 9 2009, 18:25
Сообщение #9


Йа моск ;)
******

Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610



Все там решается.

Ключик "-y" надо вставить, если мне память не изменяет. Завтра точно гляну.


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
Artem_Petrik
сообщение Sep 10 2009, 10:35
Сообщение #10


Местный
***

Группа: Свой
Сообщений: 443
Регистрация: 22-07-06
Из: Украина, г. Харьков
Пользователь №: 19 006



ключ --string_initializers_in_flash (кажись так, сейчас IAR-а под рукой нет, чтоб проверить) нужен для С компилятора.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Sep 10 2009, 10:45
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(Rst7 @ Sep 9 2009, 20:25) *
Ключик "-y" надо вставить, если мне память не изменяет. Завтра точно гляну.

Ну это где-то с точностью до наоборот.
Цитата(Artem_Petrik @ Sep 10 2009, 12:35) *
ключ --string_initializers_in_flash (кажись так, сейчас IAR-а под рукой нет, чтоб проверить) нужен для С компилятора.

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

Цитата(SSerge @ Sep 9 2009, 20:06) *
#define PutString(x) do{static char __flash str[]=x; putstring(str);}while(0)

Для данного случая наиболее нормальный выход


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
dimka76
сообщение Sep 10 2009, 12:41
Сообщение #12


developer
****

Группа: Свой
Сообщений: 902
Регистрация: 12-04-06
Из: Казань
Пользователь №: 16 032



Цитата(mempfis_ @ Sep 9 2009, 19:08) *
Добрый день.
Сижу ламаю голову вот над каким вопросом - есть самописная функция putstring(unsigned char __flash *pData) которая по указателю считывает строку и передаёт её по уарту в терминал.
......................................
Собственно вопрос как можно сделать чтобы второй вариант записи работал?
Для наглядности программы хочется чтобы строки писались в самой функции.


Есть еще один вариант.
Перед каждым вызовом
Код
putstring( ... )

Объявлять новую строку
Код
static __flash unsigned char string_1[] = "ha-ha";

Т.е.
Код
static __flash unsigned char string_1[] = "ha-ha";
putstring( string_1 );

static __flash unsigned char string_2[] = "hi-hi";
putstring( string_2 );


--------------------
Все может быть и быть все может, и лишь того не может быть-чего уж точно быть не может, хотя..и это может быть.
Go to the top of the page
 
+Quote Post
mempfis_
сообщение Sep 10 2009, 13:04
Сообщение #13


Профессионал
*****

Группа: Свой
Сообщений: 1 001
Регистрация: 27-06-06
Пользователь №: 18 409



Цитата(SSerge @ Sep 9 2009, 21:06) *
Или так:
#define PutString(x) do{static char __flash str[]=x; putstring(str);}while(0)


Спасибо, ваш вариант работает как мне хотелось.
Правда нет худа без добра - одинаковые строки совсем не оптимизируются и каждый раз ложатся во флеш занимая её небескрайние просторы.
Во всяком случае если придётся выводить много неповторяющийся текст то буду пользоваться этой записью smile.gif
Go to the top of the page
 
+Quote Post
Sergey'F
сообщение Sep 13 2009, 19:43
Сообщение #14


Местный
***

Группа: Свой
Сообщений: 351
Регистрация: 17-09-05
Из: Москва
Пользователь №: 8 660



Я бы все-таки придерживался подхода все текстовые строки объявить в одном месте/файле и использовать имена строк. Так удобнее поддержка ПО - при изменении кода не надо лазить и искать строки. Как раз в этом случае __flash unsigned char txt[] = "Start Programm\r\n" идеально подходит.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 18th July 2025 - 20:24
Рейтинг@Mail.ru


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