реклама на сайте
подробности

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> IAR 2.10.5 STM8
-AZ-
сообщение Dec 25 2015, 19:52
Сообщение #16


Частый гость
**

Группа: Участник
Сообщений: 85
Регистрация: 20-09-15
Пользователь №: 88 488



Цитата(scifi @ Dec 25 2015, 21:47) *
Ну тогда вам ассемблер нужен. По моему опыту яр для стм8 плохенько умеет оптимизировать. Делал i2c ногодрыгом с разгоном (порядка 2 Мбит/м) - сделал на ассемблере. Отлично получилось. Могу пример предоставить.


С ногодрыгом очень интересно посмотреть вашу реализацию функций delay us()
а вот получить тип 64 пока красиво не получается, чтобы можно было без заморочек выполнять операции с ними | << >> &
Go to the top of the page
 
+Quote Post
aiwa
сообщение Dec 25 2015, 21:31
Сообщение #17


Местный
***

Группа: Участник
Сообщений: 301
Регистрация: 13-12-15
Из: Харьков
Пользователь №: 89 682



Цитата(phenixs @ Dec 25 2015, 21:52) *
а вот получить тип 64 пока красиво не получается, чтобы можно было без заморочек выполнять операции с ними | << >> &

Если Вы считаете это красивым, то как пример
CODE
typedef unsigned char uchar;
typedef unsigned int uint;
typedef unsigned long ull;


class t_ULL_64
{
uchar Values[8];
public:
//----------
t_ULL_64()
{
*this=0;
}
t_ULL_64(uint a)
{
*this=a;
}
t_ULL_64 operator = (ull B )
{
*((ull*)&Values[4])=0;
*((ull*)&Values[0])=b;
return *this;
}

t_ULL_64 operator = (t_ULL_64 B )
{
*((ull*)&Values[4])=*((ull*)&b.Values[4]);
*((ull*)&Values[0])=*((ull*)&b.Values[0]);
return *this;
}

t_ULL_64 operator<<(uint B )
{
if(b==0) return *this;
if(b>64) {*this=0; return *this;}
while(B )
{
// сдвижка на 1 бит
*((ull*)&Values[4])<<=1;
if(Values[3]&0x80) Values[4]|=0x01;
*((ull*)&Values[0])<<=1;

b--;
}
return *this;
}
};


int main()
{

t_ULL_64 i;
i=((t_ULL_64)1)<<0x20;

}


Сообщение отредактировал IgorKossak - Dec 25 2015, 21:43
Go to the top of the page
 
+Quote Post
-AZ-
сообщение Dec 27 2015, 10:40
Сообщение #18


Частый гость
**

Группа: Участник
Сообщений: 85
Регистрация: 20-09-15
Пользователь №: 88 488



Без С++ class не собирается, как правильно это на С сделать?

Сообщение отредактировал IgorKossak - Dec 27 2015, 19:48
Причина редактирования: бездумное цитирование
Go to the top of the page
 
+Quote Post
aiwa
сообщение Dec 27 2015, 18:59
Сообщение #19


Местный
***

Группа: Участник
Сообщений: 301
Регистрация: 13-12-15
Из: Харьков
Пользователь №: 89 682



Жестокий у Вас препод, если С++ не разрешает.
На С реализация только через структуры и функцию заменяющую "<<", потому что переопределение операторов С не поддерживает.
Поэтому у Вас, при условии на С и обязательно оставить "<<", есть два варианта:
1. Уговорить участников группы стандартизации С внести в стандарт желаемые изменения.
2. если оператор действительно работает для 64-бит как Вы это утверждаете, то попытаться использовать этот бонус, предоставленный IARом.
но я бы рекомендовал бы проверить работает ли он или только компилится с предупреждением.

P.S. Чтобы Вы не теряли время на проверку работоспособности: скорее всего IAR действительно добросовестно производит сдвиг,
но начиная с момента когда сдвигаемая единица вылазит за 32 бита в 7-й байт, переменная всегда будет равна 0, а не (1<<0x20) и т.д.

Сообщение отредактировал aiwa - Dec 27 2015, 19:21
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Dec 28 2015, 03:48
Сообщение #20


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(aiwa @ Dec 27 2015, 21:59) *
но начиная с момента когда сдвигаемая единица вылазит за 32 бита в 7-й байт, переменная всегда будет равна 0, а не (1<<0x20) и т.д.

Я потерял нить, почему? Компилятор вдруг забыл тип переменной?


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
-AZ-
сообщение Dec 28 2015, 04:56
Сообщение #21


Частый гость
**

Группа: Участник
Сообщений: 85
Регистрация: 20-09-15
Пользователь №: 88 488



Цитата(scifi @ Dec 25 2015, 21:47) *
Ну тогда вам ассемблер нужен. По моему опыту яр для стм8 плохенько умеет оптимизировать. Делал i2c ногодрыгом с разгоном (порядка 2 Мбит/м) - сделал на ассемблере. Отлично получилось. Могу пример предоставить.


как вы реализовали функции delay ? на TIM4 ? а то с этим у stm8 тоже проблемы.........
Go to the top of the page
 
+Quote Post
aiwa
сообщение Dec 28 2015, 09:49
Сообщение #22


Местный
***

Группа: Участник
Сообщений: 301
Регистрация: 13-12-15
Из: Харьков
Пользователь №: 89 682



Цитата(Dog Pawlowa @ Dec 28 2015, 05:48) *
Я потерял нить, почему? Компилятор вдруг забыл тип переменной?


Потому что для STM8 IAR декларировал разрядность типа 'long long' в 32 бита в отличие например от их же AVR8, где она 64 бита.
Поэтому качестве оператора '<<' будет выступать ассемблерная подпрограмма производящая сдвижку только по 4-м байтам, т.е. 32 бита.

Картина похожая на ту, если к 'unsigned char' прибавлять число, большее 256 и результат вылазит за пределы байта,
только с тем отличием, что при сложении в переменная будет содержать кусок результата по модулю 256,
а при сдвиге механизм сдвижки обнуляет освободившийся хвост, и переменная будет = 0;


Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Dec 28 2015, 12:01
Сообщение #23


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(aiwa @ Dec 28 2015, 12:49) *
декларировал разрядность типа 'long long' в 32 бита

Да, проверил, 64-битные переменные и в stdint не работают, даже с #pragma language=extended
Значит, только ручками.


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post

2 страниц V  < 1 2
Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 8th July 2025 - 05:23
Рейтинг@Mail.ru


Страница сгенерированна за 0.01419 секунд с 7
ELECTRONIX ©2004-2016