Видимо мне не повезло и все были в отпуске.
Программирование STM8
Re: Программирование STM8
[uquote="dosikus",url="/forum/viewtopic.php?p=3682089#p3682089"]Какой месяц? В будни - час , два отсилы.[/uquote]
Видимо мне не повезло и все были в отпуске.
Видимо мне не повезло и все были в отпуске.
Re: Программирование STM8
[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]
А здесь только кайло, и паки под них и отладка...
Собственно вопрос завис:[/uquote]
Речь именно о стм8...
[uquote="oleg110592",url="/forum/viewtopic.php?p=3682300#p3682300"]N76E003[/uquote]
А здесь только кайло, и паки под них и отладка...
- Z_h_e
- Собутыльник Кота
- Сообщения: 2708
- Зарегистрирован: Сб май 14, 2011 21:16:04
- Откуда: г. Чайковский
Re: Программирование STM8
Доброго времени суток.
Вопрос опять по IAR.
Вот код входа в обработчик прерываний
Сначала выполняется странное действо через стек по сбросу бита 6 регистра статуса, который всегда имеет значение 0 . Затем на стек сбрасываются охрениард виртуальных регистров и ни один в обработчике не используется. Оптимизация на максимуме. Я знаю что для GNU AVR есть макрос который создает обработчик без сохранения регистров, есть ли в IAR такая возможность? Я кроме вот этого ничего не нашел, может опять в книге вижу фигу?
Вопрос опять по 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Код: Выделить всё
For example:
#include <iostm8s208mb.h>
#pragma vector = UART1_R_RXNE_vector /* Symbol from I/O */
__interrupt void MyInterruptRoutine(void)
{ /* Do something */}
-
Chettuser
Re: Программирование STM8
[uquote="dosikus",url="/forum/viewtopic.php?p=3682460#p3682460"]Речь именно о стм8...[/uquote]
Именно о ней, просто из любопытства попробовал получить файлик.
Именно о ней, просто из любопытства попробовал получить файлик.
Re: Программирование STM8
[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...
Можно сделать ISR без сохранения регистров (на асме), только это приведёт к потенциальным багам из-за порчи регистров в прерывании.
Добавлено after 3 minutes 54 seconds:
[uquote="Z_h_e",url="/forum/viewtopic.php?p=3683265#p3683265"]Я кроме вот этого ничего не нашел, может опять в книге вижу фигу?[/uquote]
Всё есть в мануале. Раздел называется "Calling convention".
Видимо у Вас в коде 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...
Можно сделать 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
Я написал что не используются. Я уже написал на асме обработчик и это решило проблему нехватки времени реакции на внешнее воздействие. Но если обработчик оставлять на асме, придется переписывать его, чтобы избавится от магических цифр. Например пока не знаю в асме обратиться к полю структуры без использования смещения. Но это вопрос о другом.
Avr не при чем.
Avr не при чем.
- ПростоНуб
- Собутыльник Кота
- Сообщения: 2723
- Зарегистрирован: Пт сен 07, 2018 20:20:02
- Откуда: деревня в Тульской губернии
Re: Программирование STM8
[uquote="jcxz",url="/forum/viewtopic.php?p=3683840#p3683840"]компилятор, согласно соглашениям вызова, должен сохранить все регистры, которые не сохраняются вызываемой функцией (scratch registers). Что он и делает.[/uquote]
Прошу прощения, но в STM8S все регистры (кроме, само собой, SP) при прерывании сохраняются в стек аппаратно, вне зависимости от компилятора и того, используются ли эти регистры или нет.
Соответственно, команда IRET загружает все регистры из стека обратно.
Прошу прощения, но в STM8S все регистры (кроме, само собой, SP) при прерывании сохраняются в стек аппаратно, вне зависимости от компилятора и того, используются ли эти регистры или нет.
Соответственно, команда IRET загружает все регистры из стека обратно.
- Z_h_e
- Собутыльник Кота
- Сообщения: 2708
- Зарегистрирован: Сб май 14, 2011 21:16:04
- Откуда: г. Чайковский
Re: Программирование STM8
Я про что и говорю. Сохраняются виртуальные регистры и выполняется дрочего по сбросу бита регистра статуса который всегда ноль.
Добавлено after 1 minute 31 second:
Щас времени нет. Попробую cosmic, но пока время мое кончилось на проект. Может на следующей неделе.
Добавлено 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
Надо будет ещё раз дизассемблер просмотреть. Может я где-то пропустил и все таки компилятор их где-то использует и зря бочку качу. Но действо по сбросу бита 6 СС совсем не ясно. Если я не прав буду, обязательно отпишусь. Сейчас физически не могу перепроверить.
Добавлено after 1 minute 23 seconds:
З.ы. на пустом обработчике тоже ничего не скидывает на стек.
Добавлено after 1 minute 23 seconds:
З.ы. на пустом обработчике тоже ничего не скидывает на стек.
Re: Программирование STM8
[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.
Наверное у Вас какой-то IAR не правильный.
Приведите листинг вашей функции, а то гадать на кофейной гуще можно долго. Именно листинг (.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) - он всегда нулевой без вариантов.
А вот сброс 6-го бита CC меня тоже ввел в недоумение, на всех STM8 (S, AF, AL, L) - он всегда нулевой без вариантов.
- Z_h_e
- Собутыльник Кота
- Сообщения: 2708
- Зарегистрирован: Сб май 14, 2011 21:16:04
- Откуда: г. Чайковский
Re: Программирование STM8
Покопаюсь как будет возможность. Надеюсь упрется в банальную какую то хрень которую проглядел, по хорошему так и должно быть. Ну кроме cc, тут по-моему даже представить невозможно зачем сие нужно.
Добавлено after 3 minutes 21 second:
Про наличие виртуальных регистров тоже только в иаре и увидел. Тоже не вижу в них смысла.
Добавлено after 3 minutes 21 second:
Про наличие виртуальных регистров тоже только в иаре и увидел. Тоже не вижу в них смысла.
Re: Программирование STM8
[uquote="Z_h_e",url="/forum/viewtopic.php?p=3683976#p3683976"]Ну кроме cc, тут по-моему даже представить невозможно зачем сие нужно.[/uquote]
Надо смотреть errata на все STM8 - возможно там есть ответ на этот вопрос. По-крайней мере вижу, что если внутри ISR отсутствует вызов функций, то и сброс 6-го бита тоже не производится.
Надо смотреть errata на все STM8 - возможно там есть ответ на этот вопрос. По-крайней мере вижу, что если внутри ISR отсутствует вызов функций, то и сброс 6-го бита тоже не производится.
- ПростоНуб
- Собутыльник Кота
- Сообщения: 2723
- Зарегистрирован: Пт сен 07, 2018 20:20:02
- Откуда: деревня в Тульской губернии
Re: Программирование STM8
jcxz, Вы были правы. Но проблема не в функции, а в командах деления и их прерывании.
div x, a
в начале прерывания. Мол, пусть она даст неправильный результат, но это меньше кода и, скорее всего, быстрее, чем последовательность из 5 команд.
Что интересно, SDCC в этом случае поступает оригинальней, вставляя команду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.
div x, a
в начале прерывания. Мол, пусть она даст неправильный результат, но это меньше кода и, скорее всего, быстрее, чем последовательность из 5 команд.
- Z_h_e
- Собутыльник Кота
- Сообщения: 2708
- Зарегистрирован: Сб май 14, 2011 21:16:04
- Откуда: г. Чайковский
Re: Программирование STM8
Что ж, надо будет перелопатить обработчик с учётом вышесказанной информации.
Что-то должно улучшиться. Поди на следующей неделе попробую.
Инфа полезная однозначно. Но заданный вопрос остался без ответа. Но скорее всего в иаре нельзя отключить автосохранение вирт регистров.
Что-то должно улучшиться. Поди на следующей неделе попробую.
Инфа полезная однозначно. Но заданный вопрос остался без ответа. Но скорее всего в иаре нельзя отключить автосохранение вирт регистров.
Re: Программирование STM8
[uquote="Z_h_e",url="/forum/viewtopic.php?p=3684281#p3684281"]Инфа полезная однозначно. Но заданный вопрос остался без ответа. Но скорее всего в иаре нельзя отключить автосохранение вирт регистров.[/uquote]
И опять за своё... Зачем????
Ну допустим - отключите, и будут у вас при возникновении прерывания регистры фоновой программы разрушаться. Зачем это??
И опять за своё... Зачем????
Ну допустим - отключите, и будут у вас при возникновении прерывания регистры фоновой программы разрушаться. Зачем это??
- Z_h_e
- Собутыльник Кота
- Сообщения: 2708
- Зарегистрирован: Сб май 14, 2011 21:16:04
- Откуда: г. Чайковский
Re: Программирование STM8
За тем чтобы знать, есть такая возможность в иаре или нет.
Re: Программирование STM8
[uquote="Z_h_e",url="/forum/viewtopic.php?p=3684349#p3684349"]За тем чтобы знать, есть такая возможность в иаре или нет.[/uquote]
Очевидно что нет, так как бессмысленные вещи, я думаю, они реализовывать не будут.
Очевидно что нет, так как бессмысленные вещи, я думаю, они реализовывать не будут.
Re: Программирование STM8
Доброго времени суток.
Позвольте мяукнуть, надеюсь по теме. Если что модераторы поправят. Возможно есть смысл создать отдельную тему для совсем чайников (типа меня).
Тоже хочу погрузиться в мир МК и решил начать с STM8 (+STVD+COSMIC).
При компиляции появляется код ошибки
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)
Есть желание научиться разбираться с этими кодами (ошибок). Где вообще про них рассказывается? Наверняка есть какой то мануал(ы). А так же интересуют все остальные формы общения с компиляторами (предполагаю,что принцип действия у них одинаковый). Хотелось бы, прежде чем обращаться за конкретными техническими советами, сначала разобраться в теории. Подскажите пожалуйста подходящую литературу (сайты).
Спасибо.
Позвольте мяукнуть, надеюсь по теме. Если что модераторы поправят. Возможно есть смысл создать отдельную тему для совсем чайников (типа меня).
Тоже хочу погрузиться в мир МК и решил начать с 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)
Спасибо.
