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

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


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

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



Кто то может уже натыкался на данную проблему, подскажите пожалуйста
Пишу:
Код
unsigned long long i;
i=(((unsigned long long)1)<<0x20);

так вот без ошибки компилирует если сдиг не более 0x1F, если 0x20 и больше выдает ошибку - Warning[Pe063]: shift count is too large
Как это победить, в чем проблема?

Сообщение отредактировал IgorKossak - Dec 25 2015, 10:53
Go to the top of the page
 
+Quote Post
aiwa
сообщение Dec 25 2015, 00:46
Сообщение #2


Местный
***

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



Это не ошибка, а предупреждение, что разрядность типа long long в IAR STM8 - 32 бита.
Выход, например,через оформление переменной i в виде класса/структуры с соответственной обработкой.

Сообщение отредактировал IgorKossak - Dec 25 2015, 10:54
Причина редактирования: бездумное цитирование
Go to the top of the page
 
+Quote Post
-AZ-
сообщение Dec 25 2015, 04:38
Сообщение #3


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

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



То что 32 бита это я уже понял, как примерно оформить?

Сообщение отредактировал IgorKossak - Dec 25 2015, 10:54
Причина редактирования: бездумное цитирование
Go to the top of the page
 
+Quote Post
Непомнящий Евген...
сообщение Dec 25 2015, 06:15
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153



Код
struct U64 {
  uint32_t low, hi;
};



ну и дальше пишете набор необходимых вам арифметических операций

Если у вас просто биты, то возможно будет удобнее работать с массивом байт
Код
struct Mask {
  byte d[8];
};

