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

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить
Опытный кот
Сообщения: 859
Зарегистрирован: Пт янв 27, 2012 20:07:54
Откуда: Томск

Сообщение pavel2000 »

[uquote="BlackKilkennyCat",url="/forum/viewtopic.php?p=3955654#p3955654"]Вообще-то, есть ещё такое понятие как время. В одно время мне нужно, чтоб а равнялось б, а в другое время, чтоб с, даже если это время равно одному такту. Неважно, зачем. Это может быть что-то параллельное: что-то где-то рядом читает a. Может быть требованием какой-либо периферии, например получение доступа к флэш у STM.[/uquote]

Откройте для себя такое ключевое слово: "volatile".
Реклама
Потрогал лапой паяльник
Сообщения: 357
Зарегистрирован: Вс янв 11, 2015 20:33:32

Сообщение sergey.UA »

По поводу INT или FLOAT, в первой строчке программы, для первых трех переменных.
Изначально было так:
Изображение
Потом у меня из - за отсутствия скобок, ничего не работало, и я для исключения кажущейся
( для меня ) причины просто изменил размерность первых трех переменных до FLOAT.
Изображение
В счетчик кол.ва циклов, в десятичную переменную со знаком ( -2 147 483 648,0 : 2 147 483 647,0 ) сохраняем значение переменной с такой же разрядностью + переменная, но со максимальным значением не более 300. Т.е. логично использовать для этих целей переменную размерности INT ( - 32 768 : 32 767 ).
Всего получается 16 проходов цикла.
Изображение
Не увидел разницы в кол. ве проходов цикла, как от обозначения размерности INT так и от обозначения как FLOAT.
jcxz, что вы имели в виду ?
Спасибо.
Реклама
Друг Кота
Аватара пользователя
Сообщения: 3389
Зарегистрирован: Пн окт 11, 2010 19:00:08

Сообщение Мурик »

Не учитесь быдлокодингу! Если на компе float выполняется быстро, то на STM8 будет очень медленно. Пишите так чтобы код был как можно оптимальнее, иначе потом придется переучиваться или будете писать медленный и ресурсоемкий былокод.
Можете посмотреть сколько тактов нужно МК без без аппаратной поддержки float для вычислений с плавающей точкой. http://purebasic.mybb.ru/viewtopic.php?id=717
Собутыльник Кота
Сообщения: 2905
Зарегистрирован: Ср ноя 29, 2017 06:58:50

Сообщение BlackKilkennyCat »

Использование float не делает из кода "быдло". Количество тактов не является приоритетом.
Не учите тупым шаблонам.
Приоритетным является алгоритм, а не высосанные из пальца какие-то догмы.
Использование float чревато лишь из-за способа представления данных, в результате которого в отсутствие чёткого понимания механизма, может быть, например, неверное сравнение в условии. То, что числа с плавающей точкой обрабатываются дольше - всего лишь особенность, каковых куча.
Реклама
Эиком - электронные компоненты и радиодетали
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Сообщение Reflector »

[uquote="Мурик",url="/forum/viewtopic.php?p=3955721#p3955721"]Можете посмотреть сколько тактов нужно МК без без аппаратной поддержки float для вычислений с плавающей точкой. http://purebasic.mybb.ru/viewtopic.php?id=717[/uquote]
Что-то он там не то для H750 намерял, как может получиться в полтора раза меньше F4... У меня для 480 MHz вышло 16 тактов вместо 26, а для 240 MHz, когда делитель AHB можно единичным сделать, вообще всего 11 тактов.
Реклама
Мудрый кот
Сообщения: 1856
Зарегистрирован: Вт авг 15, 2017 10:51:13

Сообщение jcxz »

[uquote="BlackKilkennyCat",url="/forum/viewtopic.php?p=3955654#p3955654"]В случае разных типов я бы указал приведение к типу. Его тут есть?[/uquote]
Причём тут "приведение типа"?
Что такое a,b,c? Здесь форум для телепатов?
Предполагаю что это:

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

enum {b, c};
int a;
Соответствует вашему примеру? Да! Вы это имели в виду или что-то иное? Только телепат знает что имелось в виду. И как прикажете угадать нетелепатам?

