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

 
 
 
Reply to this topicStart new topic
> Использование FLASH памяти, Перенос части кода в FLASH память
Andrew_k5
сообщение Nov 19 2009, 09:22
Сообщение #1


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

Группа: Участник
Сообщений: 77
Регистрация: 15-02-07
Из: Днепропетровск
Пользователь №: 25 387



Хочу перенести константы строковые во флеш, как это сделать. Есть ф-ция вывода на экран сообщения stroka (volatile flash unsigned char *str,volatile unsigned char nstr)

Нужное сообщение вывожу командой stroka(" PRIMER TEKSTA ",1); Как бы все возможные выводимые сообщения хранить во флеш памяти.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 19 2009, 09:26
Сообщение #2


Гуру
******

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



Цитата(Andrew_k5 @ Nov 19 2009, 11:22) *
Как бы все возможные выводимые сообщения хранить во флеш памяти.
Теперь все дружно напряглись и телепатически пытаются определить тип контроллера (AVR/PIC) и используемый вами компилятор.


--------------------
На любой вопрос даю любой ответ
"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
Andrew_k5
сообщение Nov 19 2009, 09:28
Сообщение #3


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

Группа: Участник
Сообщений: 77
Регистрация: 15-02-07
Из: Днепропетровск
Пользователь №: 25 387



Mega16
CodeVisionAVR 1.25.5 Professional

Сообщение отредактировал Andrew_k5 - Nov 19 2009, 09:30
Go to the top of the page
 
+Quote Post
defunct
сообщение Nov 19 2009, 19:37
Сообщение #4


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(Andrew_k5 @ Nov 19 2009, 11:28) *
Mega16 CodeVisionAVR 1.25.5 Professional

Пример как это сделать в IAR'е. По аналогии можете применить себе:

Код
#include <stdlio.h>

#ifdef __IAR_SYSTEMS_ICC__

    #if defined(__IOM128_H)
    #define PROGMEM __farflash
    #elif defined(__IOM64_H) || defined(__IOM162_H)
    #define PROGMEM __flash
    #endif
    
#endif


#define pgm_print(x) do {\
    static const U8 PROGMEM str[] = x;\
        __pgm_print( str );\
} while(0)

#define pgm_printf(x, ...) do {\
    static const U8 PROGMEM pgm_str[] = x;\
    char pgm_data_buf[sizeof(pgm_str)];\
    __pgm_strcpy( pgm_data_buf, pgm_str);\
    printf( pgm_data_buf, __VA_ARGS__);\
} while(0)

void __pgm_print(const U8 PROGMEM *str);
void __pgm_strcpy(char *dst, const U8 PROGMEM *str);

в программе пользую:

pgm_print("simple string");
pgm_printf("format string x = %d", x);
Go to the top of the page
 
+Quote Post
-JonnS-
сообщение Nov 19 2009, 19:54
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 72
Регистрация: 7-05-07
Из: Болгария
Пользователь №: 27 577



Например так:
Код
[/code]

char __flash Hello[]={"Hello boy's"};
....
void main()
{
....
   lcd_putsf(Hello);
.....
}


void lcd_putsf(unsigned char __flash *str)
{
unsigned char Count=0;

while (str[Count]!=0x00)
  {
  lcd_putchar(str[Count]);   // Вывод на LCD
  Count++;
  }
}
Go to the top of the page
 
+Quote Post
Andrew_k5
сообщение Nov 20 2009, 06:09
Сообщение #6


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

Группа: Участник
Сообщений: 77
Регистрация: 15-02-07
Из: Днепропетровск
Пользователь №: 25 387



В IARе наверное не разберусь, для вывода на LCD не использую стандартные функции. Как передать строковую константу в stroka (volatile flash unsigned char *str,volatile unsigned char nstr)
Допустим есть flash char string[]="This is a string constant"; и есть volatile unsigned char buf_lcd[BUFFER_SIZE] не получается написать buf_lcd[]=string[];

Сообщение отредактировал Andrew_k5 - Nov 20 2009, 06:10
Go to the top of the page
 
+Quote Post
WHALE
сообщение Nov 20 2009, 06:36
Сообщение #7


Знающий
****

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



1.Зачем в этим функциях volatile?
2.Покурите в хэлпе CV или в любой книжке по С String Functions.Для данного случая(для СV)нужна функция strcpyf.


--------------------
"Hello, word!" - 17 errors 56 warnings
Go to the top of the page
 
+Quote Post
defunct
сообщение Nov 20 2009, 11:46
Сообщение #8


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(Andrew_k5 @ Nov 20 2009, 08:09) *
В IARе наверное не разберусь

Дык идея просто создать макрос, который будет сразу объявлять строку как flash и вызывать вашу функцию:

Код
#define  my_stroka(x, y) do {\
          static char flash str[] = x;\
          stroka( str, y);\
} while (0)


my_stroka("kuku", 55);
Go to the top of the page
 
+Quote Post

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

 


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


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