Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту


 
Опции темы
Непрочитано 29.10.2009, 00:46  
DrunyaRuma
Временная регистрация
 
Регистрация: 13.02.2008
Сообщений: 60
Сказал спасибо: 10
Сказали Спасибо 9 раз(а) в 9 сообщении(ях)
DrunyaRuma на пути к лучшему
По умолчанию Re: IAR Embedded Workbench

wer 1 огромное Вам спасибо, это то что нужно.
Реклама:
DrunyaRuma вне форума  
Непрочитано 24.02.2010, 20:26  
DrunyaRuma
Временная регистрация
 
Регистрация: 13.02.2008
Сообщений: 60
Сказал спасибо: 10
Сказали Спасибо 9 раз(а) в 9 сообщении(ях)
DrunyaRuma на пути к лучшему
По умолчанию Re: IAR Embedded Workbench

Добрый вечер, есть такой код:
Код:
//указатель на функцию
typedef void(*TFuncPtr)(void);

//таблица адресов функций
TFuncPtr __flash FArray[2] = {&AdrRecFromPC,&AdrCRCRecFromPC};
подскажите пожалуйста как правильно создать указатель на таблицу
FArray[2] в виде переменной, и можно ли его создать через #define
для последующей загрузки через команду ldi (для экономии памяти).
DrunyaRuma вне форума  
Непрочитано 24.02.2010, 20:59  
SasaVitebsk
Гражданин KAZUS.RU
 
Регистрация: 04.08.2006
Сообщений: 911
Сказал спасибо: 28
Сказали Спасибо 180 раз(а) в 139 сообщении(ях)
SasaVitebsk на пути к лучшему
По умолчанию Re: IAR Embedded Workbench


Мне нравится этот парень. Указатель на массив указателей на функцию .... для экономии памяти.

И видно, что действительно память экономить придётся. Так как с такими подходами её надо много.

TFuncPtr __flash * PtrPtr;

по видимому.
С define придётся обломаться, так как переменная и константа это несколько разные понятия. Что то типа как человек и его надгробие.

Но не беда можно загрузить с помощью LD, LDD а при передаче ф-ции, mov даже. Всё зависит от того как и в каком контексте.

К сожалению, судя по вопросам, по-моему всё это преждевременно.
SasaVitebsk вне форума  
Непрочитано 24.02.2010, 21:56  
alberio
Гражданин KAZUS.RU
 
Аватар для alberio
 
Регистрация: 08.07.2006
Сообщений: 583
Сказал спасибо: 76
Сказали Спасибо 90 раз(а) в 66 сообщении(ях)
alberio на пути к лучшему
По умолчанию Re: IAR Embedded Workbench

Зря смеетесь. Если массив содержит два указателя, то это, конечно, мало чего экономит, а если 10?100? И судя по всему DrunyaRuma не самим подходом экономить решил, а предопределением указателя на этот массив...
Думаю, это можно решить определением этого указателя как константы...
__________________
Sex, Druggs, Rock&Roll
alberio вне форума  
Непрочитано 24.02.2010, 23:25  
DrunyaRuma
Временная регистрация
 
Регистрация: 13.02.2008
Сообщений: 60
Сказал спасибо: 10
Сказали Спасибо 9 раз(а) в 9 сообщении(ях)
DrunyaRuma на пути к лучшему
По умолчанию Re: IAR Embedded Workbench

Спасибо, уже додумался :
Код:
typedef void(*TFuncPtr)(void);
__flash TFuncPtr FArray[2] = {&AdrRecFromPC,&AdrCRCRecFromPC};
TFuncPtr __flash *xx = &FArray[0];
Жаль что нельзя через #define как нибудь сделать, ведь таблица статическая,но и так хорошо;Пытался указывать через #define просто
адрес,так компилятор выбрасывал все мои функции,даже с выключеной
оптимизацией.
Вот хорошая статья :
http://www.gaw.ru/html.cgi/txt/app/m...avr/AVR035.htm
DrunyaRuma вне форума  
Сказали "Спасибо" DrunyaRuma
peter123_123 (26.02.2010)
Непрочитано 25.02.2010, 00:14  
SasaVitebsk
Гражданин KAZUS.RU
 
Регистрация: 04.08.2006
Сообщений: 911
Сказал спасибо: 28
Сказали Спасибо 180 раз(а) в 139 сообщении(ях)
SasaVitebsk на пути к лучшему
По умолчанию Re: IAR Embedded Workbench

