Телесистемы
 Разработка, производство и продажа радиоэлектронной аппаратуры
На главную   | Карта сайта | Пишите нам | В избранное
Требуется программист в Зеленограде
- обработка данных с датчиков; ColdFire; 40 тыс.
e-mail:jobsmp@pochta.ru

Телесистемы | Электроника | Конференция «Микроконтроллеры и их применение»

Ну, именно так не выйдет, как не крути код. Не очень умеют C-компиляторы такие финты с битом С делать.

Отправлено ReAl 15 июня 2007 г. 11:33
В ответ на: Вообще код приблизительно такой..... отправлено Amal 15 июня 2007 г. 10:36

Так что если пишешь на С - то "прими в свою душу" этот факт.
И пиши просто и незатейливо

#include

uint16_t counters[8];

void cnt(uint8_t b)
{
uint8_t i=8;
uint16_t *p = counters;
do {
if( b & 0x01) ++*p;
b >>= 1;
++p;
} while(--i);
}

и получай такой код - кстати, выполняющийся в среднем быстрее :-)

.global cnt
.type cnt, @function
cnt:
/* prologue: frame size=0 */
/* prologue end (size=0) */
mov r18,r24
ldi r30,lo8(counters)
ldi r31,hi8(counters)
rjmp .L2
.L9:
lsr r18
adiw r30,2
.L2:
sbrs r18,0
rjmp .L3
ld r24,Z
ldd r25,Z+1
adiw r24,1
std Z+1,r25
st Z,r24
.L3:
ldi r24,hi8(counters+14)
cpi r30,lo8(counters+14)
cpc r31,r24
brne .L9
ret
/* function cnt size 18 (18) */

Ближайшим аналогом твоего ассемблерного кода будет:

#include

uint16_t counters[8];

void cnt(uint8_t b)
{
uint8_t i=8;
uint16_t *p = counters;
do {
*p++ += (b & 0x01);
b >>= 1;
} while(--i);
}

код

.global cnt
.type cnt, @function
cnt:
/* prologue: frame size=0 */
/* prologue end (size=0) */
mov r20,r24
ldi r30,lo8(counters)
ldi r31,hi8(counters)
.L2:
mov r18,r20
clr r19
andi r18,lo8(1)
andi r19,hi8(1)
ld r24,Z
ldd r25,Z+1
add r24,r18
adc r25,r19
st Z+,r24
st Z+,r25
lsr r20
ldi r24,hi8(counters+16)
cpi r30,lo8(counters+16)
cpc r31,r24
brne .L2
ret
/* function cnt size 19 (18) */

Кстати, С для AVR - LOW ENDIAN, младший байт многобайтовых значений хранится по младшему адресу. У тебя в коде наоборот.

Составить ответ | Вернуться на конференцию

Ответы


Отправка ответа
Имя*: 
Пароль: 
E-mail: 
Тема*:

Сообщение:

Ссылка на URL: 
URL изображения: 

если вы незарегистрированный на форуме пользователь, то
для успешного добавления сообщения заполните поле, как указано ниже:
введите число 123:

Перейти к списку ответов | Конференция | Раздел "Электроника" | Главная страница | Карта сайта

Rambler's Top100 Рейтинг@Mail.ru
 
Web telesys.ru