Программирование STM8

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить
Друг Кота
Аватара пользователя
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Сообщение oleg110592 »

const да
еепром имхо так удобнее:
http://radiokot.ru/forum/viewtopic.php? ... 6#p2691126
Реклама
Электрический кот
Сообщения: 1040
Зарегистрирован: Вс сен 25, 2011 19:09:33

Сообщение axillent »

Спасибо! Заработало
У меня правда не SPL, поэтому немного переписал:

Код: Выделить всё

			FLASH_DUKR = 0xAE;
			FLASH_DUKR = 0x56;
			while (!FLASH_IAPSR_DUL);
			photo.max = max;
			//while (!FLASH_IAPSR_EOP);
			FLASH_IAPSR_DUL = 0; //EEPROM lock
а флаг EOP не нужно проверять? Он у меня почему-то остается в нуле

если я правильно понял то использование __eeprom сильно удобнее. Можно размещать много переменных и они автоматически разместятся в отличии от location который нужно руками контролировать
во вторых __eeprom позволяет инициализировать переменные в eeprom.
в третьих (если верно понял) операция записи становится с точки зрения Си такой же точно как при работе с RAM

но вот только не могу найти описание. Линкер ругается на отсутствие опимсания трех спец функций которые нужно описать
документация отсылает к прототипам в файле stm8/src/lib/eeprom_util.c
у меня этого файла нет, в этой папке есть архив EWSTM8-library-source.exe
возможно файл в архиве, но архив запаролен

в поисковике ничего найти на этот счет не могу, похоже никто не разобрался как __eeprom использовать или я плохо искал?
Реклама
Друг Кота
Сообщения: 6457
Зарегистрирован: Пт сен 13, 2013 13:11:31

Сообщение a5021 »

axillent писал(а):значит использование pragma в IAR для изменения порядка ни к чему хорошему не приведет и буду тогда ручками при приеме.передачи переворачивать
Интересно, а можно ли включить эту прагму локально, когда область ее действия будет ограничена, скажем, одним программным блоком? Получится таким образом раскладывать входящий поток двухбайтовых значений в правильном порядке? Например, вытаскивая калибровочные данные из того же BMP180, приходится вручную переставлять байты, а так бы это можно было свалить на компилятор.
Вымогатель припоя
Аватара пользователя
Сообщения: 616
Зарегистрирован: Вс ноя 01, 2015 13:13:49

Сообщение scorpi_0n »

axillent писал(а): в поисковике ничего найти на этот счет не могу, похоже никто не разобрался как __eeprom использовать или я плохо искал?
Плохо искали. На казусе пару раз точно разжёвывали. Да и на изи вам уже ответили.
Реклама
Эиком - электронные компоненты и радиодетали
Вымогатель припоя
Аватара пользователя
Сообщения: 616
Зарегистрирован: Вс ноя 01, 2015 13:13:49

Сообщение scorpi_0n »

a5021 писал(а): Интересно, а можно ли включить эту прагму локально, когда область ее действия будет ограничена, скажем, одним программным блоком?
Можно.
Реклама
Друг Кота
Сообщения: 6457
Зарегистрирован: Пт сен 13, 2013 13:11:31

Сообщение a5021 »

Надо будет на досуге попробовать. Правда не понятно, что будет происходить с локальными переменными длиной больше одного байта внутри этого блока, случись их там использовать. Типа, счетчиков цикла, указателей и пр.
Реклама
Электрический кот
Сообщения: 1040
Зарегистрирован: Вс сен 25, 2011 19:09:33

Сообщение axillent »

Для bmp180 это не особо то и нужно, там вме равно логика расчета по байтам
Если конечно там так же как с bmp085
С bmp085 у меня проблем не возникло
Друг Кота
Аватара пользователя
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Сообщение oleg110592 »

axillent писал(а):У меня правда не SPL...
нету там SPL - просто хидер не иаровский а от производителя - "stm8s.h", мне он кажется удобнее. Тут уже была полемика про иаровские хидеры - но микроэлектронный мир оказывается вовсю избавляется от такого подхода в названиях регистров и битов:
http://processors.wiki.ti.com/index.php ... SP432CMSIS
Друг Кота
Сообщения: 6457
Зарегистрирован: Пт сен 13, 2013 13:11:31

Сообщение a5021 »

axillent писал(а):Для bmp180 это не особо то и нужно, там вме равно логика расчета по байтам
Если конечно там так же как с bmp085
С bmp085 у меня проблем не возникло
В EEPROM-е BMP085/BMP180 одиннадцать двухбайтовых констант (знаковое и беззнаковое целое, а никакие не байты), где порядок следования младших и старших половинок обратный, если сравнивать его с порядком следования байт в МК. Есть тут проблема или нет -- вопрос другой, но вытянув эти значения из датчика, байты приходится менять местами вручную. Если заюзать на этом участке кода соответствующую прагму, то можно попробовать спихнуть это занятие на компилятор.
Электрический кот
Сообщения: 1040
Зарегистрирован: Вс сен 25, 2011 19:09:33

Сообщение axillent »

a5021 писал(а): В EEPROM-е BMP085/BMP180 одиннадцать двухбайтовых констант
в моей библиотеке одна функция по чтению двухбайтного числа, логика вся там в одном месте
обмен по I2C все равно байтами, а уж в каком порядке байты укладывать без разницы - их по любому укладывать
в этой части мне даже не пришлось переделывать код после AVR, хоть там и порядок другой
конструкции типа ниже работают в любом случае верно:

