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

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

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

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

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

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


 
Опции темы

IAR Embedded Workbench

Непрочитано 26.02.2010, 18:12  
picavr
Почётный гражданин KAZUS.RUN
 
Аватар для picavr
 
Регистрация: 07.10.2007
Адрес: Луганск
Сообщений: 1,815
Сказал спасибо: 13
Сказали Спасибо 399 раз(а) в 214 сообщении(ях)
picavr на пути к лучшему
По умолчанию Re: IAR Embedded Workbench

Сообщение от DrunyaRuma Посмотреть сообщение
3)как же все таки в Си коде сделать так,чтобы локальная переменная загрузилась в нужный мне регистр,например в область локальных регистров r4-r15,r24-r27.Чтобы я потом вставляя ассемблерные вставки
не гадал куда он захочет в этот раз ее записать.
IAR позволяет из функции написаной на АСМ обращатся к переменной по имени, т е грузить её в ЛЮБЫЕ РЕГИСТРЫ внутри самой функции. А так же ЛЮБЫЕ РЕГИСТРЫ выгружать назад в переменные.
Перед действиями с регистрами, сохраняем их в стек данных а после оттуда же восстанваливаем, это всё внутри АСМ функции.

Таким образом можно прерывание или любую функцию написать на АСМе и подключить в проект... так же моно вызывать функцию АСМа с параметрами и получать из неё параметр. Или из ASMа вызвать функцию СИ.
Пример из того документа. грузим в R17 переменную max_val и выгружаем
назад и вызываем функцию RAND();
Код:
//Calling C Functions from Assembly Code
NAME get_port 
    #include "io8515.h"     ; The #include file must be within the module
    EXTERN rand, max_val    ; External symbols used in the function
    PUBLIC get_port         ; Symbols to be exported to C function
    RSEG CODE               ; This code is relocatable, RSEG
get_port:                   ; Label, start execution here
    clr     R16             ; Clear R16
    sbis    PIND,0          ; Test if PIND0 is 0
    rcall   rand            ; Call RAND() if PIND0 = 0
    out     PORTB,R16       ; Output random value to PORTB 
    lds     R17,max_val     ; Load the global variable max_val
    cp      R17,R16         ; Check if number higher than max_val
    brlt    nostore         ; Skip if not
    sts     max_val,R16     ; Store the new number if it is higher
nostore:
    ret                     ; Return
Сообщение от DrunyaRuma Посмотреть сообщение
4)Чисто теоретический вопрос.Как я понял судя из документа AVR034: Mixing C and Assembly Code with IAR Embedded Workbench for AVR (весь винт перерыл,забыл что это аппнот)в подпрограммах в область локальных регистров (r4-r15,r24-r27) напрямую обращаться нельзя,исходя из этого получается что выполнять диспетчер задач как подпрограмму будет не корректно в плане того, что вызываемая задача будет вложенной подпрограммой для логики IARa,что может повлечь за собой плохую оптимизацию.Так ли это?
Если вы выносите АСМ функции в отдельный файл (файл типа asm, смотреть в том файле), то это не мешает IAR при оптимизации Си кода. А если пишете прямо среди кода СИ АСМ вставки...
тогда мешает...

Сообщение от DrunyaRuma Посмотреть сообщение
Но основная задача изучить тонкости IARa,и кодирования C+Asm,для написания более оптимального кода,этот проект больше как тренинг инженерной мысли,чем как чтот-то серьезное.
Сам недавно начал пытатся писать на Си... после нескольких мелких проектов понял, что принципиально можно обойтись и без АСМа, нужно только УМЕТЬ обьяснить компилятору что вы хотите. Обычно после компиляции нескольких вариантов записи на СИ находится вариант который при компиляции даёт такой код как я бы написал на АСМе. Это уже дело опыта.. придёт со временем..
Так что АСМ вставки я применяю только если давно написано на АСМ и отлажено,
дабы не лопатить в СИ. А новое на СИ.
Реклама:

Последний раз редактировалось picavr; 26.02.2010 в 18:34.
picavr вне форума  
Непрочитано 26.02.2010, 19:21  
SasaVitebsk
Гражданин KAZUS.RUN
 
Регистрация: 04.08.2006
Сообщений: 911
Сказал спасибо: 28
Сказали Спасибо 180 раз(а) в 139 сообщении(ях)
SasaVitebsk на пути к лучшему
По умолчанию Re: IAR Embedded Workbench

2 DrunyaRuma.
Кстати ещё забыл упомянуть. Есть такая ф-ция
__enable_interrupt(); Это к вашему sei.
Покурите всётаки описание на компилятор. Ну реально всё крассивее выглядеть будет. А то так ассемблерщиком и помрёте.

