16.05.2015, 15:12
|
|
Почётный гражданин KAZUS.RU
Регистрация: 07.10.2007
Адрес: Луганск
Сообщений: 1,816
Сказал спасибо: 13
Сказали Спасибо 399 раз(а) в 214 сообщении(ях)
|
IAR STM8 указатель на массив во FLASH
Кто подскажет, моно ли применять указатель на массив во FLASH?
У STM8 непрерывное адресное пространство , и я надеялся что массивы во FLASH и RAM равноправны.
Код:
|
const unsigned char string_flash[]={"бла бла бла"}; //массив FLASH
unsigned char *pointer_string; //указатель
//---
main (void){
pointer_string = string_flash; // ругается компилятор
a value of type "unsigned char const *" cannot be assigned to an entity of type "unsigned char"
} |
Я пока выкрутился так - копирую массив FLASH в массив RAM, и на него указатель. Но это расход RAM и время на копирование.
Код:
|
const unsigned char string_flash[]={"бла бла бла"}; //массив FLASH
unsigned char string_ram[11]; //массив RAM
unsigned char *pointer_string; //указатель
//---
main (void){
memmove(string_flash,string_ram, 11 );//11- длина массива.
pointer_string = string_ram; // указатель на массив RAM
} |
Вот такой вариант тоже работает, но нужно указывать адрес массива, и если массивов много, то не удобно рассчитывать адреса.
Код:
|
#pragma location=0x9000 //начальный адрес FLASH
unsigned string_flash[] = {"бла бла бла"};
unsigned char *pointer_string; //указатель
main (void){
pointer_string = string_flash; // указатель на массив RAM
} |
Но хотелось бы от такого геммороя избавится. Чего посоветуете?
__________________
"picavr(ГАВ)мыло.ру" USB_Analyzer, Digital_Storage_Oscilloscope "picavr.kr1.ru" заказы в Китай компонентов/изготовление: плат/ЖКИ/мембраных клавиатур/имп трансформаторов
Последний раз редактировалось picavr; 16.05.2015 в 15:23.
|
|
|
|
16.05.2015, 15:44
|
|
Заблокирован
Регистрация: 21.01.2014
Сообщений: 589
Сказал спасибо: 7
Сказали Спасибо 267 раз(а) в 206 сообщении(ях)
|
Re: IAR STM8 указатель на массив во FLASH
А если в первом примере объявить указатель на константу, типа так:
Цитата:
|
const unsigned char *pointer_string; //указатель
|
|
|
|
|
16.05.2015, 17:10
|
|
Гражданин KAZUS.RU
Регистрация: 05.04.2009
Сообщений: 976
Сказал спасибо: 35
Сказали Спасибо 155 раз(а) в 134 сообщении(ях)
|
Re: IAR STM8 указатель на массив во FLASH
может пригодится - в авр иаре работало, в стм иаре не ругается:
Код:
|
#define LCDPutsFlash(s) {static const unsigned char str[] = s; LCD_Putsf(str);}
void LCD_Data(unsigned char data)
{
//......
data++;
//......
}
void LCD_Putsf(unsigned char const *str)
{
unsigned char temp;
while (temp = *str++) LCD_Data(temp);
}
int main( void )
{
LCDPutsFlash("bla-bla");
return 0;
} |
|
|
|
|
17.05.2015, 07:32
|
|
Почётный гражданин KAZUS.RU
Регистрация: 07.10.2007
Адрес: Луганск
Сообщений: 1,816
Сказал спасибо: 13
Сказали Спасибо 399 раз(а) в 214 сообщении(ях)
|
Re: IAR STM8 указатель на массив во FLASH
Сообщение от Yurkin2014
|
указатель на константу, типа так:
|
так получилось, спасибо. Но не совсем понятно вот что: я предполагал что всё с квалификатором CONST распологается во FLASH. А почему тогда указатель такого типа расположился в RAM ?.
Потому что УКАЗАТЕЛЬ? А я то думал указатель тоже будет во FLASH и изменять его будет сложно )))
В общем в результате, обьединил вывод стрингов через указатели из FLASH и RAM в одну функцию, до того их было две )))
Сообщение от oleg110592
|
в стм иаре не ругается:
|
Примерно так и написано, но мне удобнее обьявить массивы текстов во FLASH, а потом выводить их по указателю, так более гибче. А не писать текст в вызове функции.
Код:
|
const unsigned char string1[4]={text1};
const unsigned char string2[4]={text2};
const unsigned char string3[4]={text3};
const unsigned char *pointer_string;
void lcd_line(const unsigned char *string){
}
main (void){
pointer_string=string1;
lcd_line(pointer_string);
pointer_string=string2;
lcd_line(pointer_string);
pointer_string=string3;
lcd_line(pointer_string);
} |
__________________
"picavr(ГАВ)мыло.ру" USB_Analyzer, Digital_Storage_Oscilloscope "picavr.kr1.ru" заказы в Китай компонентов/изготовление: плат/ЖКИ/мембраных клавиатур/имп трансформаторов
Последний раз редактировалось picavr; 17.05.2015 в 07:48.
|
|
|
|
17.05.2015, 10:18
|
|
Гражданин KAZUS.RU
Регистрация: 25.11.2010
Сообщений: 516
Сказал спасибо: 1
Сказали Спасибо 126 раз(а) в 109 сообщении(ях)
|
Re: IAR STM8 указатель на массив во FLASH
Во первых, учи матчасть.
Во вторых, учи матчасть.
В третьих -ну ты понял.
В итоге родишь что-то типа:
const char *SomeString = "bla bla bla"; // указатель-константа во флеше на строку также расположенную во флеше
далее пихай этот указатель куда хочешь
PS массив строк объявляется аналогично
|
|
|
|
19.05.2015, 07:01
|
|
Почётный гражданин KAZUS.RU
Регистрация: 07.10.2007
Адрес: Луганск
Сообщений: 1,816
Сказал спасибо: 13
Сказали Спасибо 399 раз(а) в 214 сообщении(ях)
|
Re: IAR STM8 указатель на массив во FLASH
Дык я уже всё сделал так как я и хотел... ))))).
Сообщение от Hives
|
указатель-константа во флеше на строку также расположенную во флеше
|
А я не хочу что бы Указатель располагался во FLASH.
Тогда для вызова функции указатель во FLASH - тоже самое что и строка во FLASH.
Для вывода новой строки в вызове придётся писать новый Указатель.
Т.е. для вывода РАЗНЫХ строк - написать РАЗНЫЕ ВЫЗОВЫ.
Я хотел указатель настраивать на РАЗНЫЕ строки, а в вызове функции ничего не менять.
Только перенастраивать указатель на разные строки.
Но уже всё сделано ... )))
__________________
"picavr(ГАВ)мыло.ру" USB_Analyzer, Digital_Storage_Oscilloscope "picavr.kr1.ru" заказы в Китай компонентов/изготовление: плат/ЖКИ/мембраных клавиатур/имп трансформаторов
|
|
|
|
19.05.2015, 09:12
|
|
Гражданин KAZUS.RU
Регистрация: 25.11.2010
Сообщений: 516
Сказал спасибо: 1
Сказали Спасибо 126 раз(а) в 109 сообщении(ях)
|
Re: IAR STM8 указатель на массив во FLASH
8/
я надеюсь вы не на ядерной станции работаете...
|
|
|
|
19.05.2015, 11:27
|
|
Почётный гражданин KAZUS.RU
Регистрация: 08.06.2008
Сообщений: 1,394
Сказал спасибо: 4
Сказали Спасибо 183 раз(а) в 167 сообщении(ях)
|
Re: IAR STM8 указатель на массив во FLASH
PHP код:
|
const unsigned char Text_1[ ] = "1234567";
void ProgText( unsigned char* t )
{
unsigned char sym;
while( *t )
{
sym = *t++;
}
}
///////++++++++++++
int main()
{
ProgText( (unsigned char *)Text_1 );
ProgText( Text_1) ;
}
|
Почувствуйте разницу !!!
И посмотрите что такое приведение типов.
И будет все просто как мычание
|
|
|
|
19.05.2015, 11:40
|
|
Гуру портала
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 919
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
|
Re: IAR STM8 указатель на массив во FLASH
У человека каша в голове.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 07:13.
|
|