[uquote="BlackKilkennyCat",url="/forum/viewtopic.php?p=3955654#p3955654"]Вообще-то, есть ещё такое понятие как время. В одно время мне нужно, чтоб а равнялось б, а в другое время, чтоб с, даже если это время равно одному такту.[/uquote]
Для этого есть volatile. Если вам нужно именно это, то нужно описать:
int volatile a, b, c; (это опять к слову о том - зачем описывать что такое a,b,c)
И тогда будет работать именно так. Без volatile - как я описал выше.
Если человек имел виду такой алгоритм, но написал как вы привели (без volatile) - код кривой, а написатель его - сам себе дурак. Как я уже говорил. И дело не в компиляторах/оптимизаторах, а в написателе сего недоразумения. Впрочем - у неумех всегда во всём инструмент виноват. :dont_know:

[uquote="BlackKilkennyCat",url="/forum/viewtopic.php?p=3955654#p3955654"]Опции, отключающие или ограничивающие влияние оптимизатора на код придумали для таких неверующих в его святость, как я.[/uquote]Баги компиляторов есть, я же не отрицаю (и даже сам их находил и не один). Но в 99.99% случаев кривизна работы какого-то кода - заслуга не кривого компилятора, а прослойки между стулом и клавиатурой. :dont_know:
А "опции отключающие" - придумали главным образом - для возможности отладки с привязкой к исходному коду. Так как - чем выше уровень оптимизации - тем труднее сопоставить исходный код, результирующей последовательности асм-команд.
Если какие-то неумехи используют эти опции всегда (так как не умеют писать код, корректно работающий с любым уровнем оптимизации), то это говорит только об их уровне компетенции. :dont_know:
А нормальный программист если видит, что при включении максимальной оптимизации, програмамма стала глючить, начинает искать ошибки в своём коде. А не заметает проблему под ковёр, отключая оптимизацию. Второе - признак быдлокодера, а не программиста.

Добавлено after 9 minutes 6 seconds:
[uquote="sergey.UA",url="/forum/viewtopic.php?p=3955712#p3955712"]Не увидел разницы в кол. ве проходов цикла, как от обозначения размерности INT так и от обозначения как FLOAT.
jcxz, что вы имели в виду ?[/uquote]
Переменная счётчика цикла (fahr) у вас типа float. float - это значение с плавающей точкой. А значит операции с ним всегда имеют некую погрешность.
А значит на 16-м шаге значение fahr будет: fahr = lower + step * 16 + delta * 16
delta будет зависеть от особенностей реализации операций FPU в данном конкретном компиляторе/МК, а также - от фазы Луны (delta может быть больше или меньше 0).
А значит в каких-то случаях у вас будет 16 шагов, а в каких-то - 15 шагов.

Добавлено after 7 minutes 16 seconds:
[uquote="BlackKilkennyCat",url="/forum/viewtopic.php?p=3955753#p3955753"]Использование float не делает из кода "быдло".[/uquote]Если float - в качестве счётчика цикла - делает.

[uquote="BlackKilkennyCat",url="/forum/viewtopic.php?p=3955753#p3955753"]Приоритетным является алгоритм, а не высосанные из пальца какие-то догмы.[/uquote]А то что число проходов приведённого цикла может зависеть от фазы Луны - ничего? :)))
Вот это и называется быдлокод - скомпилили одним компилятором - 16 проходов, другим - 15. Конечно виноват компилятор и не быдлокодер! :)))
Реклама
Собутыльник Кота
Сообщения: 2905
Зарегистрирован: Ср ноя 29, 2017 06:58:50

Сообщение BlackKilkennyCat »

[uquote="jcxz",url="/forum/viewtopic.php?p=3955761#p3955761"]А то что число проходов приведённого цикла может зависеть от фазы Луны - ничего? :)))[/uquote]
Читайте внимательно:
Использование float чревато лишь из-за способа представления данных, в результате которого в отсутствие чёткого понимания механизма, может быть, например, неверное сравнение в условии.
Это я написал. Поставить сюда ржущий смайлик, что ли...

А "опции отключающие" - придумали главным образом - для возможности отладки с привязкой к исходному коду.
Понятно. Но я уже говорил - спорить не буду. Не видите очевидного, сами себе противоречите (volatile - то же опция) - Ваше счастие. Да и куда мне, неумехе-то, у которого инструмент виноват. У меня даже понимание термина "алгоритм" другое. Неверное.
Мудрый кот
Сообщения: 1856
Зарегистрирован: Вт авг 15, 2017 10:51:13

Сообщение jcxz »

