|
Работа с EEPROM STM8 в IAR, Дописываем библиотеки для работы модификатора __eeprom |
|
|
|
Jul 21 2017, 20:54
|
Местный
  
Группа: Свой
Сообщений: 475
Регистрация: 14-04-05
Из: Москва
Пользователь №: 4 140

|
Привет, любители STM! В последних версиях IAR уже почти нормально с модификатором __eeprom работает. Надо лишь реализовать три функции, которые в библиотеке не реализованы и на которые линкер ругается. CODE int __eeprom_wait_for_last_operation(void) { if(FLASH_IAPSR_bit.WR_PG_DIS) return 0; while(!FLASH_IAPSR_bit.HVOFF); return 1; }
void __eeprom_program_byte(uint8_t __near * dst, uint8_t v) { *dst = v; }
void __eeprom_program_long(uint8_t __near * dst, uint32_t v) { FLASH_CR2_bit.WPRG = 1; *(dst++) = *((uint8_t*)(&v)); *(dst++) = *((uint8_t*)(&v) + 1); *(dst++) = *((uint8_t*)(&v) + 2); *dst = *((uint8_t*)(&v) + 3); } Ну и не забывать разблокировать запись. CODE void EEPROM_Unlock(void) { FLASH_DUKR = FLASH_RASS_KEY2; FLASH_DUKR = FLASH_RASS_KEY1; }
void EEPROM_Lock(void) { FLASH_IAPSR_bit.DUL=0; }
А дальше как обычно определяем неинициализированные и инициализированные переменные с модификатором __eeprom и компилятор сам всё сделает. CODE __no_init __eeprom uint8_t x; #pragma data_alignment=4 __no_init __eeprom uint32_t y; __no_init __eeprom uint8_t z; __eeprom uint8_t test[10]={ 1,2,3,4,5,6,7,8,9,10 };
int main() { EEPROM_Unlock(); x=test[5]; z=x+1; y=0x12345678; EEPROM_Lock(); for(;;); } И даже при отладке IAR сам прошивает инициализированные __eeprom переменные вместе с кодом. Удобно. Следует обратить внимание на следующие вещи: - почему-то компилятор смело при оптимизации выкидывает переменные с модификатором __eeprom. Мне кажется они должны быть по умолчанию volatile как и SFR, но нет. Ну нет, так нет. В приложенном проекте пришлось обтыкать их volatile. - STM8 32-битные переменные шьёт за один присест, но для этого они должны быть выровнены по 4. Приходится компилятору напоминать о выравнивании. - что-то мне с ходу не удалось получить два раздельных HEX с кодом и eeprom, но у меня опыт с STM8 аж один день  Только сегодня STM8L-Discovery получил. Может кто научит? Прикладываю проект для дискавери (STM8L152C6), может кому пригодится.
STM8_IAR_EEPROM.rar ( 27.42 килобайт )
Кол-во скачиваний: 68
|
|
|
|
|
 |
Ответов
|
Jul 31 2017, 09:22
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(VladislavS @ Jul 21 2017, 23:54)  Следует обратить внимание на следующие вещи: - почему-то компилятор смело при оптимизации выкидывает переменные с модификатором __eeprom. Мне кажется они должны быть по умолчанию volatile как и SFR, но нет. Ну нет, так нет. В приложенном проекте пришлось обтыкать их volatile. Выкидывает вероятно потому, что у Вас в коде к ним нет обращений? И выкидывает тогда не компилятор, а компоновщик (по этой причине). И правильно делает. "Обтыкивать" в этом случае (если они нужны, но обращений почему-то нет) нужно не volatile, а добавлять префикс __root (см. доку на IAR). Хотя - может подумать - почему переменная описана, а обращений к ней нет? Может что-то в консерватории структуре программы неправильно построено?  PS: И почему у Вас инициализированные данные __eeprom uint8_t test[10]={ 1,2,3,4,5,6,7,8,9,10 };без модификатора const? Предполагается, что при каждом старте устройства, эти данные должны переписываться в EEPROM заново???
|
|
|
|
|
Jul 31 2017, 11:01
|
Местный
  
Группа: Свой
Сообщений: 475
Регистрация: 14-04-05
Из: Москва
Пользователь №: 4 140