Да можно всё. Просто тяжело понять что именно вы хотите и зачем это надо.
Может быть найдётся более грамотное решение. Вы опишите задачу простыми словами.
Можно сделать и прямое указание адреса, но следует избегать таких вещей. Пусть линкер сам всё размещает. Зачем ему мешать?

2 alberio. А вы не находите, что сделать 10 функций, указатели и переопределение обработки не очень хорошо смотрятся на контроллере.
Конечно, это тоже вариант. Конечно можно сделать. Но в том-то и фишка, что задачу можно решить как правило несколькими способами. И не факт, что переопределение функции будет найболее оптимальным.

Применение таких решений, по-моему, очень ограничено. Мы часто любим сделать "нечто этакое". И иногда это этакое, банально притянуто за уши. (Это не касается данного проекта, так как я не знаю задачи)
SasaVitebsk вне форума  
Непрочитано 25.02.2010, 00:16  
kison
Почётный гражданин KAZUS.RU
 
Регистрация: 13.12.2004
Сообщений: 3,172
Сказал спасибо: 11
Сказали Спасибо 692 раз(а) в 504 сообщении(ях)
kison на пути к лучшему
По умолчанию Re: IAR Embedded Workbench

Сообщение от DrunyaRuma Посмотреть сообщение
Вот хорошая статья :
Цитата:
Архитектура AVR содержит четыре указателя памяти, которые адресуют память программ и память данных.
Там в АВР четыре указателя. Во всех остальных источниках только три - X,Y,Z.
Дальше и читать не стал.
kison вне форума  
Непрочитано 25.02.2010, 01:36  
DrunyaRuma
Временная регистрация
 
Регистрация: 13.02.2008
Сообщений: 60
Сказал спасибо: 10
Сказали Спасибо 9 раз(а) в 9 сообщении(ях)
DrunyaRuma на пути к лучшему
По умолчанию Re: IAR Embedded Workbench

Да вот увидел в сети серию статей :
http://easyelectronics.ru/avr-uchebn....html#more-144
это одна из них, и решил сделать себе диспетчер задач.
Вопрос оптимизации насчет указателя на таблицу я решил - это у
меня локальная переменная,используется только один раз.
Хотелось бы еще узнать:
как можно локальную переменную загружать в определенный регистр;
можно ли все таки объявлять указатели не как переменные, а как константы - в асме было бы очень удобно;
и есть ли для IARa внешний хороший редактор,а то родная IDE IARа
какая-то неудобная, желательно с подстановкой переменных, по
типу как в Delphi.Находил UltraEditStudio но там была только прямая поддержка IAR ARM.
DrunyaRuma вне форума  
Непрочитано 25.02.2010, 01:41  
picavr
Почётный гражданин KAZUS.RU
 
Аватар для picavr
 
Регистрация: 07.10.2007
Адрес: Луганск
Сообщений: 1,816
Сказал спасибо: 13
Сказали Спасибо 399 раз(а) в 214 сообщении(ях)
picavr на пути к лучшему
По умолчанию Re: IAR Embedded Workbench

Сообщение от DrunyaRuma Посмотреть сообщение
и есть ли для IARa внешний хороший редактор,а то родная IDE IARа какая-то неудобная, желательно с подстановкой переменных, по типу как в Delphi.Находил UltraEditStudio но там была только прямая поддержка IAR ARM.
К IAR моно прикрутить ЛЮБОЙ редактор, в IAR AVR (options\editor\external editor) задаётся вызов внешнего редактора, указывается путь и параметры вызова. Думаю что в IAR ARM должно быть аналогично..... С подсветкой и автоподстановкой (и много других примочек) хвалят SlikEdit.

Последний раз редактировалось picavr; 25.02.2010 в 01:52.
picavr вне форума  
Сказали "Спасибо" picavr
DrunyaRuma (25.02.2010)
Непрочитано 25.02.2010, 16:38  
SasaVitebsk
Гражданин KAZUS.RU
 
Регистрация: 04.08.2006
Сообщений: 911
Сказал спасибо: 28
Сказали Спасибо 180 раз(а) в 139 сообщении(ях)
SasaVitebsk на пути к лучшему
По умолчанию Re: IAR Embedded Workbench