void mask_clear(Mask *m) { memset(m->d, 0, sizeof(m->d); }
void mask_set(Mask *m, unsigned no) { m->d[no/8] |= (1<<(no%8)); }
void mask_clear(Mask *m, unsigned no) {}
void mask_put(Mask *m, unsigned no, bool v) {}
bool mask_test(Mask *m, unsigned no) {}

Go to the top of the page
 
+Quote Post
-AZ-
сообщение Dec 25 2015, 08:46
Сообщение #5


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

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



У меня единственная операция, это сдвиг вправо(влево) в цикле 64 раза...
Вот и не пойму как разделить это дело ...

Сообщение отредактировал IgorKossak - Dec 25 2015, 10:54
Причина редактирования: бездумное цитирование
Go to the top of the page
 
+Quote Post
Непомнящий Евген...
сообщение Dec 25 2015, 08:57
Сообщение #6


Знающий
****

Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153



Если я ничего не напутал, то что-то в таком духе
Код
struct U64 {
  uint32_t low, hi;
};

U64 u64_lshift(U64 a, unsigned b) {
  U64 r;
  if (b < 32) {
    r.low = a.low<<b;
    r.hi = (a.hi<<b) + (a.low >> (32-b));
  }
  else {
    r.low = 0;
    r.hi = a.low << (b-32);
  }
  return r;
}

А вообще можно погуглись, может что и по оптимальнее найдется
Go to the top of the page
 
+Quote Post
-AZ-
сообщение Dec 25 2015, 09:25
Сообщение #7


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

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



ну похоже..
я вот не пойму в чем прикол, IAR именно для STM8, в справке такой тип есть, если в него число больше 32 бит не записывать типа предупреждений нет и все работает....
Косяк IAR -?

Сообщение отредактировал IgorKossak - Dec 25 2015, 10:54
Причина редактирования: бездумное цитирование
Go to the top of the page
 
+Quote Post
Непомнящий Евген...
сообщение Dec 25 2015, 09:28
Сообщение #8


Знающий
****

Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153



Цитата(phenixs @ Dec 25 2015, 12:25) *
я вот не пойму в чем прикол, IAR именно для STM8, в справке такой тип есть, если в него число больше 32 бит не записывать типа предупреждений нет и все работает....
Косяк IAR -?


посмотрите хидеры, попробуйте сделать sizeof(U64). На авр-ках uint64_t работает...
Go to the top of the page
 
+Quote Post
-AZ-
сообщение Dec 25 2015, 09:39
Сообщение #9


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

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



Цитата(Непомнящий Евгений @ Dec 25 2015, 12:28) *
посмотрите хидеры, попробуйте сделать sizeof(U64). На авр-ках uint64_t работает...

Сейчас гляну....

Цитата(phenixs @ Dec 25 2015, 12:33) *
Сейчас гляну....


А не знаете как макрос использовать __delay() и так и сяк не хочет..........


Цитата(Непомнящий Евгений @ Dec 25 2015, 12:28) *
посмотрите хидеры, попробуйте сделать sizeof(U64). На авр-ках uint64_t работает...

Непонятно, подлючаю только это #include <iostm8l152c6.h>
Там нет описания типов данных, что то подключается автоматом...
Go to the top of the page
 
+Quote Post
Непомнящий Евген...
сообщение Dec 25 2015, 09:56
Сообщение #10


Знающий
****

Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153



Цитата(phenixs @ Dec 25 2015, 12:39) *
А не знаете как макрос использовать __delay() и так и сяк не хочет..........

Я с stm8 не сталкивался


Цитата
Непонятно, подлючаю только это #include <iostm8l152c6.h>
Там нет описания типов данных, что то подключается автоматом...

ну дык он скорее всего подключает какие-то другие хидеры и в конце концов подключаются системные хидеры с описанием типов
Go to the top of the page
 
+Quote Post
aiwa
сообщение Dec 25 2015, 10:01
Сообщение #11


Местный
***

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



Цитата(phenixs @ Dec 25 2015, 10:46) *
У меня единственная операция, это сдвиг вправо(влево) в цикле 64 раза...
Вот и не пойму как разделить это дело ...

Если у Вас единственный сдвиг 0x01 конкретно на 64 бита, то для структуры достаточно операции
Код
struct U64 {
  uint32_t low, hi;
};

low = 0x00;  
hi   = 0x01;
А если встречается различное количество сдвигов то удобнее тип оформить в виде массива 8 байт d[8] и
саму сдвижку производить на ассемблере по алгоритму:
1. d[0] - логический сдвиг для заноса в carry-флаг старшего бита
2. с d[1] - и далее - циклический сдвиг

на С сдвиг на 1 приблизительно так:
CODE
unsigned char carry;

carry = d[0];
d[0]<<=0x01;
for (i=1; i<8;i++)
{
if(carry&0x80)
{
carry=d[i];
d[i]<<=0x01;
d[i]|=0x01;
}
else
{
carry=d[i];
d[i]<<=0x01;
}
}


Сообщение отредактировал IgorKossak - Dec 25 2015, 10:55
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!
Go to the top of the page
 
+Quote Post
-AZ-
сообщение Dec 25 2015, 12:04
Сообщение #12


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

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



Это все ужасно долго, нужно сделать 1 сдвиг, потом передача в DMA и т.д. потом еще сдвиг и т.д. всего 60 - 62 раза, а если делать так это ай-ай ............

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


Местный
***

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



Цитата(phenixs @ Dec 25 2015, 14:04) *
Это все ужасно долго, нужно сделать 1 сдвиг, потом передача в DMA и т.д. потом еще сдвиг и т.д. всего 60 - 62 раза, а если делать так это ай-ай ............


Это "ужасно долго" делает именно IAR для восьмибитных процессоров.
Только система команд STM8 имеет возможность сдвига слова, что позволяет свести операцию над 64-разрядным типом
к 4-м операторам сдвига вместо 8-ми. С предварительным оператором очистки флага carry разумеется.
И так это он повторяет в цикле 62 раза для каждого i=(0x01)<<62;

Для ускорения разумнее организовать цикл с модификацией: i<<=1;

Если Вы желаете, чтобы это выглядело коротко на экране, то можете сделать что-то подобное:

#define SimpleShift(p, n) do{memset(p,0,8); p[n/8]<<=(n%8);}while(0);


и вместо i=(0x01) << 62 вставить
SimpleShift(&i, 62);

Сообщение отредактировал aiwa - Dec 25 2015, 13:49
Go to the top of the page
 
+Quote Post
-AZ-
сообщение Dec 25 2015, 15:29
Сообщение #14


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

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



Сечас попробую так временные интервалы измерить.....

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


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(phenixs @ Dec 25 2015, 15:04) *
Это все ужасно долго, нужно сделать 1 сдвиг, потом передача в DMA и т.д. потом еще сдвиг и т.д. всего 60 - 62 раза, а если делать так это ай-ай ............

Ну тогда вам ассемблер нужен. По моему опыту яр для стм8 плохенько умеет оптимизировать. Делал i2c ногодрыгом с разгоном (порядка 2 Мбит/м) - сделал на ассемблере. Отлично получилось. Могу пример предоставить.
Go to the top of the page
 
+Quote Post

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

 


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


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