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

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

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

PombI4, про прошивальщик я не в курсе, к сожалению. Прошивки не блокирую, а остальное удобней устанавливать в коде, так как это может зависеть от параметров сборки.
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

Доброго времени суток. В RM016 указано, что 16 битный регистр TIM1_CNTR имеет теневой регистр для чтения и не имеет для записи. ARR имеет теневой для записи, про чтение вроде как ничего не сказано. И ничего больше я не нашел.

Теперь сам вопрос. Режим захвата, считываю захваченные данные вот так

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

    uint16_t capch;
    capch=*((uint16_t*)&TIM2_CCR3H);
Компиллится в команду LDW. Данные ваще неадекват.

Делаю так.

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

    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

Сообщение VladislavS »

[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;
Тот компилятор, который не сделает из этого просто две операции чтения, выкинуть и никогда не использовать :)
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

VladislavS писал(а):На странице 167.
Спасибо. :oops: Вечно сам себе трудности нахожу, чтобы их мужественно преодолевать.
VladislavS писал(а): Всё гораздо проще, не надо мудрить. На восьмибитке сдвиг на 8 бесплатен.
Попробовал предложенных оба варианта. Компиллится в кучу команд в том числе логики и сдвига. IAR, оптимизация максимум в режиме speed.
В моем варианте переменная capch загружается в 4 команды через аккумулятор.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Реклама
Эиком - электронные компоненты и радиодетали
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

Ну значит IAR ещё не готов к STM8.

Вот смотри как он с 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
//}
Вариант 2.

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

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

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

VladislavS писал(а):Тот компилятор, который не сделает из этого просто две операции чтения, выкинуть и никогда не использовать
Для STM8 не так много компиляторов, тем более бесплатных.
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

IAR самый бесплатный из них? :)

Не, ну правда, собрать на восьмибиткн uint16_t из двух uint8_t без сдвигов это даже не детский сад.
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

Решил проверить компильнуть код почти в один в один. А именно вот такой.

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

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(;;);   
}
Все равно компиллит в достаточно длинный код, при этом фу вызывает реально. Попробовал добавить в объявление функции inline, переключившись в С++ , ничего не изменилось. Оптимизатор переключил со speed на size, то же ничего.

Интересный момент, вот это

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

TIM2_CCR3L++;
с компиллилось в это

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

   
  TIM2_CCR3L++;
    0085A5    C65316         LD        A, TIM2_CCR3L
    0085A8    4C             INC       A
    0085A9    C75316         LD        TIM2_CCR3L, A 
И это при наличии четырех байтной команды inc mem, которая выполнится за один такт.

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

  asm("inc TIM2_CCR3L");
    0085B0    725C5316       INC       TIM2_CCR3L
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Мудрый кот
Сообщения: 1846
Зарегистрирован: Вт авг 15, 2017 10:51:13

Сообщение jcxz »

[uquote="VladislavS",url="/forum/viewtopic.php?p=3677556#p3677556"]IAR самый бесплатный из них? :)[/uquote]
Да, IAR для STM8 бесплатен для размера кода вроде до 8К. А если учесть, что у многих STM8 столько и есть флеши всего, то можно считать что он просто бесплатен. 8)

Добавлено 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

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

VladislavS писал(а):IAR самый бесплатный из них?
Бесплатный SDCC http://sdcc.sourceforge.net/
Мудрый кот
Сообщения: 1846
Зарегистрирован: Вт авг 15, 2017 10:51:13

Сообщение jcxz »

[uquote="Z_h_e",url="/forum/viewtopic.php?p=3677669#p3677669"]Интересный момент, вот это

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

TIM2_CCR3L++;
с компиллилось в это

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

   
  TIM2_CCR3L++;
    0085A5    C65316         LD        A, TIM2_CCR3L
    0085A8    4C             INC       A
    0085A9    C75316         LD        TIM2_CCR3L, A 
И это при наличии четырех байтной команды inc mem, которая выполнится за один такт.[/uquote]
Подозреваю, что сиё связано с тем, что TIM2_CCR3L у Вас объявлен как volatile.
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

jcxz писал(а):можно считать что он просто бесплатен.
Нельзя. IAR коммерческий продукт и рассчитывая получить прибыль с продаж, надо все же было постараться сделать компиллятор по умнее. Тем более система команд STM8 заточена под Си, да и ИАРовцы умеют же, видимо не приоритет просто. А то что демо версия подошла под радиолюбительские хотелки, это частный счастливый случай :).