|
Цитата(jcxz @ Jul 31 2017, 12:22)  Выкидывает вероятно потому, что у Вас в коде к ним нет обращений? Как это нет? main() смотрим внимательнее. Цитата(jcxz @ Jul 31 2017, 12:22)  "Обтыкивать" в этом случае (если они нужны, но обращений почему-то нет) нужно не volatile, а добавлять префикс __root (см. доку на IAR). Причём тут __root ? Обращения есть, модификатор __eeprom стоит, этого должно быть достаточно для запрета выкидывать операции с этими переменными. Цитата(jcxz @ Jul 31 2017, 12:22)  PS: И почему у Вас инициализированные данные __eeprom uint8_t test[10]={ 1,2,3,4,5,6,7,8,9,10 }; без модификатора const? А с какой стати они const? Мои переменные, захочу - изменю. EEPROM для того и нужен. Почему вы мне это решили запретить? В принципе, процессор позволяет и во flash писать, так что, чисто теоретически, можно было бы неконстантную переменную и во flash разместить, главное с компилятором "договориться". Цитата(jcxz @ Jul 31 2017, 12:22)  Предполагается, что при каждом старте устройства, эти данные должны переписываться в EEPROM заново???  Формально да, должен. Но если почитать докуентацию, то там будет следующее: Цитата .eeprom.data Description Holds static and global initialized and zero-initialized __eeprom variables. Eeprom data is persistent, so this section should not be included in any initialize by copy linker directive. То есть, компилятор генерит сегмент данных для eeprom. Что с ним делать дальше решает пользователь. При отладке в железке или симуляторе отладчик автоматически каждый раз загружает его в eeprom - тут всё чисто. В случае релиза мы его прошиваем ручками один раз при программировании чипа. При следующих стартах гарантии что там будет прежнее значение нет. Формально - отступление от стандарта, а реально лишь особенность, привнесённая модификатором __eeprom. Это ни хорошо, ни плохо, а так есть и удобно!
|
|
|
|
|
Jul 31 2017, 11:25
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(VladislavS @ Jul 31 2017, 14:01)  Как это нет? main() смотрим внимательнее. Причём тут __root ? Обращения есть, модификатор __eeprom стоит, этого должно быть достаточно для запрета выкидывать операции с этими переменными. И что там в main()? Смотрим внимательнее.  Какие-то присваивания, каких-то переменных, которые потом больше нигде не используются, не передаются ни в какие функции и не присваиваются никаким volatile переменным? Вот это и называется "переменная не используется", по этой причине компилятор/линкер имеет полное право её выкинуть. Компилятор всё сделал правильно, а Вам стоит повышать свой уровень в написании ПО  Цитата(VladislavS @ Jul 31 2017, 14:01)  А с какой стати они const? Мои переменные, захочу - изменю. EEPROM для того и нужен. Почему вы мне это решили запретить? Я Вам ничего не запрещаю, я просто читаю что у Вас там написано. А написано у Вас инструкция компилятору, что нужно разместить test в модифицируемой памяти и при старте ПО startup-код должен проинициализировать её указанным значением. Вот именно это компилятор и будет делать. Возможно Вы именно этого и хотели. Но возможно что и нет, ибо это - одна из распространённых ошибок начинающих при описании инициализированных переменных в ОЗУ Здесь как бы неясно - возможно, что в IAR ключевое слово __eeprom включает в себя неявно и префикс const, но трудно сказать. Цитата(VladislavS @ Jul 31 2017, 14:01)  можно было бы неконстантную переменную и во flash разместить, главное с компилятором "договориться". "неконстантная переменная" - это нонсенс. Может быть или переменная или константа. Тут как ни договаривайся - компилятор мзду не берёт Цитата(VladislavS @ Jul 31 2017, 14:01)  Формально да, должен. Но если почитать докуентацию, то там будет следующее: Вполне возможно, что префикс __eeprom неявно включает в себя const. Но не факт.
|
|
|
|
|
Jul 31 2017, 12:31
|
Местный
  
Группа: Свой
Сообщений: 475
Регистрация: 14-04-05
Из: Москва
Пользователь №: 4 140

