|
|
  |
Работа с EEPROM STM8 в IAR, Дописываем библиотеки для работы модификатора __eeprom |
|
|
|
Nov 19 2017, 07:47
|

Профессионал
    
Группа: Свой
Сообщений: 1 261
Регистрация: 14-05-09
Из: Челябинск
Пользователь №: 49 045

|
Цитата(VladislavS @ Nov 18 2017, 22:10)  Во-первых, зачем на ЯВУ знать адреса переменных? Мне вот обычно фиолетово как они расположены. В еепром кофигурацию прибора (адрес свой, адрес сервера, всякие периоды, коефициенты и т.п.). Я вычитываю в ПК дамп памяти и в пк разбераю - что есть что, также дамп из пк записываю в мк. Нужно знать, где и что. Цитата Во-вторых, есть директивы, привязывающие переменные к фиксированным адресам #pragma location = 0x100C не сработала эта деректива с __еепром Цитата Сделайте одну структуру для всех переменных в eeprom, в структуре компилятор переставлять поля не станет. Да, так и придется делать. Спасибо
|
|
|
|
|
Nov 19 2017, 13:27
|
Гуру
     
Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136

|
Цитата(pittyalex @ Nov 18 2017, 12:27)  но как ему это подсказать, я не знаю. Вернее, возможно ли это в принципе. Скорее всего нет, конечно. Я бы не стал тратить на это время. Если реально поджимает, программирование на ассмблере куда реалистичнее. Всё-таки основное свойство компилятора - выдавать корректный код, и яр для стм8 с этим справляется. Выдавать более оптимальный код - это следующая задача, и руки у них до этого не дошли, очевидно. Кстати, яр для Coldfire может отлично оптимизировать, но при этом иногда выдаёт нерабочикй код (md5, к примеру)
|
|
|
|
|
Nov 19 2017, 17:56
|
Группа: Участник
Сообщений: 9
Регистрация: 14-11-17
Пользователь №: 100 189

|
Цитата(juvf @ Nov 19 2017, 07:47)  В еепром кофигурацию прибора (адрес свой, адрес сервера, всякие периоды, коефициенты и т.п.). Я вычитываю в ПК дамп памяти и в пк разбераю - что есть что, также дамп из пк записываю в мк. Нужно знать, где и что.
#pragma location = 0x100C не сработала эта деректива с __еепром
Да, так и придется делать. Спасибо Попробовал сделать по стандартной схеме: __eeprom __no_init uint16_t countStarts @0x4030; //0,1 __eeprom __no_init uint16_t period@ 0x4040; //2,3 И всё заработало. А у вас что за камень, где еепром с адреса 0х1000??? Может поэтму у вас компилятор отказался выполнять такую директиву? Стандартно у СТМ8 адрес 0х1000 попадает в RAM, а еепром начинается с 0х4000, флеш с 0х8000, так что я так и не понял, куда это вы хотели писать... на всех стм8 вроде как область памяти 0х1000 не задействована (ну нет у них 4кБ ОЗУ, или я не помню, может в самых старших моделях).
|
|
|
|
|
Nov 20 2017, 04:37
|
Участник

Группа: Участник
Сообщений: 52
Регистрация: 5-05-17
Пользователь №: 96 902

|
У меня @0x4030 - такой "стандартный" способ не работает, не знаю почему Код __eeprom __no_init uint16_t countStarts @0x1004; ошибка компилятора Цитата Error[Li005]: no definition for "countStarts" [referenced from C:\Users\stm8\stm8L_sh\Debug\Obj\main.o] Камень stm8l051. см рис. Без явного указания адреса компилятор сам делает мэп в область 0х1000 Код "P6-P8": 0x19 .eeprom.noinit uninit 0x001000 0x10 varInEeprom.o [1] .eeprom.noinit uninit 0x001010 0x2 varInEeprom.o [1]
Сообщение отредактировал razrab83 - Nov 20 2017, 04:39
Эскизы прикрепленных изображений
|
|
|
|
|
Nov 20 2017, 10:20
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(pittyalex @ Nov 18 2017, 11:27)  Я понимаю, что компилятор не может догадаться, что размер массива меньше байта, поэтому индекс не может (не должен) быть больше размера массива, т.е. байта и нет необходимости выполнять 16 битное умножение, но как ему это подсказать, я не знаю. А какой версией IAR это скомпилено? Предполагаю что старой (v2.xx) и без оптимизации. У меня подобный код (с кучей 16-битных операций) генерит старый v2.20 и с выключенной оптимизацией. Со включенной оптимизацией уже гораздо лучше. А новый IAR (3.с чем-то) генерит гораздо лучше.
|
|
|
|
|
Nov 20 2017, 11:20
|