Сообщение от DrunyaRuma Посмотреть сообщение
Да вот увидел в сети серию статей :
http://easyelectronics.ru/avr-uchebn....html#more-144
это одна из них, и решил сделать себе диспетчер задач.
Чтож в этом случае применение указателей на функцию оправданное и классическое решение. С оптимизацией, я вас просто не правильно понял.
Обычно, для ОС и диспетчеров задач используют C++. ОС для AVR достаточно много готовых. В том числе, работающих даже на tiny. Есть малоресурсные карусельного типа.
Естественно, это не значит, что вам не стоит писать свою. Существует 3000 причин чтобы вам это сделать. Я один раз делал даже на ASM.
Цитата:
Хотелось бы еще узнать:
как можно локальную переменную загружать в определенный регистр;
можно ли все таки объявлять указатели не как переменные, а как константы - в асме было бы очень удобно;
и есть ли для IARa внешний хороший редактор,а то родная IDE IARа
какая-то неудобная, желательно с подстановкой переменных, по
типу как в Delphi.Находил UltraEditStudio но там была только прямая поддержка IAR ARM.
В асме удобно и так и так. Нет никаких проблем.
Начнём с простого.
1) Надо понимать, что ваша ASM прога ассемблируется отдельно и подключается на этапе линковки. Поэтому все имена должны быть определены и/или объявлены.
2) Существует одно (на мой взгляд) правильное решение, как подключать асм вставки. Это подключение в виде законченных модулей - процедур. Говорят, что на GCC компилятор хорошо разбирается с асм вставками и прекрассно всё это оптимизирует. Возможно. Но я бы всё равно не стал бы этого делать. На мой взгляд, это не "красиво".
3) Очень чётко описано взаимодействие ASM модулей и C. В частности передача параметров и использование регистров. Есть возможность выделения дополнительных регистров под свои нужды. Это тоже всё узаконено. Есть возможность создания своих библиотек.
Я вот, сейчас планирую фильтрацию цифровую написать.
4) При использовании ASM модуля в виде п/п предлагаю написать сначала С вариант, а потом заменить его на ASM. Очень удобно в плане проверки.

Пример:
Код:
__regvar  __no_init uint8_t		crc @10;

extern void crc8(uint8_t data);

/*
//Вычисляет	CRC8
void	crc8(uint8_t inData)
{
  uint8_t	bitsLeft;
  uint8_t	temp;

  for(bitsLeft=8; bitsLeft›0; bitsLeft--)
  {
	temp = ((crc ^	inData)	& 0x01);
	if(temp ==	0) crc ››= 1;
	else
	{
	  crc ^=	0x18;
	  crc ››= 1;
	  crc |=	0x80;
	}
	inData ››= 1;
  }
}
*/
ASM
Код:
PUBLIC	crc8

#define		crc				r10
#define		data485			r16

		RSEG  CODE

// Расчёт CRC
// r10 - crc485, 16 - data, портятся r17,r18,r19
crc8:
		ldi		r17,8
//		mov		r12,data485
		ldi		r18,0x18
cCRC8:
		mov		r19,crc
		eor		r19,data485
		lsr		r19											// Сдвинули бит в С
		brcc	nCRC8
		eor		crc,r18
nCRC8:
		ror		crc
		lsr		data485
		dec		r17
		brne	cCRC8
		ret
Для загрузки переменной какой-то в регистр, например - всё очень просто.
Давайте для усложнения возьмём структуру.

Код:
struct
{
 uint8_t	OutBuf[32];									// 0
 uint8_t	*HeadOutBuf,*EndOutBuf;						// +32 +34
}  volatile Out485;
На асм
Код:
EXTERN	Out485

#define		HeadOutBuf		32							// +32
#define		EndOutBuf		34							// +34

...
		ldi		ZL,low(Out485)
		ldi		ZH,high(Out485) // Загрузка указателя на начало структуры. Фактически указатель указывает на 0 байт массива OutBuf.
		ldd		XL,Z+EndInBuf							// EndInBuf
		ldd		XH,Z+EndInBuf+1
// Загрузка EndInBuf в регистровую пару X. Для примера.
....
		lds		ZL,Out485+EndOutBuf // загрузка указателя EndOutBuf в регистровую пару Z. В виде примера.
		lds		ZH,Out485+EndOutBuf
...
Если какие вопросы - пиши.
SasaVitebsk вне форума  
Сказали "Спасибо" SasaVitebsk
DrunyaRuma (25.02.2010)
 

Закладки
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Подниму тему WinAVR vs IAR oleg110592 Микроконтроллеры, АЦП, память и т.д 5 24.10.2015 14:06


Часовой пояс GMT +4, время: 22:23.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot