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

 
 
> Как заставить помещать строки во флэш?
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
sKWO
сообщение Mar 9 2008, 17:44
Сообщение #5


Местный
***

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



В общем огромнейшее спасибо Вам, Сергей Борщ!!!!!!!!!
Получилось так:
в хедере Bitmap.h массив карты const __flash char IMAGE[];
в Bitmap.с написал так
Код
FuncFlash(char __flash *str_)
{
  while (*str_++ != 0);
}
void LoadBitmap(char const __flash *bitmap)
{
  
uint16_t i, j,by;
for(i=0; i<64; i+=8)

        for(j=0; j<128; j++)
        {
                   by = FuncFlash((char __flash*)(bitmap++));
                   //by = printf_P(bitmap++);
                   ks0108GotoXY(j, i);
                   ks0108WriteData(by);
                            }

}

Всё работает , даже by = printf_P(bitmap++); не выдаёт ошибку. Правда после 167 ошибки вылезла 27
27 Entry entry in module module (file) redefined in module module (file)
There are two or more entries with the same name. XLINK aborts immediately.
пришлось #include "Bitmap.h" в котором находится массив обявить его как extern ну и прототип функции
соответственно:
Код
Основной модуль программы
//#include "Bitmap.h"

extern void LoadBitmap(char const __flash *bitmap);
extern const __flash char IMAGE[];
int main(void) {
........
........
LoadBitmap(IMAGE);
    while(1);
}

Ну ошибок и нету. Правда проверить на реальном ГЖКИ не могу, нету внутреннего
источника отрицательного напряжения для установки контрассности ну и демоплаты.
Протеус не признаю (люблю "живое" железо) smile.gif

Но непонятки (скрытая тревога) остались. Написал так:
Код
FuncFlash(char const __flash *str_)
{
  while (*str_++ != 0);
}

void LoadBitmap(char const __flash *bitmap)
{
  
uint16_t i, j,by;
for(i=0; i<64; i+=8)

        for(j=0; j<128; j++)
        {
                        by = FuncFlash((char const __flash*)(bitmap++));
                        //by = printf_P(bitmap++);
                        ks0108GotoXY(j, i);
                        ks0108WriteData(by);
                }

}

Появилось предупреждение:
Warning[w6]: Type conflict for external/entry "FuncFlash", in module ks0108 against external/entry in module Bitmap;
function types differ in parameter 1; types have different type attributes
/* In module ks0108: */
/* Function, args 1, attr 0 */
int (__version_3 FuncFlash)(char __flash *);
/* In module Bitmap: */
/* Function, args 1, attr 0 */
int (__version_3 FuncFlash)(char __flash const *);
Прикрепленные файлы
Прикрепленный файл  ks0108.zip ( 61.99 килобайт ) Кол-во скачиваний: 25
 


--------------------
нельзя недооценивать предсказуемость глупости
Go to the top of the page
 
+Quote Post



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

 


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


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