|
Цитата(jcxz @ Jul 31 2017, 14:25)  Вот это и называется "переменная не используется", по этой причине компилятор/линкер имеет полное право её выкинуть. Как это не используется? Она хранится в EEPROM после выключения питания! И компилятор об этом знает, я же ему об этом и указал посредством __eeprom. Я считаю это достаточным, разработчики компилятора нет. Это лишь условность, которая определена для модификатора __eeprom и я просто обратил на неё внимание, чтобы новички не попались. Цитата(jcxz @ Jul 31 2017, 14:25)  А написано у Вас инструкция компилятору, что нужно разместить test в модифицируемой памяти и при старте ПО startup-код должен проинициализировать её указанным значением. Вот именно это компилятор и будет делать. Нет, не будет. Будет делать то что написано в документации, а что там написано - смотрите предыдущий пост. Цитата(jcxz @ Jul 31 2017, 14:25)  Возможно Вы именно этого и хотели. Но возможно что и нет, Предлагаю подумать над вопросом почему у меня в примере инициализированные и неинициализированные переменные разной размерности и выравнивания применены. Цитата(jcxz @ Jul 31 2017, 14:25)  ибо это - одна из распространённых ошибок начинающих при описании инициализированных переменных в ОЗУ Здесь как бы неясно - возможно, что в IAR ключевое слово __eeprom включает в себя неявно и префикс const, но трудно сказать. Ошибка - делать умозаключение не прочитав документацию. Цитата(jcxz @ Jul 31 2017, 14:25)  "неконстантная переменная" - это нонсенс. Может быть или переменная или константа. Тут как ни договаривайся - компилятор мзду не берёт  Или, сюрприз, "константная переменная". Под "неконстантной переменной" я, возможно коряво, имел в виду, что данная переменная не относится к классу "константных переменных". Ну да, получается, что этот массив обычная переменная, только с модификатором __eeprom, который намекает компилятору что с ней надо как-то по особенному работать. Цитата(jcxz @ Jul 31 2017, 14:25)  Вполне возможно, что префикс __eeprom неявно включает в себя const. Но не факт. А может почитать документацию, а не гадать? jcxz, ну всё же, почему вы хотите EEPROM сделать const насильно? Он для того и придуман чтобы в него писать. Во так, например:
Хотелось бы посмотреть как вы будете писать в константную переменную и что вам на это компилятор скажет.
|
|
|
|
|
Jul 31 2017, 15:10
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(VladislavS @ Jul 31 2017, 15:31)  Как это не используется? Она хранится в EEPROM после выключения питания! И компилятор об этом знает, я же ему об этом и указал посредством __eeprom. Я считаю это достаточным, разработчики компилятора нет. Это лишь условность, которая определена для модификатора __eeprom и я просто обратил на неё внимание, чтобы новички не попались. Попробуйте создать константу во флешь. И присвоить её значение какой-то переменной, которая потом не используется. Корректный оптимизирующий компилятор её не поместит в выходной образ. Шок! да?? Ведь если следовать Вашей логике как он мог её удалить - ведь оно там хранится (переменная в ОЗУ или константа во flash - не важно). Странно почему это разработчики компиляторов считают по другому, не находите? Может надо пересмотреть своё видение мира? И с __eeprom всё то же самое. Цитата(VladislavS @ Jul 31 2017, 15:31)  Ошибка - делать умозаключение не прочитав документацию. Странные умозаключения Вы оттуда почерпнули. И то что они противоречат логике работы оптимизирующего компилятора, Вас похоже даже не насторожило - они все дураки, я один умный Цитата(VladislavS @ Jul 31 2017, 15:31)  Ну да, получается, что этот массив обычная переменная, только с модификатором __eeprom, который намекает компилятору что с ней надо как-то по особенному работать. Вот, до Вас уже всё таки доходит истина! То, как Вы описали test - это именно переменная, а не константа. Наличие данных справа от неё говорит, что она инициализированная. А инициализацией переменных в си занимается стартап-код, который выполняется при старте ПО. Вот он и должен будет при старте устройства, записать в эту переменную указанное значение. Как уж он это будет делать - другое дело, он может например перед записью сравнить имеющиеся по этому адресу данные, и если они равны записываемым - ничего не делать. Цитата(VladislavS @ Jul 31 2017, 15:31)  А может почитать документацию, а не гадать? Документацию на что? На язык си? Да, пожалуй Вам стоит её почитать Цитата(VladislavS @ Jul 31 2017, 15:31)  jcxz, ну всё же, почему вы хотите EEPROM сделать const насильно? Он для того и придуман чтобы в него писать. Во так, например: Я ничего не хочу. Я всего лишь написал, что то как описан был Ваш массив, как бы намекает что там должно быть ключевое слово const скорей всего. А если там реально нет этого слова, то я написал что будет делать компилятор в этом случае. Цитата(VladislavS @ Jul 31 2017, 15:31)  Хотелось бы посмотреть как вы будете писать в константную переменную и что вам на это компилятор скажет. Такого бреда я делать не буду. Ибо "константная переменная" - это Ваше изобретение. Вы сами то разве не понимаете бредовость этого термина???
|
|
|
|
|
Jul 31 2017, 16:34
|
Местный
  
Группа: Свой
Сообщений: 475
Регистрация: 14-04-05
Из: Москва
Пользователь №: 4 140

