Перейти к содержанию
    

Подтверждаю, никаких const писать не надо.

Ну не надо так категорично. const применять надо там где надо, а где не надо - не надо :)

Представьте себе ситуацию, когда программа не влезла во FLASH. Можно попробовать разместить какие-нибудь данные (строки, например) в константных переменных EEPROM. У stm8 доступ на чтение из EEPROM происходит без накладных расходов.

 

ничего при старте не копируется.

Естественно, и об этом даже написано в документации. Ещё бы её читал кто...

 

Я вот подумал, у STM8 общее адресное пространство для RAM, FLASH и EEPROM. Из FLASH и RAM код выполняться может, а что мешает его из EEPROM выполнять? Надо попробовать будет :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Библиотеки IAR для работы с EEPROM какие-то монстроидные. Прикладываю .map с моего примера. Вроде как 199 байт занимает.
у меня занял stm8s_flash.o 319 ro code и 63 ro data. В библах ассертов куча... всяких условий. если тесно, нужно их переписывать.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

а что мешает его из EEPROM выполнять?

А смысл? Еепрома же с гулькин нос! Что туда влезет-то? Вот какие-нибудь инициализационные константы вполне можно хранить (в том исходнике, на который я ссылку приводил, я храню в еепроме пары ID-номер для датчиков DS18x20).

В библах ассертов куча... всяких условий. если тесно, нужно их переписывать.

Зачем вы вообще этими яровскими штуками пользуетесь? SPL еще припомните...

STM8 же прост как 5 копеек! Бери себе, да пиши безо всяких "библиотек". Я для начала где-то минимальный заголовочный файл содрал (правда, он был для L-серий, а название его я так и не сменил — так и болтается теперь с буквой l, хотя я для l-ек ничего не писал никогда), а потом по мере необходимости пополнял его макросами.

В отличие от ARM'ов этим 8-биткам даже файл-стартап не нужен! Тупо сишные файлы сразу пишешь, потом make && make flash — вуаля!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Зачем вы вообще этими яровскими штуками пользуетесь? SPL еще припомните...
я его и имею в виду. библы - это SPL и есть. в библах куча ассертов

STM8 же прост как 5 копеек! Бери себе, да пиши безо всяких "библиотек".
С библиотеками быстрее и безопаснее.... берёшь спл... вызываешь UART_Init().... где указываешь в аргументах все настройки,.... махом подыматеся уарт.... без задро очень частых и длительных возвратно-поступательных движений с даташитом,.... Да, UART_Init() универсальный и тяжелый.... если хватает места - забыть про него, пусть живет. Если всё таки не влез, то я заметил, что UART_Init изменяет всего 3 регистра. Для верности чиркнул зрачком по исходнику UART_Init(), и заменил вызов UART_Init() на 3 строчки кода. вот и весь инит, вот и помощь от спл.

 

ps да ещё и без спл легче себе в ногу стрельнуть.

 

 

В отличие от ARM'ов этим 8-биткам даже файл-стартап не нужен! Тупо сишные файлы сразу пишешь, потом make && make flash — вуаля!
Мне не нравится "обвес".... т.е. всякие стартапы, cppinit-ы и т.п. 1400 байт флеша отьели.

 

dlstm8mmn.a: [4]

cexit.o 10

char.o 26

cppinit.o 210 2 11

cstartup.o 34

dc_util.o 44

exit.o 4

far.o 10

far_util.o 56

init.o 30

init_small.o 70

interrupt.o 4 128

long.o 284

long_util.o 38

low_level_init.o 3

memcpy.o 32

short.o 62

strlen.o 13

unhandled_exception.o 3

vreg_util.o 331

vregs.o 16

------------------------------------------------

Total: 1264 130 27

 

если вы пишете без стартапа, .... то у вас тоже нет cppinit.o, vreg_util.o, interrupt.o и т.п.?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А смысл? Еепрома же с гулькин нос!

Из любопытства, ради любви к искусству, по приколу - выбирайте :)

 

Зачем вы вообще этими яровскими штуками пользуетесь?

Реализация __eeprom реально удобно сделана, особенно в AVR версии. Грех не пользоваться.

Мне ещё нравится функция low_level_init() - там все железки проинитил и выходишь на main с мыслями об алгоритмах.

