29.10.2009, 00:46
|
|
Временная регистрация
Регистрация: 13.02.2008
Сообщений: 60
Сказал спасибо: 10
Сказали Спасибо 9 раз(а) в 9 сообщении(ях)
|
Re: IAR Embedded Workbench
wer 1 огромное Вам спасибо, это то что нужно.
|
|
|
|
24.02.2010, 20:26
|
|
Временная регистрация
Регистрация: 13.02.2008
Сообщений: 60
Сказал спасибо: 10
Сказали Спасибо 9 раз(а) в 9 сообщении(ях)
|
Re: IAR Embedded Workbench
Добрый вечер, есть такой код:
Код:
|
//указатель на функцию
typedef void(*TFuncPtr)(void);
//таблица адресов функций
TFuncPtr __flash FArray[2] = {&AdrRecFromPC,&AdrCRCRecFromPC}; |
подскажите пожалуйста как правильно создать указатель на таблицу
FArray[2] в виде переменной, и можно ли его создать через #define
для последующей загрузки через команду ldi (для экономии памяти).
|
|
|
|
24.02.2010, 20:59
|
|
Гражданин KAZUS.RU
Регистрация: 04.08.2006
Сообщений: 911
Сказал спасибо: 28
Сказали Спасибо 180 раз(а) в 139 сообщении(ях)
|
Re: IAR Embedded Workbench
![Валяюсь от смеха](images/smilies/icon_biggrin.gif)
Мне нравится этот парень. Указатель на массив указателей на функцию .... для экономии памяти.
И видно, что действительно память экономить придётся. Так как с такими подходами её надо много.
TFuncPtr __flash * PtrPtr;
по видимому.
С define придётся обломаться, так как переменная и константа это несколько разные понятия. Что то типа как человек и его надгробие.
Но не беда можно загрузить с помощью LD, LDD а при передаче ф-ции, mov даже. Всё зависит от того как и в каком контексте.
К сожалению, судя по вопросам, по-моему всё это преждевременно.
|
|
|
|
24.02.2010, 21:56
|
|
Гражданин KAZUS.RU
Регистрация: 08.07.2006
Сообщений: 583
Сказал спасибо: 76
Сказали Спасибо 90 раз(а) в 66 сообщении(ях)
|
Re: IAR Embedded Workbench
Зря смеетесь. Если массив содержит два указателя, то это, конечно, мало чего экономит, а если 10?100? И судя по всему DrunyaRuma не самим подходом экономить решил, а предопределением указателя на этот массив...
Думаю, это можно решить определением этого указателя как константы...
__________________
Sex, Druggs, Rock&Roll
|
|
|
|
24.02.2010, 23:25
|
|
Временная регистрация
Регистрация: 13.02.2008
Сообщений: 60
Сказал спасибо: 10
Сказали Спасибо 9 раз(а) в 9 сообщении(ях)
|
Re: IAR Embedded Workbench
Спасибо, уже додумался ![Улыбка](images/smilies/icon_smile.gif) :
Код:
|
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
|
|
|
25.02.2010, 00:14
|
|
Гражданин KAZUS.RU
Регистрация: 04.08.2006
Сообщений: 911
Сказал спасибо: 28
Сказали Спасибо 180 раз(а) в 139 сообщении(ях)
|
Re: IAR Embedded Workbench
Да можно всё. Просто тяжело понять что именно вы хотите и зачем это надо.
Может быть найдётся более грамотное решение. Вы опишите задачу простыми словами.
Можно сделать и прямое указание адреса, но следует избегать таких вещей. Пусть линкер сам всё размещает. Зачем ему мешать?
2 alberio. А вы не находите, что сделать 10 функций, указатели и переопределение обработки не очень хорошо смотрятся на контроллере.
Конечно, это тоже вариант. Конечно можно сделать. Но в том-то и фишка, что задачу можно решить как правило несколькими способами. И не факт, что переопределение функции будет найболее оптимальным.
Применение таких решений, по-моему, очень ограничено. Мы часто любим сделать "нечто этакое". И иногда это этакое, банально притянуто за уши. (Это не касается данного проекта, так как я не знаю задачи)
|
|
|
|
25.02.2010, 00:16
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.12.2004
Сообщений: 3,172
Сказал спасибо: 11
Сказали Спасибо 692 раз(а) в 504 сообщении(ях)
|
Re: IAR Embedded Workbench
Сообщение от DrunyaRuma
|
Вот хорошая статья :
|
Цитата:
|
Архитектура AVR содержит четыре указателя памяти, которые адресуют память программ и память данных.
|
Там в АВР четыре указателя. Во всех остальных источниках только три - X,Y,Z.
Дальше и читать не стал.
|
|
|
|
25.02.2010, 01:36
|
|
Временная регистрация
Регистрация: 13.02.2008
Сообщений: 60
Сказал спасибо: 10
Сказали Спасибо 9 раз(а) в 9 сообщении(ях)
|
Re: IAR Embedded Workbench
Да вот увидел в сети серию статей :
http://easyelectronics.ru/avr-uchebn....html#more-144
это одна из них, и решил сделать себе диспетчер задач.
Вопрос оптимизации насчет указателя на таблицу я решил - это у
меня локальная переменная,используется только один раз.
Хотелось бы еще узнать:
как можно локальную переменную загружать в определенный регистр;
можно ли все таки объявлять указатели не как переменные, а как константы - в асме было бы очень удобно;
и есть ли для IARa внешний хороший редактор,а то родная IDE IARа
какая-то неудобная, желательно с подстановкой переменных, по
типу как в Delphi.Находил UltraEditStudio но там была только прямая поддержка IAR ARM.
|
|
|
|
25.02.2010, 01:41
|
|
Почётный гражданин KAZUS.RU
Регистрация: 07.10.2007
Адрес: Луганск
Сообщений: 1,816
Сказал спасибо: 13
Сказали Спасибо 399 раз(а) в 214 сообщении(ях)
|
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.
|
|
|
|
25.02.2010, 16:38
|
|
Гражданин KAZUS.RU
Регистрация: 04.08.2006
Сообщений: 911
Сказал спасибо: 28
Сказали Спасибо 180 раз(а) в 139 сообщении(ях)
|
Re: IAR Embedded Workbench
Чтож в этом случае применение указателей на функцию оправданное и классическое решение. С оптимизацией, я вас просто не правильно понял. ![Улыбка](images/smilies/icon_smile.gif)
Обычно, для ОС и диспетчеров задач используют 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
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Тема |
Автор |
Раздел |
Ответов |
Последнее сообщение |
Подниму тему WinAVR vs IAR
|
oleg110592 |
Микроконтроллеры, АЦП, память и т.д |
5 |
24.10.2015 14:06 |
Часовой пояс GMT +4, время: 22:23.
|
|