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

 
 
> Как заставить помещать строки во флэш?
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
 
Start new topic
Ответов
Andy_F
сообщение Nov 2 2006, 22:07
Сообщение #2


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

Группа: Свой
Сообщений: 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
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 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



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

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 13:43
Рейтинг@Mail.ru


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