|
IAR 2.10.5 STM8 |
|
|
|
Dec 24 2015, 22:35
|
Частый гость
 
Группа: Участник
Сообщений: 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
|
|
|
|
|
Dec 25 2015, 00:46
|
Местный
  
Группа: Участник
Сообщений: 301
Регистрация: 13-12-15
Из: Харьков
Пользователь №: 89 682

|
Это не ошибка, а предупреждение, что разрядность типа long long в IAR STM8 - 32 бита. Выход, например,через оформление переменной i в виде класса/структуры с соответственной обработкой.
Сообщение отредактировал IgorKossak - Dec 25 2015, 10:54
Причина редактирования: бездумное цитирование
|
|
|
|
|
Dec 25 2015, 04:38
|
Частый гость
 
Группа: Участник
Сообщений: 85
Регистрация: 20-09-15
Пользователь №: 88 488

|
То что 32 бита это я уже понял, как примерно оформить?
Сообщение отредактировал IgorKossak - Dec 25 2015, 10:54
Причина редактирования: бездумное цитирование
|
|
|
|
|
Dec 25 2015, 06:15
|
Знающий
   
Группа: Свой
Сообщений: 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) {}
|
|
|
|
|
Dec 25 2015, 08:46
|
Частый гость
 
Группа: Участник
Сообщений: 85
Регистрация: 20-09-15
Пользователь №: 88 488

|
У меня единственная операция, это сдвиг вправо(влево) в цикле 64 раза... Вот и не пойму как разделить это дело ...
Сообщение отредактировал IgorKossak - Dec 25 2015, 10:54
Причина редактирования: бездумное цитирование
|
|
|
|
|
Dec 25 2015, 08:57
|
Знающий
   
Группа: Свой
Сообщений: 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; } А вообще можно погуглись, может что и по оптимальнее найдется
|
|
|
|
|
Dec 25 2015, 09:25
|
Частый гость
 
Группа: Участник
Сообщений: 85
Регистрация: 20-09-15
Пользователь №: 88 488

|
ну похоже.. я вот не пойму в чем прикол, IAR именно для STM8, в справке такой тип есть, если в него число больше 32 бит не записывать типа предупреждений нет и все работает.... Косяк IAR -?
Сообщение отредактировал IgorKossak - Dec 25 2015, 10:54
Причина редактирования: бездумное цитирование
|
|
|
|
|
Dec 25 2015, 09:39
|
Частый гость
 
Группа: Участник
Сообщений: 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> Там нет описания типов данных, что то подключается автоматом...
|
|
|
|
|
Dec 25 2015, 09:56
|
Знающий
   
Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153

|
Цитата(phenixs @ Dec 25 2015, 12:39)  А не знаете как макрос использовать __delay() и так и сяк не хочет.......... Я с stm8 не сталкивался Цитата Непонятно, подлючаю только это #include <iostm8l152c6.h> Там нет описания типов данных, что то подключается автоматом... ну дык он скорее всего подключает какие-то другие хидеры и в конце концов подключаются системные хидеры с описанием типов
|
|
|
|
|
Dec 25 2015, 10:01
|
Местный
  
Группа: Участник
Сообщений: 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] - для короткого!
|
|
|
|
|
Dec 25 2015, 12:04
|
Частый гость
 
Группа: Участник
Сообщений: 85
Регистрация: 20-09-15
Пользователь №: 88 488

|
Это все ужасно долго, нужно сделать 1 сдвиг, потом передача в DMA и т.д. потом еще сдвиг и т.д. всего 60 - 62 раза, а если делать так это ай-ай ............
Сообщение отредактировал IgorKossak - Dec 25 2015, 18:59
Причина редактирования: бездумное цитирование
|
|
|
|
|
Dec 25 2015, 13:48
|
Местный
  
Группа: Участник
Сообщений: 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
|
|
|
|
|
Dec 25 2015, 15:29
|
Частый гость
 
Группа: Участник
Сообщений: 85
Регистрация: 20-09-15
Пользователь №: 88 488

|
Сечас попробую так временные интервалы измерить.....
Сообщение отредактировал IgorKossak - Dec 25 2015, 19:00
Причина редактирования: бездумное цитирование
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|