Программирование STM8
PombI4, про прошивальщик я не в курсе, к сожалению. Прошивки не блокирую, а остальное удобней устанавливать в коде, так как это может зависеть от параметров сборки.
- Реклама
Доброго времени суток. В RM016 указано, что 16 битный регистр TIM1_CNTR имеет теневой регистр для чтения и не имеет для записи. ARR имеет теневой для записи, про чтение вроде как ничего не сказано. И ничего больше я не нашел.
Теперь сам вопрос. Режим захвата, считываю захваченные данные вот так Компиллится в команду LDW. Данные ваще неадекват.
Делаю так. Захваченные данные верные.
На всякий случай еще вот так. Захваченные данные похожи на расчетные, но тоже неверные.
Это выходит что и регистр захвата, как минимум для чтения имеет теневой регистр, а где это написано?
Или я не ту смазку для лыж выбрал?
Теперь сам вопрос. Режим захвата, считываю захваченные данные вот так
Код: Выделить всё
uint16_t capch;
capch=*((uint16_t*)&TIM2_CCR3H);Делаю так.
Код: Выделить всё
uint16_t capch;
((uint8_t *)&capch)[0]=TIM2_CCR3H;
((uint8_t *)&capch)[1]=TIM2_CCR3L;На всякий случай еще вот так.
Код: Выделить всё
uint16_t capch;
((uint8_t *)&capch)[1]=TIM2_CCR3L;
((uint8_t *)&capch)[0]=TIM2_CCR3H;Это выходит что и регистр захвата, как минимум для чтения имеет теневой регистр, а где это написано?
Или я не ту смазку для лыж выбрал?
- Сообщения: 2567
- Зарегистрирован: Вт май 01, 2018 19:44:47
[uquote="Z_h_e",url="/forum/viewtopic.php?p=3672468#p3672468"]Это выходит что и регистр захвата, как минимум для чтения имеет теневой регистр, а где это написано?[/uquote]На странице 167. Там же и последовательность чтения нарисована. Всё гораздо проще, не надо мудрить. На восьмибитке сдвиг на 8 бесплатен.Ну или так, если не веришь компилятору
Тот компилятор, который не сделает из этого просто две операции чтения, выкинуть и никогда не использовать 
Код: Выделить всё
uint16_t capch=(TIM2_CCR3H<<8)|TIM2_CCR3L;Код: Выделить всё
uint16_t capch = TIM2_CCR3H<<8;
capch |= TIM2_CCR3L;Спасибо.VladislavS писал(а):На странице 167.
Попробовал предложенных оба варианта. Компиллится в кучу команд в том числе логики и сдвига. IAR, оптимизация максимум в режиме speed.VladislavS писал(а): Всё гораздо проще, не надо мудрить. На восьмибитке сдвиг на 8 бесплатен.
В моем варианте переменная capch загружается в 4 команды через аккумулятор.
- Сообщения: 2567
- Зарегистрирован: Вт май 01, 2018 19:44:47
Ну значит IAR ещё не готов к STM8.
Вот смотри как он с AVR-ками расправляется.
Вариант 1.
Вариант 2.
Вот смотри как он с AVR-ками расправляется.
Вариант 1.
Код: Выделить всё
void foo(uint16_t data)
{
if(data) __enable_interrupt(); else __disable_interrupt();
}
int main()
{
uint16_t capch = (PORTB<<8) | PORTC;
foo(capch);
for(;;);
}
//------------- Листинг ------------
//int main()
main:
//{
// uint16_t capch = (PORTB<<8) | PORTC;
// foo(capch);
IN R19, 0x18
IN R16, 0x15
OR R16, R19
BREQ ??main_0
SEI
RJMP ??main_1
??main_0:
CLI
//for(;;);
??main_1:
RJMP ??main_1
//}
Код: Выделить всё
void foo(uint16_t data)
{
if(data) __enable_interrupt(); else __disable_interrupt();
}
int main()
{
uint16_t capch;
((uint8_t *)&capch)[0]= PORTB;
((uint8_t *)&capch)[1]= PORTC;
foo(capch);
for(;;);
}
//------------- Листинг ------------
//int main()
main:
//{
SBIW R29:R28, 2
// uint16_t capch;
// ((uint8_t *)&capch)[0]= PORTB;
IN R16, 0x18
ST Y, R16
//((uint8_t *)&capch)[1]= PORTC;
IN R16, 0x15
STD Y+1, R16
// foo(capch);
LD R16, Y
LDD R17, Y+1
OR R16, R17
BREQ ??main_0
SEI
RJMP ??main_1
??main_0:
CLI
//for(;;);
??main_1:
RJMP ??main_1
//}
- Реклама
- Сообщения: 3386
- Зарегистрирован: Пн окт 11, 2010 19:00:08
Для STM8 не так много компиляторов, тем более бесплатных.VladislavS писал(а):Тот компилятор, который не сделает из этого просто две операции чтения, выкинуть и никогда не использовать
- Сообщения: 2567
- Зарегистрирован: Вт май 01, 2018 19:44:47
IAR самый бесплатный из них? 
Не, ну правда, собрать на восьмибиткн uint16_t из двух uint8_t без сдвигов это даже не детский сад.
Не, ну правда, собрать на восьмибиткн uint16_t из двух uint8_t без сдвигов это даже не детский сад.
Решил проверить компильнуть код почти в один в один. А именно вот такой.
Все равно компиллит в достаточно длинный код, при этом фу вызывает реально. Попробовал добавить в объявление функции inline, переключившись в С++ , ничего не изменилось. Оптимизатор переключил со speed на size, то же ничего.
Интересный момент, вот это с компиллилось в это
И это при наличии четырех байтной команды inc mem, которая выполнится за один такт.
Код: Выделить всё
void foo(uint16_t data)
{
if(data) asm("rim"); else asm("sim");
}
int main()
{
uint16_t capch = (TIM2_CCR3H<<8) | TIM2_CCR3L;
//TIM2_CCR3L++;
foo(capch);
for(;;);
}Интересный момент, вот это
Код: Выделить всё
TIM2_CCR3L++;Код: Выделить всё
TIM2_CCR3L++;
0085A5 C65316 LD A, TIM2_CCR3L
0085A8 4C INC A
0085A9 C75316 LD TIM2_CCR3L, A
Код: Выделить всё
asm("inc TIM2_CCR3L");
0085B0 725C5316 INC TIM2_CCR3L- Сообщения: 1846
- Зарегистрирован: Вт авг 15, 2017 10:51:13
[uquote="VladislavS",url="/forum/viewtopic.php?p=3677556#p3677556"]IAR самый бесплатный из них?
[/uquote]
Да, IAR для STM8 бесплатен для размера кода вроде до 8К. А если учесть, что у многих STM8 столько и есть флеши всего, то можно считать что он просто бесплатен.
Добавлено after 3 minutes 49 seconds:
[uquote="Z_h_e",url="/forum/viewtopic.php?p=3677669#p3677669"]Все равно компиллит в достаточно длинный код, при этом фу вызывает реально. Попробовал добавить в объявление функции inline, переключившись в С++ , ничего не изменилось. Оптимизатор переключил со speed на size, то же ничего.[/uquote]
Подозреваю, что Вы используете какую-то древнюю версию IAR. По-крайней мере когда я 2 года назад писал для STM8, как раз вышла версия IAR 3.10 взамен старой 2.20 и качество компилируемого кода резко улучшилось. На версии 2.20 был полный шлак.
Да, IAR для STM8 бесплатен для размера кода вроде до 8К. А если учесть, что у многих STM8 столько и есть флеши всего, то можно считать что он просто бесплатен.
Добавлено after 3 minutes 49 seconds:
[uquote="Z_h_e",url="/forum/viewtopic.php?p=3677669#p3677669"]Все равно компиллит в достаточно длинный код, при этом фу вызывает реально. Попробовал добавить в объявление функции inline, переключившись в С++ , ничего не изменилось. Оптимизатор переключил со speed на size, то же ничего.[/uquote]
Подозреваю, что Вы используете какую-то древнюю версию IAR. По-крайней мере когда я 2 года назад писал для STM8, как раз вышла версия IAR 3.10 взамен старой 2.20 и качество компилируемого кода резко улучшилось. На версии 2.20 был полный шлак.
- Сообщения: 3386
- Зарегистрирован: Пн окт 11, 2010 19:00:08
Бесплатный SDCC http://sdcc.sourceforge.net/VladislavS писал(а):IAR самый бесплатный из них?
- Сообщения: 1846
- Зарегистрирован: Вт авг 15, 2017 10:51:13
[uquote="Z_h_e",url="/forum/viewtopic.php?p=3677669#p3677669"]Интересный момент, вот это с компиллилось в это
И это при наличии четырех байтной команды inc mem, которая выполнится за один такт.[/uquote]
Подозреваю, что сиё связано с тем, что TIM2_CCR3L у Вас объявлен как volatile.
Код: Выделить всё
TIM2_CCR3L++;Код: Выделить всё
TIM2_CCR3L++;
0085A5 C65316 LD A, TIM2_CCR3L
0085A8 4C INC A
0085A9 C75316 LD TIM2_CCR3L, A
Подозреваю, что сиё связано с тем, что TIM2_CCR3L у Вас объявлен как volatile.
Нельзя. IAR коммерческий продукт и рассчитывая получить прибыль с продаж, надо все же было постараться сделать компиллятор по умнее. Тем более система команд STM8 заточена под Си, да и ИАРовцы умеют же, видимо не приоритет просто. А то что демо версия подошла под радиолюбительские хотелки, это частный счастливый случайjcxz писал(а):можно считать что он просто бесплатен.
Хрен с ним, придется сильнее напрягать межушный оптимизатор
Добавлено after 1 minute 23 seconds:
И что? Что это меняет? Проверять пока не хочу, но стоит.jcxz писал(а):Подозреваю, что сиё связано с тем, что TIM2_CCR3L у Вас объявлен как volatile.
Добавлено after 21 minute 20 seconds:
3.10.4 У меня.jcxz писал(а):Вы используете какую-то древнюю версию IAR.
- Сообщения: 2567
- Зарегистрирован: Вт май 01, 2018 19:44:47
[uquote="Z_h_e",url="/forum/viewtopic.php?p=3677700#p3677700"]Добавлено after 1 minute 23 seconds:
[uquote="Z_h_e",url="/forum/viewtopic.php?p=3677700#p3677700"]3.10.4 У меня.[/uquote]Крайняя 3.11.1
[uquote="Z_h_e",url="/forum/viewtopic.php?p=3677669#p3677669"]Все равно компиллит в достаточно длинный код, при этом фу вызывает реально. Попробовал добавить в объявление функции inline, переключившись в С++ , ничего не изменилось. Оптимизатор переключил со speed на size, то же ничего.[/uquote]Да ладно, инлайнит только в путь даже если не просить об этом.
Вариант 1.Вариант 2.
Вариант 3. С глобальной переменной.
На самом деле разница по тактам не так чтобы катастрофична. В случае с локальной переменной надо же и работу со стеком учитывать. Но всё равно, тупо с двумя байтами не разобраться это надо суметь...
И что? Что это меняет? Проверять пока не хочу, но стоит.[/uquote]Это меняет то, что X++ это чтение/модификация/запись и компилятор не имеет права это изменять.jcxz писал(а):Подозреваю, что сиё связано с тем, что TIM2_CCR3L у Вас объявлен как volatile.
[uquote="Z_h_e",url="/forum/viewtopic.php?p=3677700#p3677700"]3.10.4 У меня.[/uquote]Крайняя 3.11.1
[uquote="Z_h_e",url="/forum/viewtopic.php?p=3677669#p3677669"]Все равно компиллит в достаточно длинный код, при этом фу вызывает реально. Попробовал добавить в объявление функции inline, переключившись в С++ , ничего не изменилось. Оптимизатор переключил со speed на size, то же ничего.[/uquote]Да ладно, инлайнит только в путь даже если не просить об этом.
Вариант 1.
Спойлер
Код: Выделить всё
#include "iostm8s103f2.h"
#include "intrinsics.h"
#include "stdint.h"
void foo(uint16_t data)
{
if(data) __enable_interrupt(); else __disable_interrupt();
}
int main()
{
uint16_t capch = (TIM2_CCR3H<<8) | TIM2_CCR3L;
foo(capch);
for(;;);
}
// --- Листинг ----
//int main()
//{
// uint16_t capch = (TIM2_CCR3H<<8) | TIM2_CCR3L;
/ foo(capch);
main:
LD A, L:0x5315
CLRW X
LD XL, A
CLR A
RLWA X, A
LD A, L:0x5316
LD S:?b1, A
RRWA X, A
OR A, S:?b1
RRWA X, A
RRWA X, A
JREQ L:??main_0
RIM
JRA L:??main_1
??main_0:
SIM
// for(;;);
??main_1:
JRA L:??main_1
//}
Спойлер
Код: Выделить всё
#include "iostm8s103f2.h"
#include "intrinsics.h"
#include "stdint.h"
void foo(uint16_t data)
{
if(data) __enable_interrupt(); else __disable_interrupt();
}
int main()
{
uint16_t capch;
((uint8_t *)&capch)[0]= TIM2_CCR3H;
((uint8_t *)&capch)[1]= TIM2_CCR3L;
foo(capch);
for(;;);
}
// --- Листинг ----
/int main()
//{
main:
SUB SP, #0x2
// uint16_t capch;
// ((uint8_t *)&capch)[0]= TIM2_CCR3H;
LD A, L:0x5315
LD (0x1,SP), A
// ((uint8_t *)&capch)[1]= TIM2_CCR3L;
LD A, L:0x5316
LD (0x2,SP), A
//
// foo(capch);
LDW X, (0x1,SP)
JREQ L:??main_0
RIM
JRA L:??main_1
??main_0:
SIM
// for(;;);
??main_1:
JRA L:??main_1
//}
Спойлер
Код: Выделить всё
#include "iostm8s103f2.h"
#include "intrinsics.h"
#include "stdint.h"
void foo(uint16_t data)
{
if(data) __enable_interrupt(); else __disable_interrupt();
}
uint16_t capch;
int main()
{
capch = (TIM2_CCR3H<<8) | TIM2_CCR3L;
foo(capch);
for(;;);
}
// --- Листинг ----
//int main()
//{
// ((uint8_t *)&capch)[0]= TIM2_CCR3H;
main:
MOV L:capch, L:0x5315
// ((uint8_t *)&capch)[1]= TIM2_CCR3L;
MOV L:capch + 1, L:0x5316
//
// foo(capch);
LDW X, L:capch
JREQ L:??main_0
RIM
JRA L:??main_1
??main_0:
SIM
//
//for(;;);
??main_1:
JRA L:??main_1
//}
Инструкция inc mem именно это и делает.VladislavS писал(а):Это меняет то, что X++ это чтение/модификация/запись и компилятор не имеет права это изменять.
Надо будет обновиться.VladislavS писал(а):Крайняя 3.11.1
В смысле?VladislavS писал(а):Но всё равно, тупо с двумя байтами не разобраться это надо суметь...
- Сообщения: 2567
- Зарегистрирован: Вт май 01, 2018 19:44:47
[uquote="Z_h_e",url="/forum/viewtopic.php?p=3677804#p3677804"]
В смысле?[/uquote]Я же показывал как IAR на AVR с этим примером расправляется. А на STM8 - фиг вам.VladislavS писал(а):Но всё равно, тупо с двумя байтами не разобраться это надо суметь...
- Сообщения: 1846
- Зарегистрирован: Вт авг 15, 2017 10:51:13
[uquote="VladislavS",url="/forum/viewtopic.php?p=3677827#p3677827"]Я же показывал как IAR на AVR с этим примером расправляется. А на STM8 - фиг вам.[/uquote]
Что поделаешь, если даже для таких широко-востребованных ядер как ARM, где всё должно быть уже просто вылизано, оптимизатор IAR очень часто косячит. Иногда даже не то что оптимизацию, а даже просто наоборот - кажется старается строить как можно менее оптимальный код. Даже если си-шный исходник программист пытается сделать более удобным для оптимизации компилятором.
PS: Вобщем - далеко ещё современным оптимизаторам до возможностей человека-оптимизатора.
Что поделаешь, если даже для таких широко-востребованных ядер как ARM, где всё должно быть уже просто вылизано, оптимизатор IAR очень часто косячит. Иногда даже не то что оптимизацию, а даже просто наоборот - кажется старается строить как можно менее оптимальный код. Даже если си-шный исходник программист пытается сделать более удобным для оптимизации компилятором.
PS: Вобщем - далеко ещё современным оптимизаторам до возможностей человека-оптимизатора.
- Сообщения: 1846
- Зарегистрирован: Вт авг 15, 2017 10:51:13
[uquote="Z_h_e",url="/forum/viewtopic.php?p=3677700#p3677700"]
Можно ещё Cosmic попробовать. У него размер бесплатного кода насколько помню <=32К. Про качество компиляции ничего не скажу - мне его интерфейс не понравился и поэтому запускал его только один раз.
Нельзя. IAR коммерческий продукт и рассчитывая получить прибыль с продаж, надо все же было постараться сделать компиллятор по умнее.[/uquote]jcxz писал(а):можно считать что он просто бесплатен.
Можно ещё Cosmic попробовать. У него размер бесплатного кода насколько помню <=32К. Про качество компиляции ничего не скажу - мне его интерфейс не понравился и поэтому запускал его только один раз.
- Сообщения: 3604
- Зарегистрирован: Пн июл 28, 2008 22:12:01
У космика нет ограничений, бесплатная лицензия на год.
Долго спите батенька, этой новости уж лет 5.
И даже тогда космик компилил лучше Яра...
Долго спите батенька, этой новости уж лет 5.
И даже тогда космик компилил лучше Яра...
Извините что не по теме, подскажите пожалуйста, раз уж разговор зашёл про Cosmic. Как в Cosmic CxSTM32 32K 4.3.11 добавить поддержку новых камней - F7/H7, G0 и G4? Скачал, а там только старьё можно выбрать...
Спасибо!
Спасибо!
- Сообщения: 1846
- Зарегистрирован: Вт авг 15, 2017 10:51:13
[uquote="dosikus",url="/forum/viewtopic.php?p=3680117#p3680117"]У космика нет ограничений, бесплатная лицензия на год.[/uquote]
А после года - что?
Я не помню деталей, но когда запрашивал у них пробный ключ, то запрашивал тот, который без ограничений по времени, но с ограничениями по размеру кода.
Может и долго, но как написал: я им так и не воспользовался - IAR-а хватило. А интерфейс там был какой-то вырвиглаз.
Добавлено after 5 minutes:
[uquote="Chettuser",url="/forum/viewtopic.php?p=3681715#p3681715"]Извините что не по теме, подскажите пожалуйста, раз уж разговор зашёл про Cosmic. Как в Cosmic CxSTM32 32K 4.3.11 добавить поддержку новых камней - F7/H7, G0 и G4?[/uquote]
Даже не знал, что он ещё и для ARM-ов есть...
А почему такой странный выбор? А не как все: IAR, Keil, GCC?
А после года - что?
Я не помню деталей, но когда запрашивал у них пробный ключ, то запрашивал тот, который без ограничений по времени, но с ограничениями по размеру кода.
Может и долго, но как написал: я им так и не воспользовался - IAR-а хватило. А интерфейс там был какой-то вырвиглаз.
Добавлено after 5 minutes:
[uquote="Chettuser",url="/forum/viewtopic.php?p=3681715#p3681715"]Извините что не по теме, подскажите пожалуйста, раз уж разговор зашёл про Cosmic. Как в Cosmic CxSTM32 32K 4.3.11 добавить поддержку новых камней - F7/H7, G0 и G4?[/uquote]
Даже не знал, что он ещё и для ARM-ов есть...
А почему такой странный выбор? А не как все: IAR, Keil, GCC?



