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

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
jcxz
Мудрый кот
Сообщения: 1717
Зарегистрирован: Вт авг 15, 2017 10:51:13

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

Сообщение jcxz »

[uquote="dosikus",url="/forum/viewtopic.php?p=3682089#p3682089"]Какой месяц? В будни - час , два отсилы.[/uquote]
Видимо мне не повезло и все были в отпуске. :dont_know:
Реклама
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

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

Сообщение dosikus »

[uquote="Chettuser",url="/forum/viewtopic.php?p=3682157#p3682157"]Я лицензию получил через 2 или 3 часа после запроса. В рабочий день. Сделал ради любопытства - у меня нет STM8.
Собственно вопрос завис:[/uquote]

Речь именно о стм8...

[uquote="oleg110592",url="/forum/viewtopic.php?p=3682300#p3682300"]N76E003[/uquote]
А здесь только кайло, и паки под них и отладка...
Реклама
Аватара пользователя
Z_h_e
Собутыльник Кота
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

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

Сообщение Z_h_e »

Доброго времени суток.
Вопрос опять по IAR.
Вот код входа в обработчик прерываний

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

   \                     _interrupt_14:
   \   000000 8A           PUSH      CC
   \   000001 84           POP       A
   \   000002 A4 BF        AND       A, #0xbf
   \   000004 88           PUSH      A
   \   000005 86           POP       CC
   \   000006 3B ....      PUSH      S:?b3
   \   000009 3B ....      PUSH      S:?b2
   \   00000C 3B ....      PUSH      S:?b1
   \   00000F 3B ....      PUSH      S:?b0
   \   000012 3B ....      PUSH      S:?b7
   \   000015 3B ....      PUSH      S:?b6
   \   000018 3B ....      PUSH      S:?b5
   \   00001B 3B ....      PUSH      S:?b4
Сначала выполняется странное действо через стек по сбросу бита 6 регистра статуса, который всегда имеет значение 0 . Затем на стек сбрасываются охрениард виртуальных регистров и ни один в обработчике не используется. Оптимизация на максимуме. Я знаю что для GNU AVR есть макрос который создает обработчик без сохранения регистров, есть ли в IAR такая возможность? Я кроме вот этого ничего не нашел, может опять в книге вижу фигу?

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

For example:
#include <iostm8s208mb.h>
#pragma vector = UART1_R_RXNE_vector  /* Symbol from I/O */
 __interrupt void MyInterruptRoutine(void)
{  /* Do something */} 
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Chettuser

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

Сообщение Chettuser »

[uquote="dosikus",url="/forum/viewtopic.php?p=3682460#p3682460"]Речь именно о стм8...[/uquote]
Именно о ней, просто из любопытства попробовал получить файлик. :)
Реклама
Эиком - электронные компоненты и радиодетали
jcxz
Мудрый кот
Сообщения: 1717
Зарегистрирован: Вт авг 15, 2017 10:51:13

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

Сообщение jcxz »

[uquote="Z_h_e",url="/forum/viewtopic.php?p=3683265#p3683265"]Сначала выполняется странное действо через стек по сбросу бита 6 регистра статуса, который всегда имеет значение 0 . Затем на стек сбрасываются охрениард виртуальных регистров и ни один в обработчике не используется.[/uquote]
Видимо у Вас в коде ISR все эти регистры используются. Или где-то в ISR есть вызов функции, который невозможно заинлайнить. А значит - компилятор, согласно соглашениям вызова, должен сохранить все регистры, которые не сохраняются вызываемой функцией (scratch registers). Что он и делает.
И любой компилятор, следующий аналогичным соглашениям вызова, должен так делать. Хоть IAR, хоть GCC - он тут не виноват.
Чтобы избавиться от этого (если это из-за функции) дайте возможность заинлайнить функцию компилятору. Или вообще от неё избавьтесь.
Если в IAR-е есть возможность компиляции всего проекта как единого файла, то так тоже можно сделать: так компилятор должен заинлайнить даже функцию, находящуюся в другом си-файле (не помню только - есть такой ключ в IAR for STM8 или нет?).