Код: Выделить всё

word = b0 | (b1 << 8);
Электрический кот
Сообщения: 1040
Зарегистрирован: Вс сен 25, 2011 19:09:33

Сообщение axillent »

oleg110592 писал(а): нету там SPL - просто хидер не иаровский а от производителя - "stm8s.h", мне он кажется удобнее
понял
кстати выпрашиваемые мной прототипы такие:

Код: Выделить всё

int __eeprom_wait_for_last_operation(void);
void __eeprom_program_byte(unsigned char __near * dst, unsigned char v);
void __eeprom_program_long(unsigned char __near * dst, unsigned long v);
если эти функции описать то работать с EEPROM в IAR становится поще некуда используя атрибут __eeprom
Вымогатель припоя
Аватара пользователя
Сообщения: 616
Зарегистрирован: Вс ноя 01, 2015 13:13:49

Сообщение scorpi_0n »

Сказано же было, поиском!
kazus.ru/forums/showthread.php?t=14204&page=37
Последний раз редактировалось scorpi_0n Чт мар 24, 2016 17:55:43, всего редактировалось 1 раз.
Электрический кот
Сообщения: 1040
Зарегистрирован: Вс сен 25, 2011 19:09:33

Сообщение axillent »

scorpi_0n нервы берегите
в моем последнем сообщении нет вопросов
Вымогатель припоя
Аватара пользователя
Сообщения: 616
Зарегистрирован: Вс ноя 01, 2015 13:13:49

Сообщение scorpi_0n »

Тогда зачем было повторяться?
Электрический кот
Сообщения: 1040
Зарегистрирован: Вс сен 25, 2011 19:09:33

Сообщение axillent »

а зачем отвечать не читая?
там выше все есть
Друг Кота
Сообщения: 6457
Зарегистрирован: Пт сен 13, 2013 13:11:31

Сообщение a5021 »

axillent писал(а):в этой части мне даже не пришлось переделывать код после AVR, хоть там и порядок другой
конструкции типа ниже работают в любом случае верно:

Код: Выделить всё

word = b0 | (b1 << 8);
Мне вот такой алгоритм укладывания не нравится своей громоздкостью, а уж сдвиг со сложением -- это вообще прием из курса знакомства с ардуиной.

Код: Выделить всё

  for (uint8_t i = 0; i < BMP180_PROM_DATA_LEN / 2; i++) {
    *buf = i2c_read();
    *--buf = i2c_read();
    buf += 3;
  }
Электрический кот
Сообщения: 1040
Зарегистрирован: Вс сен 25, 2011 19:09:33

Сообщение axillent »

a5021 писал(а): Мне вот такой алгоритм укладывания не нравится своей громоздкостью, а уж сдвиг со сложением -- это вообще прием из курса знакомства с ардуиной.
ИМХО это вы накручиваете
для Си логические И и сдвиги совершенно нормальные операнды
если читали классику по Си то согласитесь, что они придуманы лет за 40 до ардуины
я не смотрел листинги (не было интереса), но могу предположить, что машинный код моего и вашего варианта плюс минус равнозначны
a5021 писал(а):

Код: Выделить всё

  for (uint8_t i = 0; i < BMP180_PROM_DATA_LEN / 2; i++) {
    *buf = i2c_read();
    *--buf = i2c_read();
    buf += 3;
  }
да пожалуйста. Что мешает указатель не инкрементировать, а декриментировать? Код по размеру будет тот же, но порядок поменяется
Это то, что я выше назвал - все равно перекладывать, в каком направлении класть без разницы
Друг Кота
Сообщения: 6457
Зарегистрирован: Пт сен 13, 2013 13:11:31

Сообщение a5021 »

axillent писал(а):ИМХО это вы накручиваете
Любую оптимизацию можно попытаться охаять в таких формулировках.
я не смотрел листинги (не было интереса), но могу предположить, что машинный код моего и вашего варианта плюс минус равнозначны
А я смотрел и профилировал. Причем, выбирал из трех вариантов (правда, для stm32): а) сдвиг + сложение; б) манипуляции с указателем (приведенный выше); в) считывание по i2c в массив с использованием DMA + проход со свопом байтов. Самым быстрым и компактным оказался вариант "б".
Электрический кот
Сообщения: 1040
Зарегистрирован: Вс сен 25, 2011 19:09:33

Сообщение axillent »

ИМХО - это признак высказанного личного скромного мнения
не ищите критику (охаивание) там где ее нет

какой выигрышь в варианте б по отношению к а? интересно, пусть это и STM32
и какой уровень оптимизации/компилятор были?
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич

Сообщение Alexeyslav »

Вопрос оптимизации в данном случае вообще не должен стоять, передача данных будет несоизмеримо дольше осуществляться чем самый неоптимальный алгоритм переворачивания байт. Поэтому в таких случаях предпочтение должно отдаваться самому очевидному и наглядному способу, ибо с этим потом работать не одному программисту.
И вообще, что-то мне подсказывает что в системе команд должна быть инструкция которая меняет байты в слове.
Контактная информация:
Ответить

Вернуться в «Разные вопросы по МК»