Да вроде и нет больше прямо таки фишек...

 

ps да ещё и без спл легче себе в ногу стрельнуть.

Куда обидней стрельнуть в ногу из SPL...

 

Мне не нравится "обвес".... т.е. всякие стартапы, cppinit-ы и т.п. 1400 байт флеша отьели.

Ну вы же их использовали в программе. Хотите ручками всё это написать? И не факт что короче выйдет.

 

если вы пишете без стартапа, .... то у вас тоже нет cppinit.o, vreg_util.o, interrupt.o и т.п.?

Скорее всего имелось в виду не совсем без стартапа, а с библиотечным стартапом по умолчанию. Окружение для С/C++ программы кто-то же должен создать. На ARM-е зоопарк чипов и в 99% случаев стартап надо свой для используемого чипа вставлять. В STM8 или AVR этого не надо делать.

 

Можно, конечно и отказаться от стандартного стартапа, но это уже какой-то недо-С и тем более не С++ получится.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да, под стартапом я имел в виду ассемблерный файл, который занимается инициализацией регистров и первичным заполнением памяти. Для STM8 этого не нужно.

А структуру файлов, которая у меня используется, наглядно можно в исходниках просмотреть. В отличие от некоторых, я не скрываю свои исходники — зачем, если есть хорошая лицензия GPL?

 

По поводу инициализации периферии: один раз потратил 2 часа на даташит — написал сниппет для USART/I2C/etc. По мере необходимости количество сниппетов расширяется. А т.к. у меня всегда 57600 скорость USART'а, я просто этот код вставляю! Можно вообще собрать все сниппеты в заголовочный файл (как макросы или static inline) и вызывать из кода. Будет как будто бы в "блиблиотеках", зато без лишних телодвижений.

И если gcc вполне справляется с оптимизацией, так, что можно даже на цепепе писать, то sdcc еще до него оочень далеко. И малейшая гадость вполне войдет в результирующий код (sdcc даже неиспользуемые функции выкидывать не умеет).

 

Насчет SPL очень правильно было сказано: с помощью этой дряни значительно легче себе в ногу стрельнуть.

Ну и просто уродливо выглядят все эти инициализации структур перед вызовом функции. Похоже, все-таки, хоть инженеры у STM грамотные, программисты — безнадежные идиоты: то SPL родят, то HAL… Нет бы сразу сниппетов "на голых регистрах" побольше написать, в которых наглядно можно было бы подводные камни errat'ы увидеть!

Изменено пользователем Эдди

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну и просто уродливо выглядят все эти инициализации структур перед вызовом функции.

может это в стм32? так там нету спл (уже нету). а в спл для стм8 нет инициализации структур перед вызовом функции. По крайней мере в gpio, uart, exti, tim, spi....

вот например инит уарт

      UART1_Init(19200,
                 UART1_WORDLENGTH_8D,
                 UART1_STOPBITS_1,
                 UART1_PARITY_NO,
                 UART1_SYNCMODE_CLOCK_DISABLE,
                 UART1_MODE_TXRX_ENABLE);

не знаю как тут себе можно в ногу стрельнуть? только если вам нужно скорость 19200, а вы напишете 19400.

а вот как выглядит оптимизированная установка скорости без спл, скорость 19200 при такте в 4 МГц.

    UART1->BRR2 = 8;
    UART1->BRR1 = 6;

А вот тут самострел на лицо, к гадалке не ходи.

 

 

Похоже, все-таки, хоть инженеры у STM грамотные, программисты — безнадежные идиоты: то SPL родят, то HAL…
а у остальных как? TI? Atmel? Там теже спл.... теже уродливые структуры. Вообще, проинитить GPIO в арме без спл... напрямую в регистры - это дрянь ещё та.... всякие клоки, альтфунк, моде, пулапы..... *застрелиться*. С спл/хал - хоть и уродливые структуры, но всё таки уже полегче... не нужно лазить по всему даташиту и изучать все регистры, достаточно изучить уродливую структуру.

 

Нет бы сразу сниппетов "на голых регистрах" побольше написать, в которых наглядно можно было бы подводные камни errat'ы увидеть!
что за снипеты? можно пример, например для уарта в стм8?

 

 

ps чтоб не открывать новой темы, спрошу тут любителей стм8.... в даташите есть такое

 

