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

 
 
> Как заставить помещать строки во флэш?
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
Ответов
andrvisht
сообщение Nov 3 2006, 13:02
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 298
Регистрация: 29-08-05
Пользователь №: 8 064



Попробовал сделать так
в опциях добавил --string_literals_in_flash
написал функцию типа
Код
foo(char __flash *s)
{
  while (*s++ != 0)
  {
    PORTA = *s;
  }
}

при вызове сделал так
Код
foo((char __flash*)"MyFlash");


вроде как из Flash берет, проверьте, может подойдет ...
Go to the top of the page
 
+Quote Post
sKWO
сообщение Mar 9 2008, 10:33
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 355
Регистрация: 27-03-07
Из: Україна, Чуднів
Пользователь №: 26 530



Добрый всем день! Народ подыму старую тему.
Люди, подскажите, что я делаю не так? переписываю драйвер для ГЖКИ 128х64 с винавра на иар
ИАР для АВР версия 4.21А.
пишу:
Код
#include <pgmspace.h>
....
//основная функция
int main(void) {
               ...
               ...
    LoadBitmap(IMAGE);//////////// ОШИБКА Error[Pe167]
    
}
// функция для загрузки карты
void LoadBitmap(unsigned char *bitmap)
{
  
uint16_t i, j,by;
for(i=0; i<64; i+=8)

        for(j=0; j<128; j++)
        {
            by = printf_P(bitmap++); /////////// ОШИБКА Error[Pe167]
            ks0108GotoXY(j, i);
            ks0108WriteData(by);
        }
}
// и сама карта (массив)
#define LCD_WIDTH 128
const __flash uint8_t IMAGE[] = {
.....
.....
    };

void LoadBitmap(uint8_t *bitmap);

Ну и соответственно и еррор:
Error[Pe167]: argument of type "unsigned char const __flash *" is incompatible with parameter of type "uint8_t *"

В общем на форуме видел сходную ветку : Как заставить помещать строки во флэш
созданную Протоссом, соответственно в опциях проекта в закладке "C compiler" -> "Extra Options"
поставил птицу "Use command line options" и набрал строчку --string_literals_in_flash
НИЧЕГО. В общем IgorKossak знает ответ но чего-то помоему недоговаривает.

Вобщем то ключевые слова signed и unsigned обычно применяются к обьектам, содержащим по смыслу числовые значения.
Что же касается символьных обьектов и строк на их основе, то общепринятым типом в этом случае является просто char.
Поэтому и обьявления в pgmspace.h вполне оправданные и корректные.
Я НХ не понял!!чёто туго
Решил проблему частично так, создал следующую функцию по совету &-rey :
Код
FuncFlash(char __flash *str_)
{
  while (*str_++ != 0);
}

ну и соответственно ее вызов для чтения массива в памяти программ
by = FuncFlash((char __flash*)(bitmap++));

Но с использованием стандартных функций ИАР темно.
теперь выдаёт только одну туже ошибку на LoadBitmap(IMAGE);//////////// ОШИБКА Error[Pe167]
Error[Pe167]: argument of type "char const __flash *" is incompatible with parameter of type "char __flash **"
в общем прикреплю файлы, может кто поможет ? это не горит. Буду признателен по любой информации загрузки (выдачи) массива данных из памяти программ по определённому алгоритму.
Спасибо.
Прикрепленные файлы
Прикрепленный файл  ks0108.zip ( 58.28 килобайт ) Кол-во скачиваний: 28
 


--------------------
нельзя недооценивать предсказуемость глупости
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Mar 9 2008, 12:33
Сообщение #4


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Вы запутались в указателях.
char * - указатель на char
char const * - указатель на константный char.
"Обычный" язык С не знает ничего о флеш, для него cont - всего лишь указание, что данные read-only.
Через указатель на константные данные вы их можете читать. Через обычный указатель - читать и писать. Поэтому вы можете свободно присвоить неконстантный указатель константному - тем самым вы лишь ограничиваете доступ к данным. А вот обратное присвоение запрещено - ибо таким образом вы могли бы полуучить доступ на запись к данным read-only (на самом деле такое присвоение возможно, но лишь с явным приведением типов и оно целиком на совести программиста). Вот компилятор в вашем случае и ругается - вы пытаетесь при помощи указателя получить доступ на запись к константному объекту.
Вам надо прототип функции объявить как FuncFlash(char const __flash *str_), ибо массив, который вы пытаетесь ей передать - константный (const __flash uint8_t IMAGE[] = ....)


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post



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

 


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


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