Сообщение от peter123_123 Посмотреть сообщение
Имеется вот такой код
d-›sens.gas = GET_GAS_VALVE_STATE();
Прочитал,что знак "-›" это структурный указатель что это значит? Писал проги на ВASICe .Хотел бы разобраться
d - это скорее всего указатель на структуру, в которую входит структура sens.gas. Вы бы привели объявление переменной d и объявление той структуры на которую он указывает. Тогда легче было бы объяснить.

Фактически - это заполнение поля gas, по указателю, указывающему на начало структуры.
SasaVitebsk вне форума  
Непрочитано 26.02.2010, 19:27  
kison
Почётный гражданин KAZUS.RUN
 
Регистрация: 13.12.2004
Сообщений: 3,168
Сказал спасибо: 11
Сказали Спасибо 691 раз(а) в 503 сообщении(ях)
kison на пути к лучшему
По умолчанию Re: IAR Embedded Workbench

Сообщение от SasaVitebsk Посмотреть сообщение
d - это скорее всего указатель на структуру, в которую входит структура sens.gas. Вы бы привели объявление переменной d и объявление той структуры на которую он указывает. Тогда легче было бы объяснить.

Фактически - это заполнение поля gas, по указателю, указывающему на начало структуры.
Это не "скорее всего", это однозначно указатель. На структуру, членом которой является также структура sens. В которой в свою очередь есть член или битовое поле gas. Вот такая матрешка выходит.
ЗЫ DrunyaRuma, SECU3 разбираете?
kison вне форума  
Непрочитано 26.02.2010, 20:04  
DrunyaRuma
Временная регистрация
 
Регистрация: 13.02.2008
Сообщений: 60
Сказал спасибо: 10
Сказали Спасибо 9 раз(а) в 9 сообщении(ях)
DrunyaRuma на пути к лучшему
По умолчанию Re: IAR Embedded Workbench

to picavr Виноват не дочитал.

Последний раз редактировалось DrunyaRuma; 26.02.2010 в 21:01.
DrunyaRuma вне форума  
Непрочитано 26.02.2010, 20:21  
kison
Почётный гражданин KAZUS.RUN
 
Регистрация: 13.12.2004
Сообщений: 3,168
Сказал спасибо: 11
Сказали Спасибо 691 раз(а) в 503 сообщении(ях)
kison на пути к лучшему
По умолчанию Re: IAR Embedded Workbench

Сообщение от DrunyaRuma Посмотреть сообщение
d-›sens.gas = GET_GAS_VALVE_STATE();
означает следуещее - члену "sens.gas" структкры d присваивается результат выполнения функции
Только d все же не структура, а всего лишь указатель на структуры такого типа.
И это не старый стиль, а действующий на сегодня стандарт языка.
Сообщение от DrunyaRuma Посмотреть сообщение
Структуры можно также
использовать как массивы.
Это заблуждение. У них ничего общего нет.
kison вне форума  
Непрочитано 26.02.2010, 20:21  
DrunyaRuma
Временная регистрация
 
Регистрация: 13.02.2008
Сообщений: 60
Сказал спасибо: 10
Сказали Спасибо 9 раз(а) в 9 сообщении(ях)
DrunyaRuma на пути к лучшему
По умолчанию Re: IAR Embedded Workbench

Сообщение от kison Посмотреть сообщение
ЗЫ DrunyaRuma, SECU3 разбираете?
Учитывая, что я не понял даже вопроса, то вероятно что нет.
DrunyaRuma вне форума  
Непрочитано 26.02.2010, 20:27  
urry
Почётный гражданин KAZUS.RUN
 
Аватар для urry
 
Регистрация: 06.02.2007
Сообщений: 1,340
Сказал спасибо: 3
Сказали Спасибо 107 раз(а) в 66 сообщении(ях)
urry на пути к лучшему
По умолчанию Re: IAR Embedded Workbench

вы ничего не расскажете о себе ? Какое время занимаетесь с си, что планируете...
А то читаю Ваши сообщения.. Даж не знаю, что сказать..Все больше маты..., если честно..
__________________
warez
urry вне форума  
Непрочитано 26.02.2010, 20:32  
kison
Почётный гражданин KAZUS.RUN
 
Регистрация: 13.12.2004
Сообщений: 3,168
Сказал спасибо: 11
Сказали Спасибо 691 раз(а) в 503 сообщении(ях)
kison на пути к лучшему
По умолчанию Re: IAR Embedded Workbench

Сообщение от DrunyaRuma Посмотреть сообщение
Учитывая, что я не понял даже вопроса, то вероятно что нет.
Учитывая что d-›sens.gas = GET_GAS_VALVE_STATE(); это часть исходника SECU-3
http://secu-3.narod.ru/
Откуда пример то взяли?
kison вне форума  
Непрочитано 26.02.2010, 21:00  
picavr
Почётный гражданин KAZUS.RUN
 
Аватар для picavr
 
Регистрация: 07.10.2007
Адрес: Луганск
Сообщений: 1,815
Сказал спасибо: 13
Сказали Спасибо 399 раз(а) в 214 сообщении(ях)
picavr на пути к лучшему
По умолчанию Re: IAR Embedded Workbench