[uquote="BlackKilkennyCat",url="/forum/viewtopic.php?p=3955766#p3955766"]Это я написал. Поставить сюда ржущий смайлик, что ли...[/uquote]
А если написать например что-то типа:

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

static char const t[] = "0\0" "1\0" "2\0" "3\0" "4\0" "5\0" "6\0" "7\0" "8\0" "9";
for (char const *s = &t[0]; atoi(s) < 9; s += strlen(s) + 1) {
  ... //в теле цикла s не используется, только для счётчика цикла!!
}
Это быдлокод или "способ представления данных"? 8)

Добавлено after 13 minutes 1 second:
[uquote="Мурик",url="/forum/viewtopic.php?p=3955721#p3955721"]Не учитесь быдлокодингу! Если на компе float выполняется быстро, то на STM8 будет очень медленно.[/uquote]С точки зрения скорости выполнения и громоздкости, float в том коде не самое страшное. Гораздо хуже то, что там ещё есть и double-операции. Их даже и не всякий ARM аппаратно осилит, а уж о STM8 - вообще молчу. :facepalm:
Потрогал лапой паяльник
Сообщения: 357
Зарегистрирован: Вс янв 11, 2015 20:33:32

Сообщение sergey.UA »

Понял, спасибо. Я пока что не гонюсь за точностью, ( кол. вом циклов ), но в будущем, при обработке ( пересчете ) данных какого то, к примеру 12 - 14 битного АЦП, учту. :)
----------------------
К стати, здесь кто то говорил, что нет какого то определенного языка С для STM8, а как же узко специализированные ( для STM8 ), команды для работы с внутренними модулями камня, команды (функции) для приема - передачи данных по различным встроенным в чип интерфейсам ?
Последний раз редактировалось sergey.UA Пт янв 08, 2021 17:36:29, всего редактировалось 1 раз.
Мудрый кот
Сообщения: 1856
Зарегистрирован: Вт авг 15, 2017 10:51:13

Сообщение jcxz »

[uquote="sergey.UA",url="/forum/viewtopic.php?p=3955780#p3955780"]Понял, спасибо. Я пока что не гонюсь за точностью, ( кол. вом циклов ), но в будущем, при обработке ( пересчете ) данных какого то, к примеру 12 - 14 битного АЦП, учту. :)[/uquote]Тут дело не в точности. Корректно написанное ПО должно выполняться одинаково при работе в любом окружении и компиляции любым компилятором. А у вас будет зависеть от реализации FPU и от особенностей работы его режима округления.
Поэтому типы с плавающей точкой используют только там, где это реально нужно. Для счётчика цикла они не нужны и даже вредны. И при операциях сравнения типов плавающей точки использовать операции ==, <=, >= следует осторожно, помня о погрешности и применяя вместо == проверку на диапазон.
Также следует избегать алгоритмов с накоплением ошибки вычислений (как у вас, где на каждом шаге цикла ошибка вычислений delta суммируется).

Добавлено after 5 minutes 12 seconds:
[uquote="sergey.UA",url="/forum/viewtopic.php?p=3955780#p3955780"]К стати, здесь кто то говорил, что нет какого то определенного языка С для STM8, а как же узко специализированные ( для STM8 ), команды для работы с внутренними модулями камня, команды (функции) для приема - передачи данных по различным встроенным в чип интерфейсам ?[/uquote]Нет таких команд в языке си. Как и функции - это не элементы языка.

PS: Вы бы лучше сперва учебник по си до конца дочитали, прежде чем что-то писать.
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Сообщение Reflector »

[uquote="jcxz",url="/forum/viewtopic.php?p=3955761#p3955761"]Переменная счётчика цикла (fahr) у вас типа float. float - это значение с плавающей точкой. А значит операции с ним всегда имеют некую погрешность.[/uquote]
Не всегда. Если число дробное, то зависит от числа, а целые числа float может хранить без погрешности вплоть до 24-х бит, так что при шаге 20 можно столкнуться с проблемами не раньше 838861 прохода :)
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

[uquote="jcxz",url="/forum/viewtopic.php?p=3955618#p3955618"]Если же предположить что: a,b,c имеют тип int (int a,b,c;)[/uquote]Мне вот так больше нравится.

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

struct B
{
  operator int(){__enable_irq(); return 0;}  
};

struct C
{
  operator int(){__disable_irq(); return 1;}  
};

