Нескольно простых вопросов о программировании AVR на Си.
- strengerst
- Вымогатель припоя
- Сообщения: 516
- Зарегистрирован: Пт янв 18, 2013 15:11:02
Re: Нескольно простых вопросов о программировании AVR на Си.
Скиньте пожалуйста простенький пример передачи данных для Atmega 8, что в PROTEUSE через терминал было видно. А то у меня не чего не получается. Но скажим буква А.
- Реклама
- Z_h_e
- Собутыльник Кота
- Сообщения: 2708
- Зарегистрирован: Сб май 14, 2011 21:16:04
- Откуда: г. Чайковский
Re: Нескольно простых вопросов о программировании AVR на Си.
Есть возможность создания макроса зеркального отображения байта? Спасибо.
- prinv
- Вымогатель припоя
- Сообщения: 677
- Зарегистрирован: Чт янв 20, 2011 09:07:08
- Откуда: Пермь
- Контактная информация:
Re: Нескольно простых вопросов о программировании AVR на Си.
Функции или макроса?
Никакая контра не уйдёт от нас
- Z_h_e
- Собутыльник Кота
- Сообщения: 2708
- Зарегистрирован: Сб май 14, 2011 21:16:04
- Откуда: г. Чайковский
Re: Нескольно простых вопросов о программировании AVR на Си.
Именно так, как я спросил.
- WiseLord
- Друг Кота
- Сообщения: 4905
- Зарегистрирован: Чт апр 11, 2013 11:19:59
- Откуда: Минск
- Контактная информация:
Re: Нескольно простых вопросов о программировании AVR на Си.
Я такое использу. По сути, за счёт inline, мало чем от макроса отличается.
Первую треть (обмен полубайтами) можно и за счёт swap реализовать, но AVR-GCC при оптимизации и сам так делает:
Код: Выделить всё
inline uint8_t swapBits(uint8_t data) __attribute__((always_inline));
inline uint8_t swapBits(uint8_t data)
{
data = (data & 0xF0) >> 4 | (data & 0x0F) << 4;
data = (data & 0xCC) >> 2 | (data & 0x33) << 2;
data = (data & 0xAA) >> 1 | (data & 0x55) << 1;
return data;
}Спойлер
Код: Выделить всё
inline uint8_t swapBits(uint8_t data) __attribute__((always_inline));
inline uint8_t swapBits(uint8_t data)
{
data = (data & 0xF0) >> 4 | (data & 0x0F) << 4;
cc8: 82 95 swap r24
data = (data & 0xCC) >> 2 | (data & 0x33) << 2;
cca: 68 2f mov r22, r24
ccc: 63 73 andi r22, 0x33 ; 51
cce: e4 e0 ldi r30, 0x04 ; 4
cd0: 6e 9f mul r22, r30
cd2: b0 01 movw r22, r0
cd4: 11 24 eor r1, r1
cd6: 8c 7c andi r24, 0xCC ; 204
cd8: 86 95 lsr r24
cda: 86 95 lsr r24
cdc: 68 2b or r22, r24
data = (data & 0xAA) >> 1 | (data & 0x55) << 1;
cde: 86 2f mov r24, r22
ce0: 85 75 andi r24, 0x55 ; 85
ce2: 88 0f add r24, r24
ce4: 6a 7a andi r22, 0xAA ; 170
ce6: 66 95 lsr r22
ce8: 86 2b or r24, r22
}- Реклама
- Z_h_e
- Собутыльник Кота
- Сообщения: 2708
- Зарегистрирован: Сб май 14, 2011 21:16:04
- Откуда: г. Чайковский
Re: Нескольно простых вопросов о программировании AVR на Си.
Я думаю много чем. Меня именно макрос интересует, если нет возможности обойдусь без него.WiseLord писал(а): inline, мало чем от макроса отличается
- WiseLord
- Друг Кота
- Сообщения: 4905
- Зарегистрирован: Чт апр 11, 2013 11:19:59
- Откуда: Минск
- Контактная информация:
Re: Нескольно простых вопросов о программировании AVR на Си.
Вряд ли макросом получится лучше сделать. Скорее всего, вычислений будет намного больше, хотя и тут компилятор может при оптимизации постараться.
- COKPOWEHEU
- Говорящий с текстолитом
- Сообщения: 1525
- Зарегистрирован: Чт июн 10, 2010 20:11:19
Re: Нескольно простых вопросов о программировании AVR на Си.
Код: Выделить всё
#define ByteMirror(x) (\
(((unsigned char)(x)>>7)&(1<<0)) | (((unsigned char)(x)<<7)&(1<<7)) |\ //меняем 0 и 7 биты
(((unsigned char)(x)>>5)&(1<<1)) | (((unsigned char)(x)<<5)&(1<<6)) |\ //меняем 1 и 6 биты
(((unsigned char)(x)>>3)&(1<<2)) | (((unsigned char)(x)<<3)&(1<<5)) |\ //меняем 2 и 5 биты
(((unsigned char)(x)>>1)&(1<<3)) | (((unsigned char)(x)<<1)&(1<<4)) \ //меняем 3 и 4 биты
)- WiseLord
- Друг Кота
- Сообщения: 4905
- Зарегистрирован: Чт апр 11, 2013 11:19:59
- Откуда: Минск
- Контактная информация:
Re: Нескольно простых вопросов о программировании AVR на Си.
Принцип похож, но лучше не по 1 биту 4 раза туда-сюда двигать, а переделать по тому же принципу, как я выше описал. Пусть и в виде макроса:
Код: Выделить всё
ABCDEFGH
/ \
ABCD---- ----EFGH (& 0x0F, & 0xF0)
----ABCD EFGH---- (>>4, <<4)
\ /
EFGHABCD
/ \
EF--AB-- --GH--CD (& 0x33, & 0xCC)
--EF--AB GH--CD-- (>>2, <<2)
\ /
GHEFCDAB
/ \
G-E-C-A- -H-F-D-B (& 0x55, & 0xAA)
-G-E-C-A H-F-D-B- (>>1, <<1)
HGFEDCBA- Z_h_e
- Собутыльник Кота
- Сообщения: 2708
- Зарегистрирован: Сб май 14, 2011 21:16:04
- Откуда: г. Чайковский
Re: Нескольно простых вопросов о программировании AVR на Си.
Ок. Завтра попробую. Чего-то сам не догадался так. Массив надо ин циализировать большой, зеркальные числа в данном случае нагляднее.
Помоему без разницы какой алгоритм будет в макросе, коли его в коде исполняемом не будет.
Помоему без разницы какой алгоритм будет в макросе, коли его в коде исполняемом не будет.
- WiseLord
- Друг Кота
- Сообщения: 4905
- Зарегистрирован: Чт апр 11, 2013 11:19:59
- Откуда: Минск
- Контактная информация:
Re: Нескольно простых вопросов о программировании AVR на Си.
Что значит - не будет в коде? А куда оно и каким волшебным образом денется?
Будет, и, вероятно, длиннее получится, чем в случае inline функций.
Будет, и, вероятно, длиннее получится, чем в случае inline функций.
Последний раз редактировалось WiseLord Сб дек 03, 2016 20:47:42, всего редактировалось 1 раз.
- COKPOWEHEU
- Говорящий с текстолитом
- Сообщения: 1525
- Зарегистрирован: Чт июн 10, 2010 20:11:19
Re: Нескольно простых вопросов о программировании AVR на Си.
Константам безразлично (все равно этим препроцессор заниматься будет), а переменные все равно лучше через ассемблерную вставку делать.
У меня получилось в 15 команд по алгоритму WiseLord'а:
У меня получилось в 15 команд по алгоритму WiseLord'а:
Код: Выделить всё
asm volatile(
"swap %0 \n\t"
"mov r23, %0 \n\t"
"lsl %0 \n\t"
"lsl %0 \n\t"
"andi %0, 0x33 \n\t"
"lsr r23 \n\t"
"lsr r23 \n\t"
"andi r23, 0xCC \n\t"
"or %0, r23 \n\t"
"mov r23, %0 \n\t"
"lsl %0 \n\t"
"andi %0, 0x55\n\t"
"lsr r23 \n\t"
"andi r23, 0xAA \n\t"
"or %0, r23"
:"+a"(x) // х - переменная, одновременно входная и выходная
:
:"r23" //указание компилятору что вставка портит регистр r23, пусть учтет
);- Z_h_e
- Собутыльник Кота
- Сообщения: 2708
- Зарегистрирован: Сб май 14, 2011 21:16:04
- Откуда: г. Чайковский
Re: Нескольно простых вопросов о программировании AVR на Си.
"Что значит - не будет в коде? А куда оно и каким волшебным образом денется"
Препроцессор одно число, заменит на другое.
Препроцессор одно число, заменит на другое.
Re: Нескольно простых вопросов о программировании AVR на Си.
Вопрос знатокам, имеем на руках рабочий девайс атмега 8 часы, термометр, таймер, чем вскрыть прошивку для редактирования, контроллер считывается но как хексфайл, чем привести его в читабельный вид ассемблера для редактирования?
- Z_h_e
- Собутыльник Кота
- Сообщения: 2708
- Зарегистрирован: Сб май 14, 2011 21:16:04
- Откуда: г. Чайковский
Re: Нескольно простых вопросов о программировании AVR на Си.
Сначало поглядите код в цифрах. Если идут попорядку, то камень залочен.
- WiseLord
- Друг Кота
- Сообщения: 4905
- Зарегистрирован: Чт апр 11, 2013 11:19:59
- Откуда: Минск
- Контактная информация:
Re: Нескольно простых вопросов о программировании AVR на Си.
Неверно. Он одно число заменит на целую кучу сдвигов и логических умножений. И я думаю, большую кучу, чем при использовании ассемблерной вставки или inline функции.Z_h_e писал(а):Препроцессор одно число, заменит на другое
Re: Нескольно простых вопросов о программировании AVR на Си.
нет камень не залочен, прошивку считывал и записывал на другую мегу, работает без нареканийZ_h_e писал(а):Сначало поглядите код в цифрах. Если идут попорядку, то камень залочен.
- COKPOWEHEU
- Говорящий с текстолитом
- Сообщения: 1525
- Зарегистрирован: Чт июн 10, 2010 20:11:19
Re: Нескольно простых вопросов о программировании AVR на Си.
Но всю эту кучу он сам вычислит и вставит в код только результирующее число:WiseLord писал(а):Неверно. Он одно число заменит на целую кучу сдвигов и логических умножений. И я думаю, большую кучу, чем при использовании ассемблерной вставки или inline функции.Z_h_e писал(а):Препроцессор одно число, заменит на другое
Код: Выделить всё
#define ANY_CONST 0xA2
PORTB = ByteMirror( ANY_CONST );
...
ldi r16, 0x45
out PORTB, r16- WiseLord
- Друг Кота
- Сообщения: 4905
- Зарегистрирован: Чт апр 11, 2013 11:19:59
- Откуда: Минск
- Контактная информация:
Re: Нескольно простых вопросов о программировании AVR на Си.
Вот именно, только если это число - константа. А в этом случае и макрос не нужен, по большому счёту. По крайней мере, я не могу особо придумать, для чего такое действительно может понадобится - именно инверсия константы.
- Z_h_e
- Собутыльник Кота
- Сообщения: 2708
- Зарегистрирован: Сб май 14, 2011 21:16:04
- Откуда: г. Чайковский
Re: Нескольно простых вопросов о программировании AVR на Си.
С телефона неудобно писать.
WiseLord, Вы путаете с макросами ассемблера.Для чего мне надо я уже писал.
Добавлено after 2 minutes 55 seconds:
А макросы как раз нужны, в том числе, для замены магических чисел. И для удобства.
WiseLord, Вы путаете с макросами ассемблера.Для чего мне надо я уже писал.
Добавлено after 2 minutes 55 seconds:
А макросы как раз нужны, в том числе, для замены магических чисел. И для удобства.