[uquote="Z_h_e",url="/forum/viewtopic.php?p=3683265#p3683265"]Я знаю что для GNU AVR есть макрос который создает обработчик без сохранения регистров, есть ли в IAR такая возможность?[/uquote]
А при чём тут AVR? Тема вроде про STM8... :dont_know:
Можно сделать ISR без сохранения регистров (на асме), только это приведёт к потенциальным багам из-за порчи регистров в прерывании.

Добавлено after 3 minutes 54 seconds:
[uquote="Z_h_e",url="/forum/viewtopic.php?p=3683265#p3683265"]Я кроме вот этого ничего не нашел, может опять в книге вижу фигу?[/uquote]
Всё есть в мануале. Раздел называется "Calling convention".
Реклама
Аватара пользователя
Z_h_e
Собутыльник Кота
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

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

Сообщение Z_h_e »

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

Avr не при чем.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Реклама
Аватара пользователя
ПростоНуб
Собутыльник Кота
Сообщения: 2723
Зарегистрирован: Пт сен 07, 2018 20:20:02
Откуда: деревня в Тульской губернии

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

Сообщение ПростоНуб »

[uquote="jcxz",url="/forum/viewtopic.php?p=3683840#p3683840"]компилятор, согласно соглашениям вызова, должен сохранить все регистры, которые не сохраняются вызываемой функцией (scratch registers). Что он и делает.[/uquote]
Прошу прощения, но в STM8S все регистры (кроме, само собой, SP) при прерывании сохраняются в стек аппаратно, вне зависимости от компилятора и того, используются ли эти регистры или нет.
Соответственно, команда IRET загружает все регистры из стека обратно.
Аватара пользователя
Z_h_e
Собутыльник Кота
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

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

Сообщение Z_h_e »

Я про что и говорю. Сохраняются виртуальные регистры и выполняется дрочего по сбросу бита регистра статуса который всегда ноль.

Добавлено after 1 minute 31 second:
Щас времени нет. Попробую cosmic, но пока время мое кончилось на проект. Может на следующей неделе.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Аватара пользователя
ПростоНуб
Собутыльник Кота
Сообщения: 2723
Зарегистрирован: Пт сен 07, 2018 20:20:02
Откуда: деревня в Тульской губернии

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

Сообщение ПростоНуб »

Z_h_e, я тоже не пойму этой мастурбации. В SDCC пустой обработчик прерывания выглядит совершенно лаконично:

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

_EXTI_PORTA_IRQHandler:
;	EXTI_PORTA_IRQHandler.c: 53: }
	iret
Аватара пользователя
Z_h_e
Собутыльник Кота
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

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

Сообщение Z_h_e »

Надо будет ещё раз дизассемблер просмотреть. Может я где-то пропустил и все таки компилятор их где-то использует и зря бочку качу. Но действо по сбросу бита 6 СС совсем не ясно. Если я не прав буду, обязательно отпишусь. Сейчас физически не могу перепроверить.

Добавлено after 1 minute 23 seconds:
З.ы. на пустом обработчике тоже ничего не скидывает на стек.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
jcxz
Мудрый кот
Сообщения: 1717
Зарегистрирован: Вт авг 15, 2017 10:51:13

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

Сообщение jcxz »

[uquote="Z_h_e",url="/forum/viewtopic.php?p=3683853#p3683853"]Я написал что не используются.[/uquote]
Наверное у Вас какой-то IAR не правильный. :))) Мой IAR_3.10 не сохраняет регистры если они не используются и нет вызовов внешних функций из ISR.
Приведите листинг вашей функции, а то гадать на кофейной гуще можно долго. Именно листинг (.lst-файл), а не исходник.

Добавлено after 4 minutes 33 seconds:
[uquote="Z_h_e",url="/forum/viewtopic.php?p=3683853#p3683853"]Я уже написал на асме обработчик и это решило проблему нехватки времени реакции на внешнее воздействие.[/uquote]
Если Вы написали на асме и оставили там вызов той функции, которая была в си-шном ISR (и из-за которой и сохранялись регистры), то тоже должны сохранить регистры. Иначе наступите потом на грабли за нарушение Calling conventions.
Аватара пользователя
ПростоНуб
Собутыльник Кота
Сообщения: 2723
Зарегистрирован: Пт сен 07, 2018 20:20:02
Откуда: деревня в Тульской губернии

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