int main()
{ 
  int a;
  B b;
  C c;
  a=b;
//    CPSIE    I
  a=c;
//    CPSID    I
}
Собутыльник Кота
Сообщения: 2905
Зарегистрирован: Ср ноя 29, 2017 06:58:50

Сообщение BlackKilkennyCat »

Увидел важную информацию для программистов, ...
в МЯЯЯЯУ. всё г... там.
Потрогал лапой паяльник
Сообщения: 357
Зарегистрирован: Вс янв 11, 2015 20:33:32

Сообщение sergey.UA »

Кому интересно, вот здесь :
https://radiokot.ru/forum/viewtopic.php?f=17&t=174887
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

Вот так ещё неплохо.

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

struct B
{ 
  int x;
  B(int y=0){ x=y; }
  operator int() { return x++;}  
};

volatile int a;

int main()
{             
  for(B b;;a=b);    
}
На STM8

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

//volatile int a;
`a`:
        DS8 2
        
//int main()
//{             
//   for(B b;;a=b);    
        CLRW      X
??main_0:
        LDW       L:`a`, X
        INCW      X
        JRA       L:??main_0
//}
Потрогал лапой паяльник
Сообщения: 357
Зарегистрирован: Вс янв 11, 2015 20:33:32

Сообщение sergey.UA »

Только "въезжаю", в язык Си. Есть вопрос.
Изображение
Касательно функции getchar(), в строке №7, программа, подойдя к выполнению этой функции, останавливается. Т.е. ждет, пока не будет введен с клавиатуры какой либо символ ? Точно так же, и в строке №12, в теле цикла, программа приостанавливается. Я все правильно понимаю ?
Собутыльник Кота
Аватара пользователя
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01

Сообщение Eddy_Em »

sergey.UA, в мане же все нормально написано! Неужто тяжко в консоли набрать просто man getchar?
Функция fgetc() считывает очередной символ из потока stream и возвращает unsigned char преобразованный в int, или EOF при достижении конца файла или при возникновении ошибки.
Функция getc() похожа на fgetc(), но она может быть реализована как макрос, который определяет состояние stream более одного раза.
Функция getchar() эквивалентна getc(stdin).
...
Неблокирующие аналоги смотрите в unlocked_stdio(3).
А если набрать man unlocked_stdio, можно увидеть неблокирующие аналоги.

Только к чему здесь stdio, если тема посвящена микроконтроллерам? Использовать stdio в микроконтроллерах — признак неквалифицированности разработчика.
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Контактная информация:
Потрогал лапой паяльник
Сообщения: 357
Зарегистрирован: Вс янв 11, 2015 20:33:32

Сообщение sergey.UA »

То что вопрос не по теме, я в курсе.
И, вопрос был не о том КАК РАБОТАЕТ ФУНКЦИЯ getchar()?
А о том что, ПРИОСТАНАВЛИВАЕТСЯ ЛИ, И ОЖИДАЕТ ВВОДА ПРОГРАММА, В ТАКИХ ТО СТРОКАХ?
Сама функция у меня работает, и в консоли все прекрасно выводится.
И то что с Си не сталкивался ВООБЩЕ, я же ЧЕТКО указал.
Если не сложно, подскажите по поводу ЗАДАВАЕМОГО ВОПРОСА.
Спасибо.
Собутыльник Кота
Сообщения: 2905
Зарегистрирован: Ср ноя 29, 2017 06:58:50

Сообщение BlackKilkennyCat »

Eddy_Em, набрал man ничё не вышло. Что я делаю не так?
sergey.UA, есть ветка вопросов по с/с++ она теоретически больше подходит, так как здесь конкретно stm8. Вас интересует поведение этой функции именно в STM8?
Потрогал лапой паяльник
Сообщения: 357
Зарегистрирован: Вс янв 11, 2015 20:33:32

Сообщение sergey.UA »

BlackKilkennyCat, понял, перейду в более подходящую ветку. От меня просьба, заглядывайте туда иногда.))
Вы правы, касательно STM8. Допустим есть такая функция, ( предположительно ) которая ожидает появления высокого уровня на конкретном пине микроконтроллера. То по аналогии с функцией getchar() в языке Си для Visual Studio, микроконтроллер будет уходить в " вечный цикл ", до появления этого самого высокого уровня? Надеюсь понятно попытался объяснить что я хочу узнать.
Ответить

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