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

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

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

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

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

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


 
Опции темы

IAR Embedded Workbench

Непрочитано 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.RUN
 
Регистрация: 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.RUN
 
Аватар для alberio
 
Регистрация: 08.07.2006
Сообщений: 582
Сказал спасибо: 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.RUN
 
Регистрация: 04.08.2006
Сообщений: 911
Сказал спасибо: 28
Сказали Спасибо 180 раз(а) в 139 сообщении(ях)
SasaVitebsk на пути к лучшему
По умолчанию Re: IAR Embedded Workbench

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

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

Применение таких решений, по-моему, очень ограничено. Мы часто любим сделать "нечто этакое". И иногда это этакое, банально притянуто за уши. (Это не касается данного проекта, так как я не знаю задачи)
SasaVitebsk вне форума  
Непрочитано 25.02.2010, 00:16  
kison
Почётный гражданин KAZUS.RUN
 
Регистрация: 13.12.2004
Сообщений: 3,168
Сказал спасибо: 11
Сказали Спасибо 691 раз(а) в 503 сообщении(ях)
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.RUN
 
Аватар для picavr
 
Регистрация: 07.10.2007
Адрес: Луганск
Сообщений: 1,815
Сказал спасибо: 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.RUN
 
Регистрация: 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, время: 00:30.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.