Program memory: 8 Kbyte Flash memory; data

retention 20 years at 55 °C after 100 cycles

 

Ни кого не пугает всего 20 лет хранения?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Кто-нибудь, покажите устройство, реально отслужившее 20 лет (; (напомню, 1997г выпуска)

 

Везде так: SAM3S1A (щас на столе) - типовое 30 тыс циклов W/E и мин 10 лет хранит; AT91SAM7S256 - 10 тыс циклов W/E и те же 10 лет хранения; для AT90S8535 приглючивается хранение 25 лет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

вот например инит уарт

Мало того, что уродливо, так еще вызывается левая функция, когда уарт инициализуется тремя-четырьмя строчками!

не знаю как тут себе можно в ногу стрельнуть?

Когда понадобится что-то эдакое, а окажется, что в SPL это либо не реализовано, либо, что еще хуже, реализовано криво (жаловался уже на что-то подобное народ).

А вот тут самострел налицо

Если правильно задокументировать, все будет отлично.

а у остальных как? TI? Atmel? Там теже спл.... теже уродливые структуры.

Не надо тут! Почти любой МК можно по-человечески запрограммировать. Даже абдурину: достаточно стереть к чертовой бабушке загрузчик и программировать его как обычный авр. Ну или как обычный авр, но заливать через загрузчик. Пользоваться абдуриновскими библиотеками — это уж вообще треш!

Вообще, проинитить GPIO в арме без спл... напрямую в регистры - это дрянь ещё та...

После облома с opencm3 я решил переходить абсолютно полностью на nolib решение: сниппеты — наше все! Вот как с STM32F042 закончу более-менее, вернусь к F103. Без библиотек элегантно получается, не тормозит и читается лучше. А даташит с RM — их в любом случае подробно читать придется. Хоть с библиотеками, хоть без них. Так зачем мучиться, и читать помимо даташита с RM еще и исходники кривых библиотек?

что за снипеты? можно пример, например для уарта в стм8?

Кусочки кода. Я их вообще как готовые к загрузке штуки оформляю. См. у меня на гитхабе.

Ни кого не пугает всего 20 лет хранения?

Нет. Это STM8S003, которые мегадешевые. Их во всяких халявных китайских приборчиках используют, которые все равно выкинешь раньше, чем через 20 лет.

Кстати, я когда двум этим мелкосхемам ресурс флеша исчерпал (одну аж раз на 250 хватило!), прикупил девборды на STM8S103 — практически один-в-один, но флеш намного дольше убивается. На них отлаживал, а потом 003 прошивал. Из баксовых "вольтметров" на 003 можно вполне приличный термометр с датчиком Tsic506 сделать, или экранчик по I2C (правда, криворукие китайцы даже "вольтметр" с внешним АЦП спаяли так, что аппаратный I2C у них использовать нельзя — этими ногами дисплей дергают, идиоты!).

 

для AT90S8535 приглючивается хранение 25 лет.

Вот, кстати, подозреваю, что из-за этого, а не каких-то "наведенных грозой зарядов" (а грозы-то и не было) у нас сдох этот самый МК в приборе почти 20-летней давности. И пришлось мне стать золотарем.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Кто-нибудь, покажите устройство, реально отслужившее 20 лет (; (напомню, 1997г выпуска)
радиостанция, весы, автомобиль, станок, часы, свитч, модем... или например счетчик электроэнергии.... есть счетчики которые уже по 50 лет прослужили и ещё столько же прослужат. Или вы счетчик эл энергии меняете раз в 10-20 лет?

 

ps глянул другие... у атмеги 20 лет, у стм32 30 лет..... не айс.....

 

Мало того, что уродливо, так еще вызывается левая функция, когда уарт инициализуется тремя-четырьмя строчками!
УРОДЛИВО!!! Это вы называете УРОДЛИВО!? Ту даже коменты в коде не нужны. Весь инит уарта в одну строчку. вызовом одной функции. вам всё равно свою функцию писать... а если в коде в нескольких местах инит уарта? а если динамически менять режим работы?....

 

тогда позвольте ваш, не уродливый, инит в студию?

 

Когда понадобится что-то эдакое, а окажется, что в SPL это либо не реализовано
когда понадобиться что-то этакое, а в спл этого нет, то вы НИКОГДА с помощью спл не стрельните себе в ногу, ибо потому что там этого нет. Вы что-то эдакое будете реализовавыть сами, без спл.... и вот тут если и будет выстрел, то уж не из кода спл, а из вашего.

 

 

а у остальных как? TI? Atmel? Там теже спл.... теже уродливые структуры.

 

Не надо тут! Почти любой МК можно по-человечески запрограммировать.

Вы о чем.... вы обвиняете стм программистов

Похоже, все-таки, хоть инженеры у STM грамотные, программисты — безнадежные идиоты: то SPL родят, то HAL…
и "даете им совет " или как вы бы сделали на месте программистов у ST

Нет бы сразу сниппетов "на голых регистрах" побольше написать
Так вот в рамках контектста этих высказываний вопрос: А программисты у TI тоже идиоты? А программисты у Atmela тоже идиоты? А программисты у других компаний тоже идиоты? Программисты TI тишут теже грамоздкие спл. Да, я согласен, любой МК можно закодить без спл... коротко и быстро.... но вопрос не об этом....

 

А даташит с RM — их в любом случае подробно читать придется. Хоть с библиотеками, хоть без них. Так зачем мучиться, и читать помимо даташита с RM еще и исходники кривых библиотек?
Дело в том, что не придется. Понимаете... библа и абдурино скрывает даташит. заглянул в мануал на библу, вызвал UART1_Init() и забыл про уарт. работает как часы. не нужно досконально изучать даташит и РМ. Скорость вхождения в новый МК на порядок быстрее. Как пример абдурино.... многие юзеры сего чуда вообще не знают что такое даташит и РМ. Инит уарта - Serial.begin(19200) - ВСЁ! Уровень вхождения в программирование МК нулевой.

 

А вообще вы тоже даташит скрываете своими снипетами. вы изучаете даташит, пишете снипеты (это ни что иное как та же библа), а потом не заглядывая в даташит пользуетесь своими снипетами.

 

 

Если правильно задокументировать, все будет отлично.
ээээ.... не понятно.... что тут документировать?... ещё раз... вот код для скорости 19200 при 4 МГц.

 

UART1->BRR2 = 8;

UART1->BRR1 = 6;

тут легче ошибиться, чем с спл.

 

Тут нужно открыть рм... покурить его... понять как рассчитать регистры... как это всё привязано к клокам... посчитать... и прописать 8 и 6 в нужной последовательности (в обратной не работает). вот допустим вы ошиблись в расчетах, или не правильно поняли даташит и получили 7 и 6 - это и есть выстрел в ногу.

вот пример ошибочного кода.

UART1->BRR2 = 7;

UART1->BRR1 = 6;

 

задокументируйте его ПРАВИЛЬНО, чтобы всё было отлично!

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот можно подумать, обычные USB-флешки гарантируют больше ~10 лет! Какая разница? Сдохнет через 30 лет — туда и дорога! Железяки такого типа нужно хотя бы раз в 10-15 лет обновлять, чтобы не было как у нас (см. выше).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

радиостанция, весы, автомобиль, станок, часы, свитч, модем... или например счетчик электроэнергии.... есть счетчики которые уже по 50 лет прослужили и ещё столько же прослужат. Или вы счетчик эл энергии меняете раз в 10-20 лет?

 

ps глянул другие... у атмеги 20 лет, у стм32 30 лет..... не айс.....

"Курьер" у меня '01-го, не 20-лет.

В часах "флэш"? Для чего?

В '11 был заменён эл.счётчик '74-го, ни в нём, ни в новом никакой "флэши" нет. Аргумент - не аргумент (;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

вам всё равно свою функцию писать...

И что? У меня не будет 100500 ассертов и кучи вычислений для такой элементарщины. Три-четыре присвоения — и все!

а если в коде в нескольких местах инит уарта?

Больше, чем количество уартов, их все равно быть не может. ctrl+c → ctrl+v решают ☺ Всяко меньше кода на выходе будет.

а если динамически менять режим работы?

Кому это может понадобиться?

тогда позвольте ваш, не уродливый, инит в студию?

На гитхабе лежит, я ж говорю.

когда понадобиться что-то этакое, а в спл этого нет, то вы НИКОГДА с помощью спл не стрельните себе в ногу, ибо потому что там этого нет.

Спасибо, посмеялся. Ну и на кой тогда вы эти спл используете?

А программисты у TI тоже идиоты? А программисты у Atmela тоже идиоты? А программисты у других компаний тоже идиоты? Программисты TI тишут теже грамоздкие спл.

Индусу заплатили, он пишет. Какая ему разница, что смысла в этой писанине нет?

библа и абдурино скрывает даташит

И поэтому с ними работать еще сложней: нужно не только даташит читать, но и исходники долбаных библиотек/абдурин!

Скорость вхождения в новый МК на порядок быстрее

Это хорошо только если задача — помигать светодиодиком, когда СМС придет. И делается эта железяка в одном-единственном экземпляре.

многие юзеры сего чуда вообще не знают что такое даташит и РМ

И им наплевать, что для мигания светодиодом код 4кБ занимает! И что SPI/I2C/etc у них тупым ногодрыгом реализуются. И что для простой задачи, где при правильном подходе хватило бы 8кБ флеша за глаза, им требуется минимум 32. И т.д., и т.п.

Я вообще ничего хорошего в этом не вижу. Вон, компьютеры тоже когда-то были приличными железяками, для работы на них нужно было быть инженером. А сейчас любая блондинко сидит, мышкой тыкает. В итоге скатились чуть ли не в каменный век! Народ уже вообще не считает, что нужно учиться — компьютер же все сделает!

Та же самая мастдайка развилась именно благодаря тезису "каждой кухарке — по компутеру!". Иначе никто бы эту неюзабельную дрянь не покупал!

А вообще вы тоже даташит скрываете своими снипетами. вы изучаете даташит, пишете снипеты (это ни что иное как та же библа), а потом не заглядывая в даташит пользуетесь своими снипетами.

По коду моего сниппета все видно, а по коду вызова библиотечной функции — нет.

ээээ.... не понятно.... что тут документировать?... ещё раз... вот код для скорости 19200 при 4 МГц.

Написать, например, в комментариях, откуда эти числа взялись.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Мне не нравится "обвес".... т.е. всякие стартапы, cppinit-ы и т.п. 1400 байт флеша отьели.

dlstm8mmn.a: [4]

...

vregs.o 16

------------------------------------------------

Total: 1264 130 27

если вы пишете без стартапа, .... то у вас тоже нет cppinit.o, vreg_util.o, interrupt.o и т.п.?

Вообще-то здесь не только стартап. Даже лучше сказать - не столько.

Здесь вообще-то присутствует то, что Вы сами попросили у компилятора в своей программе :laughing:

Например "long.o" - откажитесь от использования многоразрядных чисел в программе и не будет его.

"cppinit.o" - откажитесь от статических инициализированных классов/структур с конструкторами - и не будет его.

Уберите из программы все статические объекты инициализированные не нулями - и тоже не будет каких-то секций или будут меньше.

То же самое "strlen.o", "memcpy.o" и пр.

Есть конечно ещё модель работы компилятора IAR, который зачем-то вместо использования стекового фрейма для локальных переменных (что стандартно) использует виртуальные регистры.

Из-за этого есть "vreg_util.o" и "vregs.o". Но они тоже могут быть меньше.

 

В '11 был заменён эл.счётчик '74-го, ни в нём, ни в новом никакой "флэши" нет. Аргумент - не аргумент (;

Но там есть FRAM? :biggrin:

 

ээээ.... не понятно.... что тут документировать?... ещё раз... вот код для скорости 19200 при 4 МГц.

UART1->BRR2 = 8;

UART1->BRR1 = 6;

Такому коду место на помойке. "Без библиотек" совсем не означает что нужно писать такое.

Почему нельзя написать "без библиотек" и при этом вполне прилично? Как-то так:

void UARTinit(UART_RATE rate)
{
  static u8 const tr[UART_RATE_n][2] = {
    RATE_DIV(9600), RATE_DIV(19200), RATE_DIV(38400), RATE_DIV(57600),
    RATE_DIV(115200), RATE_DIV(230400), RATE_DIV(460800)};
  u8 const *s;
...
  UART.BRR[1] = *(s = &tr[rate][0]);
  UART.BRR[0] = s[1];

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Там нет FRAM, счётчик обычный, рабоче-крестьянский без блэк-джека. Механический.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...