02.12.2010, 06:47
|
|
Гражданин KAZUS.RU
Регистрация: 04.04.2007
Сообщений: 941
Сказал спасибо: 571
Сказали Спасибо 113 раз(а) в 85 сообщении(ях)
|
Re: STM8(S/L), первые впечатления
Сообщение от SasaVitebsk
|
Писать на ассемблере сейчас нет смысла, а соответственно хотелось бы посмотреть как проц справляется с реальной задачей. С учётом компиляции. Хотя это тоже не
|
Как раз на асме-то и происходит реальное сравнение возможностей ядер , а если писать на С то будет нечистое сравнение поскольку сюда уже будет входить еще и разная реализация функций как там компиляторы сами себе там по разному ваяют - да и еще и от текущих версии тех компиляторов для одного и того же ядра ,и еще от "степени понимания" ими написанных на С прог, и тогда про затраченные на это такты уже даже и говорить не приходится , и получается ну совсем необьктивно .
__________________
Короче асма кода нет !
Последний раз редактировалось Falconist; 14.04.2011 в 00:22.
|
|
|
|
02.12.2010, 07:01
|
|
Гражданин KAZUS.RU
Регистрация: 04.04.2007
Сообщений: 941
Сказал спасибо: 571
Сказали Спасибо 113 раз(а) в 85 сообщении(ях)
|
Re: STM8(S/L), первые впечатления
Сообщение от Gnider
|
...Чисто ради интереса протестил это пример на lpc1111
Получилось функция SummArray выполняется за 4529 тактов и занимает 38 байт.
P.S. Камень стоит 35 рублей.
|
Согласен , LPC уже точно более-менее подходит на замену AVR-а , по сравнению с рассматриваемыми STM8.
__________________
Короче асма кода нет !
Последний раз редактировалось Falconist; 14.04.2011 в 00:22.
|
|
|
|
02.12.2010, 08:35
|
|
Гражданин KAZUS.RU
Регистрация: 04.04.2007
Сообщений: 941
Сказал спасибо: 571
Сказали Спасибо 113 раз(а) в 85 сообщении(ях)
|
Re: STM8(S/L), первые впечатления
Сообщение от kison
|
Сообщение от SasaVitebsk Посмотреть сообщение
Очень неплохая фишка, как раздельное тактирование таймера от PLL с повышением тактовой (как у xmega),
Такого нет Только поделить можно, увы.
Сообщение от SasaVitebsk Посмотреть сообщение
управление событиями как у xmega тоже бы очень помогли.
Там что то подобное имеется. Я еще не до конца разобрался.
Сообщение от SasaVitebsk Посмотреть сообщение
Ещё. В одной новой разработке нужен АЦП с диф входом на 8 каналов.
Опять увы - нету. Впрочем самих входов куча, но вот в диф. режиме они не функционируют. На разницу в цене с хмегой можно пару внешних 4-х канальных ОУ прицепить. Разницы не на пару хватит, а на десяток.
|
Входы у XMega могут работать в диф режиме - вместо обычных 8 получается 4 дифференциальных входа .
По PLL - есть там умножение частоты тактовой - внимательнее смотрите datasheet на XMeg -у , причем любой множитель от 1 до 31 .
__________________
Короче асма кода нет !
Последний раз редактировалось Falconist; 14.04.2011 в 00:22.
|
|
|
|
02.12.2010, 11:26
|
|
Прописка
Регистрация: 26.01.2009
Сообщений: 249
Сказал спасибо: 23
Сказали Спасибо 102 раз(а) в 61 сообщении(ях)
|
Re: STM8(S/L), первые впечатления
2pinco: Вы забыли написать, что табуляция лучше пробелов. А то как-то не полный комплект для мирового холивара...
|
|
|
|
02.12.2010, 13:36
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.12.2004
Сообщений: 3,172
Сказал спасибо: 11
Сказали Спасибо 692 раз(а) в 504 сообщении(ях)
|
Re: STM8(S/L), первые впечатления
Сообщение от pinco
|
Раз не пользовался AVR -ами то и не нужно вводить народ в заблуждение - команды установки бита в AVR -есть - это для РОН команда sbr Rd,K где регистр Rd это тот в котором устанавливаем , а K это константа - маска изменяемых битов где в константе стоя единички , и причем даже за один присест изменить не один бит в регистре , а хоть все 8
|
Читаем внимательно - не пользовался не АВР, а АВ - Algoritm Builder. А команды sbr нету, это псевдоним ORI. Вы выдергиваете из контекста кусок обсуждения, так делать не нужно. Речь шла о том, что обработчик прерывания из двух команд ORI reg,x reti у АВР недопустим в принципе. Если больше нравится - sbr reg,x reti - код абсолютно одинаковый.
Сообщение от pinco
|
А в AVR-ах тоже система прерыв продуманная , и не никакая не "псевдо" а нормальная , и причем даже в самом программном ходе обработки текущего прерывания можно устанавливать и сбрасывать прерыв другого уровня
|
Нужно не устанавливать и сбрасывать, нужно чтоб более приоритетное могло прервать текущее, а менее приоритетное - ждало своей очереди. Ну по типу АРМ7 с его FIQ и IRQ. Но там всего два уровня, причем быстрым можно сделать всего одно прерывание. Иначе оно перестанет быть быстрым. Так что нет приоритетов у АВР. Хотите поспорить? Тогда давайте, но с примерами. А вот у STM8 реально 3 приоритета.
Сообщение от pinco
|
Да нет , никак фичей назвать не могу потому что такую же систему можно реализовать и на AVR-е : при инициализации определять наличие генерации и подключать кварц если генерация с него есть
|
Пример такой инициализации можно? Вы вообще АВР видели хоть раз???? У него генератор определяется фьюзами и если установлен например на кварц и кварц отвалится, то никакой ватчдог уже не поможет.
Сообщение от pinco
|
Да опять неверно - для sbi/cbi в AVR доступны все младшие регистры ввода/вывода адресов до 32 - а их там дофига в общем-то .
|
32 от общего числа в например 70 вовсе не дофига.
Сообщение от pinco
|
По PLL - есть там умножение частоты тактовой - внимательнее смотрите datasheet на XMeg -у , причем любой множитель от 1 до 31 .
|
Перечтите то, на что отвечаете еще раз. Александр именно это и написал - PLL как у XMEGA.
Последний раз редактировалось kison; 13.04.2011 в 18:17.
|
|
|
|
02.12.2010, 14:01
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.12.2004
Сообщений: 3,172
Сказал спасибо: 11
Сказали Спасибо 692 раз(а) в 504 сообщении(ях)
|
Re: STM8(S/L), первые впечатления
Сообщение от andries5
|
В AVRStudio можно было посчитать время исполнения программы по шагам, а в STVD можно? Что-бы настроить функцию Delay() не используя таймер.
|
Функция задержки иногда полезная вещь. Настраивать ее неблагодарное дело.
В общем вот пример такой задержки, компилятор Космик.
Код:
|
// файл delay.h
#ifndef DELAY_H
#define DELAY_H
#ifndef F_CPU
#error "F_CPU not defined!"
#endif
#define US(x) \
(unsigned int)((((x*(F_CPU/1000000.0))‹=8)*8 \
+((x*(F_CPU/1000000.0))›8)*(x*(F_CPU/1000000.0)) - 4)/4)
#define MS(x) US(x*1000)
@inline void delay(unsigned int del)
{
volatile unsigned int tmp;
tmp = del;
#asm
$N:
decw x
jrne $L
nop
#endasm
}
#endif // #ifndef DELAY_H |
Для работы необходимо определить глобальный дефайн F_CPU. В установках проекта на вкладке опций компилятора. Для обоих режимов - и релиза и дебага отдельно!
Смотрите картинку. Частота в герцах, UL в конце - unsigned long.
Нельзя использовать такую задержку при отключенной оптимизации и нельзя передавать ей в качестве параметра переменную! Параметр - только константа!
Как использовать:
Код:
|
#include ‹delay.h›
int main(void)
{
// трам пам пам
delay(US(100));
delay(MS(10));
delay(MS(1.7));
// трам пам пам
} |
Ограничения - минимальная задержка 8 тактов. Максимальная 65536*4= 262144 такта.
Пользуйтесь на здоровье. А тому кто подскажет как сделать инлайновую функцию на голом асме и не потерять параметр будет респект и уважуха. Чтоб понять что я хочу уберите из delay объявление переменной tmp и присваивание ей параметра функции.
При 16МГц такта минимум 0,5мкс, разрешение 0,25мкс. Округляется вниз, т.е. задержка на 0,5мкс и 0,6мкс будет одинаковой - 0,5. Следующая возможная 0,75 и т.д. до 16мС с копейками. При снижении такта соответственно растет минимальная, максимальная задержка и шаг ее.
ЗЫ. Отзывы о работоспособности/неработоспособности приветствуются. Я физически не могу все свои функции тестировать со всеми опциями оптимизации. Так что надеюсь на багрепорты. И задержки и того что планирую в скором времени выложить.
Последний раз редактировалось kison; 13.04.2011 в 18:17.
|
|
|
Эти 5 пользователя(ей) сказали Спасибо kison за это сообщение:
|
|
|
02.12.2010, 20:36
|
|
Гуру портала
Регистрация: 20.11.2004
Сообщений: 10,018
Сказал спасибо: 936
Сказали Спасибо 2,270 раз(а) в 1,565 сообщении(ях)
|
Re: STM8(S/L), первые впечатления
]Где накосячил не пойму :
Код:
|
#include "stm8s105c_s.h"
#include "stdint.h"
#define LED1 PORTB1
void main (void)
{
CLK_ECKR=0x01; //Разрешаем работу генератора с внешним кварцем (HSEEN)
CLK_SWCR=0x02; //Разрешаем переключение генераторов;
CLK_SWR=0xB4; //Выбираем clock от кварцевого генератора (HSE)
CLK_CKDIVR=0; //Делители частоты внутреннего и внешнего генератора на 1 - частота ядра максимальная
while(CLK_CMSR!=0xB4); //Ждем стабилизации частоты
CLK_CSSR=0x01; //Разрешаем автопереключение источника Clock на внутренний при неисправности генератора
DDRB1 = 1;
PB_CR1=0XFF;
PB_CR2=0XFF;
PE_DDR=0x01;
PE_CR1=0x01;
PE_CR2=0x01;
CLK_CCOR=0x09;
while (1)
{
LED1=~LED1;
}
} |
Главный цикл компилируется в :
Код:
|
main.c:37 LED1=~LED1;
0x8109 BCPL _PB_ODR,#1
0x810d JRT 0x8109 |
Считаю так :
Такт - при 16 МГц -62,5ns .
BCPL - 1 такт
JRT - 2 такта
Итого (1+2)*2 * 62,5 ns получаем период 375ns или 2,666 МГц .
На Rigole вижу 2 МГц и период 498ns.
Смотрел на кварце - норма .
Вывел на E0 fCPU - так же норма - 16 МГц.
Откуда появился лишний такт ?????
__________________
Осторожно , злой кот
Последний раз редактировалось Falconist; 14.04.2011 в 00:21.
Причина: Описка - JRT 2 такта
|
|
|
|
02.12.2010, 21:04
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.12.2004
Сообщений: 3,172
Сказал спасибо: 11
Сказали Спасибо 692 раз(а) в 504 сообщении(ях)
|
Re: STM8(S/L), первые впечатления
Интересно. Видимо где то лишний такт затесался. Симулятор показывает 3, а их на самом деле 4.... Попозже попробую у себя.
Последний раз редактировалось kison; 13.04.2011 в 18:17.
|
|
|
|
02.12.2010, 21:14
|
|
Почётный гражданин KAZUS.RU
Регистрация: 19.02.2008
Сообщений: 1,759
Сказал спасибо: 123
Сказали Спасибо 598 раз(а) в 415 сообщении(ях)
|
Re: STM8(S/L), первые впечатления
Сообщение от dosikus
|
Итого (1+3)*2 * 62,5 ns получаем период 375ns или 2,666 МГц .
|
А меня результат другой 500ns или 2.000 МГц (1+3=4, 4*2=8, 8*62,5=500)
А инициализацию делал так
void Init_CLK(void)
{
CLK_DeInit();
CLK_ClockSwitchConfig(CLK_SWITCHMODE_AUTO, CLK_SOURCE_HSE,DISABLE,DISABLE);
CLK_SYSCLKConfig(CLK_PRESCALER_CPUDIV16);
}
Последний раз редактировалось Falconist; 14.04.2011 в 00:21.
|
|
|
|
02.12.2010, 21:17
|
|
Гуру портала
Регистрация: 20.11.2004
Сообщений: 10,018
Сказал спасибо: 936
Сказали Спасибо 2,270 раз(а) в 1,565 сообщении(ях)
|
Re: STM8(S/L), первые впечатления
Дальше хуже :
Код:
|
#include "stm8s105c_s.h"
#include "stdint.h"
#define LED1 PORTB1
void main (void)
{
CLK_ECKR=0x01; //Разрешаем работу генератора с внешним кварцем (HSEEN)
CLK_SWCR=0x02; //Разрешаем переключение генераторов;
CLK_SWR=0xB4; //Выбираем clock от кварцевого генератора (HSE)
CLK_CKDIVR=0; //Делители частоты внутреннего и внешнего генератора на 1 - частота ядра максимальная
while(CLK_CMSR!=0xB4); //Ждем стабилизации частоты
CLK_CSSR=0x01; //Разрешаем автопереключение источника Clock на внутренний при неисправности генератора
DDRB1 = 1;
PB_CR1=0XFF;
PB_CR2=0XFF;
PE_DDR=0x01;
PE_CR1=0x01;
PE_CR2=0x01;
CLK_CCOR=0x09;
while (1)
{
LED1=1;
LED1=0;
}
} |
Код:
|
main.c:38 LED1=1;
0x8109 BSET _PB_ODR,#1
main.c:39 LED1=0;
0x810d BRES _PB_ODR,#1
0x8111 JRT 0x8109 |
Имеем 2,6 МГц и 375 ns вместо 4 МГц и 250 ns.
Добавилось 2 лишних такта .
Такое ощущение что битовые операции имеют 2 такта а не 1.
__________________
Осторожно , злой кот
Последний раз редактировалось Falconist; 14.04.2011 в 00:21.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 00:03.
|
|