Хрен с ним, придется сильнее напрягать межушный оптимизатор :).

Добавлено after 1 minute 23 seconds:
jcxz писал(а):Подозреваю, что сиё связано с тем, что TIM2_CCR3L у Вас объявлен как volatile.
И что? Что это меняет? Проверять пока не хочу, но стоит.

Добавлено after 21 minute 20 seconds:
jcxz писал(а):Вы используете какую-то древнюю версию IAR.
3.10.4 У меня.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

[uquote="Z_h_e",url="/forum/viewtopic.php?p=3677700#p3677700"]Добавлено after 1 minute 23 seconds:
jcxz писал(а):Подозреваю, что сиё связано с тем, что TIM2_CCR3L у Вас объявлен как volatile.
И что? Что это меняет? Проверять пока не хочу, но стоит.[/uquote]Это меняет то, что X++ это чтение/модификация/запись и компилятор не имеет права это изменять.

[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
//}
Вариант 2.
Спойлер

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

#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
//}
Вариант 3. С глобальной переменной.
Спойлер

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

#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
//}
На самом деле разница по тактам не так чтобы катастрофична. В случае с локальной переменной надо же и работу со стеком учитывать. Но всё равно, тупо с двумя байтами не разобраться это надо суметь...
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

VladislavS писал(а):Это меняет то, что X++ это чтение/модификация/запись и компилятор не имеет права это изменять.
Инструкция inc mem именно это и делает.
VladislavS писал(а):Крайняя 3.11.1
Надо будет обновиться.
VladislavS писал(а):Но всё равно, тупо с двумя байтами не разобраться это надо суметь...
В смысле?
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

[uquote="Z_h_e",url="/forum/viewtopic.php?p=3677804#p3677804"]
VladislavS писал(а):Но всё равно, тупо с двумя байтами не разобраться это надо суметь...
В смысле?[/uquote]Я же показывал как IAR на AVR с этим примером расправляется. А на STM8 - фиг вам.
Мудрый кот
Сообщения: 1846
Зарегистрирован: Вт авг 15, 2017 10:51:13

Сообщение jcxz »

[uquote="VladislavS",url="/forum/viewtopic.php?p=3677827#p3677827"]Я же показывал как IAR на AVR с этим примером расправляется. А на STM8 - фиг вам.[/uquote]
Что поделаешь, если даже для таких широко-востребованных ядер как ARM, где всё должно быть уже просто вылизано, оптимизатор IAR очень часто косячит. Иногда даже не то что оптимизацию, а даже просто наоборот - кажется старается строить как можно менее оптимальный код. Даже если си-шный исходник программист пытается сделать более удобным для оптимизации компилятором.

PS: Вобщем - далеко ещё современным оптимизаторам до возможностей человека-оптимизатора.
Мудрый кот
Сообщения: 1846
Зарегистрирован: Вт авг 15, 2017 10:51:13

Сообщение jcxz »

[uquote="Z_h_e",url="/forum/viewtopic.php?p=3677700#p3677700"]
jcxz писал(а):можно считать что он просто бесплатен.
Нельзя. IAR коммерческий продукт и рассчитывая получить прибыль с продаж, надо все же было постараться сделать компиллятор по умнее.[/uquote]
Можно ещё Cosmic попробовать. У него размер бесплатного кода насколько помню <=32К. Про качество компиляции ничего не скажу - мне его интерфейс не понравился и поэтому запускал его только один раз.
Друг Кота
Аватара пользователя
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Сообщение dosikus »

У космика нет ограничений, бесплатная лицензия на год.
Долго спите батенька, этой новости уж лет 5.
И даже тогда космик компилил лучше Яра...
Chettuser

Сообщение Chettuser »

Извините что не по теме, подскажите пожалуйста, раз уж разговор зашёл про Cosmic. Как в Cosmic CxSTM32 32K 4.3.11 добавить поддержку новых камней - F7/H7, G0 и G4? Скачал, а там только старьё можно выбрать...
Спасибо!
Мудрый кот
Сообщения: 1846
Зарегистрирован: Вт авг 15, 2017 10:51:13

Сообщение jcxz »

[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-ов есть... :facepalm:
А почему такой странный выбор? А не как все: IAR, Keil, GCC?
Ответить

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