|
Цитата(jcxz @ Jul 31 2017, 18:10)  А если там реально нет этого слова, то я написал что будет делать компилятор в этом случае. И попали пальцем в небо, потому что делать этого он не будет. Почему, читайте документацию на компилятор, я уже давал цитату. Цитата(jcxz @ Jul 31 2017, 18:10)  Ибо "константная переменная" - это Ваше изобретение. Рекомендую ознакомиться с трудами Бьёрна Страуструпа. Можете даже оспорить их, а я пасс, пожалуй, понаблюдаю со стороны. PS: я тут файлик внизу оставлю, не вздумайте его читать!
24._Constant_varyables.pdf ( 180.95 килобайт )
Кол-во скачиваний: 142
|
|
|
|
Сообщений в этой теме
VladislavS Работа с EEPROM STM8 в IAR Jul 21 2017, 20:54   VladislavS Цитата(jcxz @ Jul 31 2017, 14:25) Тут как... Jul 31 2017, 14:26 juvf 2VladislavS
Цитата(jcxz @ Jul 31 2017, 14... Aug 1 2017, 11:38  jcxz Цитата(juvf @ Aug 1 2017, 14:38) вопрос о... Aug 1 2017, 13:08  VladislavS Цитата(juvf @ Aug 1 2017, 14:38) вопрос о... Aug 1 2017, 14:09   jcxz Цитата(VladislavS @ Aug 1 2017, 17:09) См... Aug 1 2017, 15:23   juvf Цитата(VladislavS @ Aug 1 2017, 19:09) Би... Aug 1 2017, 17:29 DS Прекратите хамить собеседнику. При повторении буде... Aug 1 2017, 16:02 VladislavS Инициализированные переменные с модификатором __ee... Aug 1 2017, 16:11 Эдди Подтверждаю, никаких const писать не надо. Вот так... Aug 1 2017, 16:19 VladislavS Цитата(Эдди @ Aug 1 2017, 19:19) Подтверж... Aug 1 2017, 16:34 Эдди Цитата(VladislavS @ Aug 1 2017, 19:34) а ... Aug 1 2017, 19:00 juvf Цитата(Эдди @ Aug 2 2017, 00:00) Зачем вы... Aug 1 2017, 19:48  VladislavS Цитата(Эдди @ Aug 1 2017, 22:00) А смысл?... Aug 1 2017, 20:38  jcxz Цитата(juvf @ Aug 1 2017, 22:48) Мне не н... Aug 2 2017, 09:53 Эдди Да, под стартапом я имел в виду ассемблерный файл,... Aug 2 2017, 05:30 juvf ЦитатаНу и просто уродливо выглядят все эти инициа... Aug 2 2017, 07:15 Эдди Цитата(juvf @ Aug 2 2017, 10:15) вот напр... Aug 2 2017, 08:19 Obam Кто-нибудь, покажите устройство, реально отслуживш... Aug 2 2017, 07:50 juvf Цитата(Obam @ Aug 2 2017, 12:50) Кто-нибу... Aug 2 2017, 09:10  Obam Цитата(juvf @ Aug 2 2017, 12:28) радиоста... Aug 2 2017, 09:17   juvf Цитата(Obam @ Aug 2 2017, 14:17) В '1... Aug 2 2017, 10:03    Obam Цитата(juvf @ Aug 2 2017, 14:03) При чем ... Aug 2 2017, 10:47  Эдди Цитата(juvf @ Aug 2 2017, 12:10) вам всё ... Aug 2 2017, 09:20   juvf Цитата(Эдди @ Aug 2 2017, 14:20) Кому это... Aug 2 2017, 11:12    jcxz Цитата(juvf @ Aug 2 2017, 14:12) Потому ч... Aug 2 2017, 13:08    Эдди Цитата(juvf @ Aug 2 2017, 14:12) При этом... Aug 2 2017, 16:08     juvf Цитата(Эдди @ Aug 2 2017, 21:08) Код UART... Aug 2 2017, 17:08      Эдди Цитата(juvf @ Aug 2 2017, 20:08) И в трет... Aug 2 2017, 22:40 Эдди Вот можно подумать, обычные USB-флешки гарантируют... Aug 2 2017, 09:11 Obam Там нет FRAM, счётчик обычный, рабоче-крестьянский... Aug 2 2017, 09:58 jcxz Цитата(Obam @ Aug 2 2017, 12:58) Там нет ... Aug 2 2017, 10:01 VladislavS А я бы как-то так написал:
Код#define F_CPU 160000... Aug 2 2017, 18:04 juvf Цитата(VladislavS @ Aug 2 2017, 23:04) А ... Aug 2 2017, 18:53  jcxz Цитата(juvf @ Aug 2 2017, 21:53) кошерный... Aug 2 2017, 21:04 VladislavS Для того чтобы изменить скорость USART надо записа... Aug 3 2017, 09:56 juvf Цитата(VladislavS @ Jul 22 2017, 01:54) А... Aug 3 2017, 15:35 VladislavS Цитата(juvf @ Aug 3 2017, 18:35) а как ui... Aug 3 2017, 16:48 pittyalex Господа, товарищи, здравствуйте.
Помогите разобрат... Nov 14 2017, 21:22 juvf Цитата(pittyalex @ Nov 15 2017, 02:22) По... Nov 15 2017, 03:48  pittyalex Цитата(juvf @ Nov 15 2017, 04:48) так ком... Nov 16 2017, 12:30   scifi Цитата(pittyalex @ Nov 16 2017, 15:30) Ес... Nov 16 2017, 12:46   juvf Цитата(pittyalex @ Nov 16 2017, 17:30) В ... Nov 16 2017, 13:30 VladislavS На чтение EEPROM в STM8 ничем не отличается от обы... Nov 16 2017, 17:14 pittyalex Господа, огромное спасибо за помощь. Почему сам н... Nov 16 2017, 18:11 scifi Цитата(pittyalex @ Nov 16 2017, 21:11) Во... Nov 16 2017, 19:58  pittyalex Цитата(scifi @ Nov 16 2017, 19:58) Глупос... Nov 16 2017, 20:17   scifi Цитата(pittyalex @ Nov 16 2017, 23:17) Кс... Nov 16 2017, 20:40    pittyalex Цитата(scifi @ Nov 16 2017, 20:40) Лучше ... Nov 18 2017, 09:27     scifi Цитата(pittyalex @ Nov 18 2017, 12:27) но... Nov 19 2017, 13:27     jcxz Цитата(pittyalex @ Nov 18 2017, 11:27) Я ... Nov 20 2017, 10:20      pittyalex Цитата(jcxz @ Nov 20 2017, 10:20) А какой... Nov 22 2017, 21:36       jcxz Цитата(pittyalex @ Nov 22 2017, 23:36) С ... Nov 23 2017, 08:48        pittyalex Цитата(jcxz @ Nov 23 2017, 08:48) Хм... В... Nov 23 2017, 19:28         jcxz Цитата(pittyalex @ Nov 23 2017, 21:28) Не... Nov 23 2017, 23:13         scifi Цитата(pittyalex @ Nov 23 2017, 22:28) Не... Nov 24 2017, 08:03          juvf Цитата(scifi @ Nov 24 2017, 13:03) А заче... Nov 24 2017, 08:26          pittyalex Цитата(scifi @ Nov 24 2017, 08:03) А заче... Nov 24 2017, 20:45           scifi Цитата(pittyalex @ Nov 24 2017, 23:45) А ... Nov 24 2017, 21:03 juvf Цитата(pittyalex @ Nov 16 2017, 23:11) То... Nov 17 2017, 03:00 VladislavS Все эти кастинги работают пока вы указатель для чт... Nov 17 2017, 04:19 juvf был код
Код__eeprom __no_init uint16_t countStart... Nov 18 2017, 13:55 VladislavS Цитата(juvf @ Nov 18 2017, 16:55) получил... Nov 18 2017, 17:10  juvf Цитата(VladislavS @ Nov 18 2017, 22:10) В... Nov 19 2017, 07:47   pittyalex Цитата(juvf @ Nov 19 2017, 07:47) В еепро... Nov 19 2017, 17:56    razrab83 У меня @0x4030 - такой "стандартный" спо... Nov 20 2017, 04:37    scifi Цитата(pittyalex @ Nov 19 2017, 20:56) По... Nov 20 2017, 06:38     juvf Цитатаstruct eeprom_layout volatile* const eeprom ... Nov 20 2017, 11:20      scifi Цитата(juvf @ Nov 20 2017, 14:20) -это да... Nov 20 2017, 12:02       VladislavS Цитата(scifi @ Nov 20 2017, 15:02) Зачем ... Nov 21 2017, 04:16       juvf Цитата(scifi @ Nov 20 2017, 17:02) Прежде... Nov 21 2017, 09:16        scifi Цитата(juvf @ Nov 21 2017, 12:16) ах да, ... Nov 21 2017, 11:19         juvf Цитата(scifi @ Nov 21 2017, 16:19) Вы мно... Nov 21 2017, 11:21 AHTOXA Цитата(juvf @ Nov 18 2017, 18:55) получил... Nov 18 2017, 20:20
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|