Профессионал
    
Группа: Свой
Сообщений: 1 261
Регистрация: 14-05-09
Из: Челябинск
Пользователь №: 49 045

|
Цитата struct eeprom_layout volatile* const eeprom = (void volatile*)0x4000; -это даже не компиляется. )) Цитата(scifi @ Nov 20 2017, 11:38)  Не понимаю я, зачем нужны все эти выкрутасы. за тем, что еппром != озу. ваш код будет работать с переменной в ОЗУ. А 0х4000 (или 0х1000) - это епром.
|
|
|
|
|
Nov 20 2017, 12:02
|
Гуру
     
Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136

|
Цитата(juvf @ Nov 20 2017, 14:20)  -это даже не компиляется. )) Сочувствую. У меня компиляется. Цитата(juvf @ Nov 20 2017, 14:20)  за тем, что еппром != озу. ваш код будет работать с переменной в ОЗУ. А 0х4000 (или 0х1000) - это епром. Снова сочувствую, у меня работает. Прежде чем будет новая порция негатива, уточню, что для записи в EEPROM использую специально для этого сделанные функции. Зачем их прятать за оператором присваивания, снова не пойму.
|
|
|
|
|
Nov 21 2017, 04:16
|
Местный
  
Группа: Свой
Сообщений: 475
Регистрация: 14-04-05
Из: Москва
Пользователь №: 4 140

|
Цитата(scifi @ Nov 20 2017, 15:02)  Зачем их прятать за оператором присваивания, снова не пойму. Затем же за чем придумали языки высокого уровня.
|
|
|
|
|
Nov 21 2017, 09:16
|

Профессионал
    
Группа: Свой
Сообщений: 1 261
Регистрация: 14-05-09
Из: Челябинск
Пользователь №: 49 045

|
Цитата(scifi @ Nov 20 2017, 17:02)  Прежде чем будет новая порция негатива где вы видите негатив? Цитата , уточню, что для записи в EEPROM использую специально для этого сделанные функции. Зачем их прятать за оператором присваивания, снова не пойму. ах да, сорри, проглядел ваш const. Речь идет о том, как разместить переменные по заданному адресу в флеше с модификатором __eeprom, вы взамен переменных предлагаете константные переменные . Что к чему?
|
|
|
|
|
Nov 22 2017, 21:36
|
Группа: Участник
Сообщений: 9
Регистрация: 14-11-17
Пользователь №: 100 189

|
Цитата(jcxz @ Nov 20 2017, 10:20)  А какой версией IAR это скомпилено? Предполагаю что старой (v2.xx) и без оптимизации. У меня подобный код (с кучей 16-битных операций) генерит старый v2.20 и с выключенной оптимизацией. Со включенной оптимизацией уже гораздо лучше. А новый IAR (3.с чем-то) генерит гораздо лучше. С выключенной оптимизацией и самая последняя версия.
|
|
|
|
|
Nov 23 2017, 19:28
|
Группа: Участник
Сообщений: 9
Регистрация: 14-11-17
Пользователь №: 100 189

|
Цитата(jcxz @ Nov 23 2017, 08:48)  Хм... Включать не пробовали?  Нет, после включения оптимизации иногда код понять совершенно не возможно, да и не всегда потом, говорят, работает. Пока места хватает и производительности, не вижу смысла включать. В) ХОтя если будет время, надо будет на том же самом месте эксперимент поставить. Спасибо за "наводку".
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|