02.05.2013, 09:40
|
|
Прописка
Регистрация: 31.03.2013
Сообщений: 146
Сказал спасибо: 50
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Вопросы stmfaq
В моей программе много глобальных массивов констант, можно ли их разместить в eeprom ? На AVR это можно было делать а как это сделать в STM8S105? Если можно разместить, то как это может повлиять на скорость и стабильность выполнение программы, или лучше этого не делать?
|
|
|
|
02.05.2013, 11:29
|
|
Прописка
Регистрация: 15.11.2007
Адрес: СПБ
Сообщений: 214
Сказал спасибо: 37
Сказали Спасибо 42 раз(а) в 34 сообщении(ях)
|
Re: FAQ по STM8
На STM нету EEPROM, можно размещать в памяти программ или подключить внешний EEPROM по I2C
|
|
|
|
02.05.2013, 11:42
|
|
Почётный гражданин KAZUS.RU
Регистрация: 10.01.2007
Сообщений: 3,412
Сказал спасибо: 65
Сказали Спасибо 664 раз(а) в 443 сообщении(ях)
|
Re: FAQ по STM8
Сообщение от stmfaq
|
можно ли их разместить в eeprom ? На AVR это можно было делать а как это сделать в STM8S105?
|
Да точно также - указав соответствующий storage modifier. Смотрите __eeprom в хэлпе компилятора:
__________________
There's always more than one way to skin a cat.
Последний раз редактировалось tempora; 02.05.2013 в 11:45.
|
|
|
Эти 2 пользователя(ей) сказали Спасибо tempora за это сообщение:
|
|
|
02.05.2013, 11:47
|
|
Почётный гражданин KAZUS.RU
Регистрация: 19.08.2006
Адрес: Львов
Сообщений: 1,616
Сказал спасибо: 65
Сказали Спасибо 315 раз(а) в 264 сообщении(ях)
|
Re: FAQ по STM8
Сообщение от a-fisher
|
На STM нету EEPROM, можно размещать в памяти программ или подключить внешний EEPROM по I2C
|
Ты не прав, Федя! STM8S003, STM8S103...
__________________
С уважением,
Vic / ut1wpr
|
|
|
|
02.05.2013, 16:09
|
|
Прописка
Регистрация: 31.03.2013
Сообщений: 146
Сказал спасибо: 50
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: FAQ по STM8
Сообщение от tempora
|
Да точно также - указав соответствующий storage modifier. Смотрите __eeprom в хэлпе компилятора:
|
Посмотрел но не сильно разобрался .
Сделал так
Код:
|
__eeprom unsigned char md5crypt [4][64]={............. |
Компилятор выругался Error[Ta004]: __eeprom variable must be __no_init
Посмотрел что это такое,ниже прикрепил описание,я так понял что так нельзя обьявлять переменную , а нужно что то типа такого
Код:
|
unsigned char md5crypt[4][64] @ "eeprom" = {.... |
Но для такого объявления нужно что то настроить в линкере, что я так и не понял. Есть ли вообще смысл пихать глобальные константы в eeprom ? Дело в том что у меня уже много места занято под глобальные переменные, а написано только 50% программы. Поэтому решил перетащить их в EEPROM .
Обьясните пожалуйста на пальцах, что нужно настроить в IAR , чтобы можно было размещать глобальные переменные в EEPROM таким образом
Код:
|
unsigned char md5crypt[4][64] @ "eeprom" = {.... |
? А то из описаний на англ языке не сильно понятно что делать.
Последний раз редактировалось stmfaq; 02.05.2013 в 16:12.
|
|
|
|
02.05.2013, 16:38
|
|
Временная регистрация
Регистрация: 08.02.2010
Сообщений: 62
Сказал спасибо: 4
Сказали Спасибо 14 раз(а) в 12 сообщении(ях)
|
Re: FAQ по STM8
компилятор вам правильно говорит - он не может инициализировать переменную в EEPROM, поэтому ее нужно обьявлять как __no_init , а где то в основном цикле инициализировать(перед этим разрешить запись в EEPROM)
|
|
|
|
02.05.2013, 17:04
|
|
Прописка
Регистрация: 31.03.2013
Сообщений: 146
Сказал спасибо: 50
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: FAQ по STM8
Сообщение от s64
|
поэтому ее нужно обьявлять как __no_init , а где то в основном цикле инициализировать(перед этим разрешить запись в EEPROM)
|
Так что делать нужно так __no_init unsigned char md5crypt [4][64]={..
?
а как инициализировать? Пример можно?
А если мне не нужно изменять значение констант , зачем нужно разрешать запись в eeprom ? И если это нужно то как разрешить без использования SPL, что в какой регистр нужно записать?
|
|
|
|
02.05.2013, 17:18
|
|
Почётный гражданин KAZUS.RU
Регистрация: 19.08.2006
Адрес: Львов
Сообщений: 1,616
Сказал спасибо: 65
Сказали Спасибо 315 раз(а) в 264 сообщении(ях)
|
Re: FAQ по STM8
Сообщение от stmfaq
|
Так что делать нужно так __no_init unsigned char md5crypt [4][64]={..
?
а как инициализировать? Пример можно?
А если мне не нужно изменять значение констант , зачем нужно разрешать запись в eeprom ? И если это нужно то как разрешить без использования SPL, что в какой регистр нужно записать?
|
Путь непрост и тернист.
Нужны кое-какие знания и понимание структуры HEX-файлов.
Абстрагируясь от МК вообще, нужно сгенерировать массив данных, которые предполагается хранить в eeprom. Затем преобразовать в hex-формат. И наконец, используя STVP загрузить это файл и записать его в адреса по закладке DATA. Эти данные будут доступны для чтения и недоступны для модификации без принятия особой меры по разблокировке этой области памяти на запись.
Иначе в самом начале программы придется переписывать данные из выделенной части флеша в область eeprom (через эту самую разблокировку с последующей блокировкой) и смирится с поетрянной частью флеша, которая могла бы быть занята кодом.
Если данных для хранения немного, то можно их записать вручную прямо в среде STVP. Та еще работка.
__________________
С уважением,
Vic / ut1wpr
|
|
|
|
02.05.2013, 17:31
|
|
Почётный гражданин KAZUS.RU
Регистрация: 10.01.2007
Сообщений: 3,412
Сказал спасибо: 65
Сказали Спасибо 664 раз(а) в 443 сообщении(ях)
|
Re: FAQ по STM8
Сообщение от stmfaq
|
Есть ли вообще смысл пихать глобальные константы в eeprom ? Дело в том что у меня уже много места занято под глобальные переменные, а написано только 50% программы.
|
Смысл писать что-то в EEPROM возникает только когда это настроечные данные, то есть - подлежат изменению во время работы ( калибровочные константы, запомненные последние режимы и т.д.). Если же это константы, то проще держать их во флеши, тем более, что EEPROM'а-то не шибко много, значительно меньше, чем флеши.
В приведенной цитате из "Technical Note 32477" написано, что в настоящий момент не реализованы поцедуры инициализации данных, размещенных в EEPROM, то есть, данные там должны быть записаны заранее, а в программе они д.б. объявлены как __no_init. Далее обещается, что такие процедуры будут реализованы в следующих версиях, однако, Вам от этих следующих версий не будет никакого проку, поскольку Ваши данные - константы. То есть, по существу, эти следующие версии будут уметь переписывать инициализированные данные из флеши (куда компилятор поместит их двоичный образ) в еепром, чтобы там они могли быть изменены работающей программой. То есть, эти данные займут место и во флеши (там расположен их образ), и в еепроме, куда они могут быть скопированы процедурами инициализации сегментов памяти. Таким образом, удвоенный объем занимаемый этими данными в кристалле - это цена за возможность их и автоматически инициализировать и менять программно.
Ваша же цель, как я понял, совсем другая - убрать из ОЗУ константы, которые ни инициализации, ни изменению не подлежат, поэтому, либо объявляете эти данные "__eeprom __no_init" и записываете их в еепром заранее самостоятельно ( возникнет проблема ручного распределения памяти), либо держите свои константы в памяти программ.
__________________
There's always more than one way to skin a cat.
|
|
|
|
02.05.2013, 17:33
|
|
Прописка
Регистрация: 31.03.2013
Сообщений: 146
Сказал спасибо: 50
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: FAQ по STM8
Жесть какая. Я думал что просто перед массивом констант поставлю модификатор и скомпилирую прошью МК и все дела. У меня табличных данных очень много, порядка 1000 кбайт. Ручной набор отпадает. Я вот не пойму есть у меня допустим массив unsigned char hash [40],я его преобразую в HEX файл? прошиваю , а как потом программа поймет где находится мой массив в eeprom ? или перед массивом указывается заголовок с названием моего массива? Чувствую я этого не осилю, наверно придется отказаться от некоторых функций девайса, иначе я все не впихну, жаль планы были грандиозные но кишка тонка.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 02:08.
|
|