Сообщение ПростоНуб »

Z_h_e, что касается виртуальных регистров (точнее использования первых 256 байт памяти), тут уже больше вопросов к оптимизатору. Насколько разумно переписывать их в стек и обратно, вместо того, чтобы аллоцировать под рабочие переменные место в том же стеке и воспользоваться индексной адресацией от SP? Ни по размеру кода, ни по скорости выполенения разницы не будет. Мне больше по душе логика SDCC, живущего без виртуальных регистров, но размещающего в первых 256 байтах оперативки глобальные статические переменные, что позовяет эффективно обращаться к ним без использования индексных регистров X и Y.
А вот сброс 6-го бита CC меня тоже ввел в недоумение, на всех STM8 (S, AF, AL, L) - он всегда нулевой без вариантов.
Аватара пользователя
Z_h_e
Собутыльник Кота
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

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

Сообщение Z_h_e »

Покопаюсь как будет возможность. Надеюсь упрется в банальную какую то хрень которую проглядел, по хорошему так и должно быть. Ну кроме cc, тут по-моему даже представить невозможно зачем сие нужно.

Добавлено after 3 minutes 21 second:
Про наличие виртуальных регистров тоже только в иаре и увидел. Тоже не вижу в них смысла.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
jcxz
Мудрый кот
Сообщения: 1717
Зарегистрирован: Вт авг 15, 2017 10:51:13

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

Сообщение jcxz »

[uquote="Z_h_e",url="/forum/viewtopic.php?p=3683976#p3683976"]Ну кроме cc, тут по-моему даже представить невозможно зачем сие нужно.[/uquote]
Надо смотреть errata на все STM8 - возможно там есть ответ на этот вопрос. По-крайней мере вижу, что если внутри ISR отсутствует вызов функций, то и сброс 6-го бита тоже не производится.
Аватара пользователя
ПростоНуб
Собутыльник Кота
Сообщения: 2723
Зарегистрирован: Пт сен 07, 2018 20:20:02
Откуда: деревня в Тульской губернии

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

Сообщение ПростоНуб »

jcxz, Вы были правы. Но проблема не в функции, а в командах деления и их прерывании.
Unexpected DIV/DIVW instruction result in ISR

Description
In very specific conditions, a DIV/DIVW instruction may return a false result when executed inside an interrupt service routine (ISR). This error occurs when the DIV/DIVW instruction is interrupted and a second interrupt is generated during the execution of the IRET instruction of the first ISR. Under these conditions, the DIV/DIVW instruction executed inside the second ISR, including function calls, may return an unexpected result.The applications that do not use the DIV/DIVW instruction within ISRs are not impacted.

Workaround
If an ISR or a function called by this routine contains a division operation, the following assembly code should be added inside the ISR before the DIV/DIVW instruction:
push cc
pop a
and a,#$BF
push a
pop cc
This sequence should be placed by C compilers at the beginning of the ISR using DIV/DIVW. The user can refer to the compiler documentation for details on the implementation and control of automatic or manual code insertion.
Что интересно, SDCC в этом случае поступает оригинальней, вставляя команду
div x, a
в начале прерывания. Мол, пусть она даст неправильный результат, но это меньше кода и, скорее всего, быстрее, чем последовательность из 5 команд.
Аватара пользователя
Z_h_e
Собутыльник Кота
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

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

Сообщение Z_h_e »

Что ж, надо будет перелопатить обработчик с учётом вышесказанной информации.
Что-то должно улучшиться. Поди на следующей неделе попробую.

Инфа полезная однозначно. Но заданный вопрос остался без ответа. Но скорее всего в иаре нельзя отключить автосохранение вирт регистров.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
jcxz
Мудрый кот
Сообщения: 1717
Зарегистрирован: Вт авг 15, 2017 10:51:13

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