Сообщение от DrunyaRuma Посмотреть сообщение
компилятор для передачи параметров использует регистры r16-r23,а все что не уместилось передается через стек
Именно так, если переменных много, то не уместившиеся R16-23 передаются через стек данных.
Только я не понимаю ЗАЧЕМ привязывать переменные к определённым регистрам?
Обьявим переменные
Код:
unsigned char variable1,variable2,variable3,variable4,variable5,  variable6,variable7,variable8,variable9,variable10  ,variable11,variable12,variable13;
variable2=20
variable3=30
variable4=40
variable5=50
variable6=60
variable7=70
variable8=80
variable9=90
Вы в АСМе загрузите значения из переменных в НУЖНЫЕ ВАМ регистры и будете с ними работать.
Код:
lds R1,variable1
lds R2,variable2
lds R3,variable3
lds R4,variable4
lds R5,variable5
lds R6,variable6
lds R7,variable7
lds R8,variable8
lds R16,variable9
lds R17,variable10
lds R18,variable11
lds R19,variable12
lds R20,variable13
//далее работаете в регистрах. Потом при необходимости выгружаете в пременные.
sts variable12,R19
sts variable13,R20
в файле ‹intrinsics.h› определены:
__delay_cycles(unsigned long); // Задержка в тактах. Аргумент только константа
__insert_opcode(); //вставтить код коанды
__no_operation(); //ассемблерный NOP
__swap_nibbles(unsigned char); //обмен тетрад
__watchdog_reset(); // сброс watchdog
__indirect_jump_to(unsigned long); //косвеный переход
__enable_interrupt(); // разрешить глобальное прерывание
__disable_interrupt(); // запретить глобальное прерывание
unsigned char __save_interrupt(void); //сохранить состояние глобальное прерывание
__restore_interrupt(unsigned char); //востановить глобальное прерывание
__sleep(); //спящий режим
unsigned int __multiply_unsigned(unsigned char, unsigned char);
signed int __multiply_signed(signed char, signed char);
signed int __multiply_signed_with_unsigned(signed char, unsigned char);
unsigned int __fractional_multiply_unsigned(unsigned char, unsigned char);
signed int __fractional_multiply_signed(signed char, signed char);
signed int __fractional_multiply_signed_with_unsigned(signed char, signed char);
__flash unsigned dimenshion[16] @0x00 = {0,1,2,3}; //обьявление масива в FLASH с адреса и инициализацией
__load_program_memory(const unsigned char __flash *); //
_SPM_PAGEWRITE(Addr); //запись FLASH страницы
_SPM_GET_LOCKBITS(); //чтение LOCKBITS
_SPM_GET_FUSEBITS(); //чтение FUSEBITS
__eeprom unsigned dimenshion[16] @0x00 = {0,1,2,3}; //обьявление масива в EPROM с адреса и инициализацией
__EEPUT(ADR,VAL); //запись EEPROM
__EEGET(VAR,ADR); //чтение EEPROM

//макросы для задержек, точная задержка при целом значении задающей частоты генератора в МГц (1, 2, 3, 4, ..., 10,

#define delay_us(temp)(__delay_cycles((temp * fclc)/1000000));/* макрос задержки на "temp" микросекунд
#define delay_ms(temp)(__delay_cycles((temp * fclc)/1000));/* макрос задержки на "temp" миллисекунд
#define delay_s(temp)(__delay_cycles(temp * fclc));/* макрос задержки на "temp" секунд

Последний раз редактировалось picavr; 26.02.2010 в 21:10.
picavr вне форума  
Сказали "Спасибо" picavr
DrunyaRuma (26.02.2010)
Непрочитано 26.02.2010, 21:21  
DrunyaRuma
Временная регистрация
 
Регистрация: 13.02.2008
Сообщений: 60
Сказал спасибо: 10
Сказали Спасибо 9 раз(а) в 9 сообщении(ях)
DrunyaRuma на пути к лучшему
По умолчанию Re: IAR Embedded Workbench

Сообщение от kison Посмотреть сообщение
Учитывая что d-›sens.gas = GET_GAS_VALVE_STATE(); это часть исходника SECU-3
http://secu-3.narod.ru/
Откуда пример то взяли?
Вопрос о структуре задавал не я, а peter123_123.

Сообщение от urry Посмотреть сообщение
вы ничего не расскажете о себе ? Какое время занимаетесь с си, что планируете...
А то читаю Ваши сообщения.. Даж не знаю, что сказать..Все больше маты..., если честно..
Виноват,торможу. Буду вначале думать,а потом писать, и задавать меньше глупых вопросов. Извините.

Последний раз редактировалось DrunyaRuma; 27.02.2010 в 01:37.
DrunyaRuma вне форума  
 
Опции темы

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

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

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

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


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


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