Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.05.2011, 20:04   #1
mrhowl22
 
Регистрация: 25.05.2011
Сообщений: 6
По умолчанию Ассемблерная вставка WinAVR

В некой программе (под Atmega 16) объявляются массивы-константы в памяти программ, а за тем объявляется массив констант-указателей на эти массивы.

Код:
const uint8_t sinewave[] __attribute__ ((section (".MySection1")))=    //и таких много

const uint8_t *SIGNALS[] ={                                  //массив указателей
	sinewave,
	squarewave,
	trianglewave,
	sawtoothwave,
	rewsawtoothwave,
	ECG
};

В программе создана функция, управляющая выводом массивов на порт с определенной частотой. Функция с ассемблерной вставкой.



Код:
void static inline Signal_OUT(const uint8_t *signal, uint8_t ad2, uint8_t ad1, uint8_t ad0)        // где ad2? ad1 и ad0 определяют приращение аккумулятора (отвечают за чатоту). 
{
	asm volatile(	"eor r18, r18 	;r18<-0"	"\n\t"             //обнуление
				"eor r19, r19 	;r19<-0"	"\n\t"          //обнуление
				"1:"						"\n\t"      //метка
				"add r18, %0	;1 cycle"			"\n\t"            
				"adc r19, %1	;1 cycle"			"\n\t"	
				"adc %A3, %2	;1 cycle"			"\n\t"
				"lpm 			;3 cycles" 	"\n\t"                   //функция кладет содержимое памяти программ, адресованное регистром Z (ZH:ZL <=> ) в R0.           (как я понимаю, по адресу Z находится содержимое указателя на массив, т.к. ограничитель "е" привязывает signal к адресному ригистру)
				"out %4, __tmp_reg__	;1 cycle"	"\n\t"          из ригистра R0 данные выгружаются в порт
				"sbis %5, 2		;1 cycle if no skip" "\n\t"                //проверка условия выходи из цикла
				"rjmp 1b		;2 cycles. Total 10 cycles"	"\n\t"      //преход по метке. (или выход, если строка пропущена).
				:
				:"r" (ad0),"r" (ad1),"r" (ad2),"e" (signal),"I" (_SFR_IO_ADDR(PORTA)), "I" (_SFR_IO_ADDR(SPCR))                    наложение ограничителей и объявление ништяков в ассемблерной вставке. 
				:"r18", "r19" 
			
	); 
}

Собственно, теперь вопрос. Данная функция работает только с памятью программ. Но, допустим, у нас есть массив переменных.


uint8_t sig[] = { }; //объявим в начале массив. Ну, и заполним его 255 значений. Писать их не буду,ибо много букаф.


const uint8_t *Red[]={sig}; //объявим массив констант-указателей из одного элемента (указатель на тот самый массив переменных). (Аналогично было сделано в оригинале, но массив состоял из семи указателей)

И теперь пишем аналогичную программу, с единственным отличием.
Код:
void static inline Signal_OUT2(const uint8_t *ReD, uint8_t aD2, uint8_t aD1, uint8_t aD0)
{
asm volatile( "eor r18, r18 ;r18<-0" "\n\t"
"eor r19, r19 ;r19<-0" "\n\t"
"2:" "\n\t"
"add r18, %0 ;1 cycle" "\n\t"
"adc r19, %1 ;1 cycle" "\n\t" 
"adc %A3, %2 ;1 cycle" "\n\t"
"ld R0, z ;3 cycles" "\n\t" // Загрузка в R0 происходит из регистра z (ну, я, по крайней мере, на это надеюсь). Перед ReD стоит ограничитель "е", указывающий на адресный регистр. могу предположить, что подразумевается, что в R0 загружается переменная из массива, на который указывает *ReD. Наверно. плохо понимаю, как это работает. 
"out %4, __tmp_reg__ ;1 cycle" "\n\t"
"sbis %5, 2 ;1 cycle if no skip" "\n\t"
"rjmp 2b ;2 cycles. Total 10 cycles" "\n\t"
:
:"r" (aD0),"r" (aD1),"r" (aD2),"z" (ReD),"I" (_SFR_IO_ADDR(PORTA)), "I" (_SFR_IO_ADDR(SPCR))
:"r18", "r19" 
);
}
И... Ничего не работает. Вернее, работает, но не корректо. Выгружает последовательность явно не оттуда, откуда нужно. Как правильно реализовать в данном случае доступ к памяти данных? Я в ассемблере слабоват. Не особо его учил. А тут внезапно понадобилось. Буду признателен за подсказки.

Последний раз редактировалось mrhowl22; 25.05.2011 в 20:36.
mrhowl22 вне форума Ответить с цитированием
Старый 26.05.2011, 12:10   #2
mrhowl22
 
Регистрация: 25.05.2011
Сообщений: 6
По умолчанию

Серия опытов показала, что подобным образом часть сигнала воспроизводится верно, а часть нарушена. Видимо, какой-то косяк с адресацией.
mrhowl22 вне форума Ответить с цитированием
Старый 26.05.2011, 22:20   #3
mrhowl22
 
Регистрация: 25.05.2011
Сообщений: 6
По умолчанию

И тишина. И девять тысяч программистов ни могут ничего сказать. Хотя, я вас понимаю. Может, кто подскажет - если UART принимает вместо адекватных значений 0 или 128, в чем может быть дело? Сразу скажу, в железе и на эмуляторе - одна фигня. Пишу в WinAVR.
mrhowl22 вне форума Ответить с цитированием
Старый 27.05.2011, 11:44   #4
mrhowl22
 
Регистрация: 25.05.2011
Сообщений: 6
По умолчанию

UART настроил. Вижу, тупым студентам тут не помогают.
mrhowl22 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ассемблерная вставка Serg12 Помощь студентам 5 04.05.2017 19:43
Ассемблерная вставка на Си faop Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 11.03.2011 11:03
Ассемблерная вставка _-Re@l-_ Паскаль, Turbo Pascal, PascalABC.NET 5 18.09.2010 14:31
Ассемблерная вставка! treki Помощь студентам 0 16.06.2010 00:15
Ассемблерная вставка Arigato Общие вопросы Delphi 1 25.10.2009 21:47