Сообщение jcxz »

[uquote="Z_h_e",url="/forum/viewtopic.php?p=3684281#p3684281"]Инфа полезная однозначно. Но заданный вопрос остался без ответа. Но скорее всего в иаре нельзя отключить автосохранение вирт регистров.[/uquote]
И опять за своё... Зачем???? :dont_know:
Ну допустим - отключите, и будут у вас при возникновении прерывания регистры фоновой программы разрушаться. Зачем это??
Аватара пользователя
Z_h_e
Собутыльник Кота
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

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

Сообщение Z_h_e »

За тем чтобы знать, есть такая возможность в иаре или нет.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
jcxz
Мудрый кот
Сообщения: 1717
Зарегистрирован: Вт авг 15, 2017 10:51:13

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

Сообщение jcxz »

[uquote="Z_h_e",url="/forum/viewtopic.php?p=3684349#p3684349"]За тем чтобы знать, есть такая возможность в иаре или нет.[/uquote]
Очевидно что нет, так как бессмысленные вещи, я думаю, они реализовывать не будут.
nuisance
Родился
Сообщения: 6
Зарегистрирован: Чт апр 07, 2016 09:44:42

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

Сообщение nuisance »

Доброго времени суток.
Позвольте мяукнуть, надеюсь по теме. Если что модераторы поправят. Возможно есть смысл создать отдельную тему для совсем чайников (типа меня). :)
Тоже хочу погрузиться в мир МК и решил начать с STM8 (+STVD+COSMIC).
При компиляции появляется код ошибки
Спойлер----------- Project discover - STM8 Cosmic - Configuration Debug -------------

Compiling libraries\stm8s_stdperiph_driver\src\stm8s_clk.c...
cxstm8 +mods0 +debug -pxp +compact -pp -l -ilibraries\stm8_touchsensing_driver\inc -ilibraries\stm8s_stdperiph_driver\inc -iinc -i..\..\..\..\libraries\stm8_touchsensing_driver\inc -i..\..\..\..\libraries\stm8s_stdperiph_driver\inc -i..\..\inc -i"..\..\..\..\..\..\..\..\..\program files\stmicroelectronics\st_toolset\include" -i..\..\..\includes -i..\..\..\..\stm8sfwlib\fwlib\library\inc -i..\..\..\..\stm8_ts_lib\includes -i"D:\Program Files (x86)\COSMIC\CXSTM8_32K\Hstm8" -clDebug\ -coDebug\ libraries\stm8s_stdperiph_driver\src\stm8s_clk.c
libraries\stm8s_stdperiph_driver\src\stm8s_clk.c:
WIN execution failed
The command: "cxstm8 +mods0 +debug -pxp +compact -pp -l -ilibraries\stm8_touchsensing_driver\inc -ilibraries\stm8s_stdperiph_driver\inc -iinc -i..\..\..\..\libraries\stm8_touchsensing_driver\inc -i..\..\..\..\libraries\stm8s_stdperiph_driver\inc -i..\..\inc -i"..\..\..\..\..\..\..\..\..\program files\stmicroelectronics\st_toolset\include" -i..\..\..\includes -i..\..\..\..\stm8sfwlib\fwlib\library\inc -i..\..\..\..\stm8_ts_lib\includes -i"D:\Program Files (x86)\COSMIC\CXSTM8_32K\Hstm8" -clDebug\ -coDebug\ libraries\stm8s_stdperiph_driver\src\stm8s_clk.c" has failed, the returned value is: 2
exit code=2.

discover.elf - 1 error(s), 0 warning(s)
Есть желание научиться разбираться с этими кодами (ошибок). Где вообще про них рассказывается? Наверняка есть какой то мануал(ы). А так же интересуют все остальные формы общения с компиляторами (предполагаю,что принцип действия у них одинаковый). Хотелось бы, прежде чем обращаться за конкретными техническими советами, сначала разобраться в теории. Подскажите пожалуйста подходящую литературу (сайты).
Спасибо.
Ответить

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