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

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

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

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

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

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


 
Опции темы
Непрочитано 26.02.2010, 18:12  
picavr
Почётный гражданин KAZUS.RU
 
Аватар для picavr
 
Регистрация: 07.10.2007
Адрес: Луганск
Сообщений: 1,816
Сказал спасибо: 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.RU
 
Регистрация: 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.RU
 
Регистрация: 13.12.2004
Сообщений: 3,172
Сказал спасибо: 11
Сказали Спасибо 692 раз(а) в 504 сообщении(ях)
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.RU
 
Регистрация: 13.12.2004
Сообщений: 3,172
Сказал спасибо: 11
Сказали Спасибо 692 раз(а) в 504 сообщении(ях)
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.RU
 
Аватар для urry
 
Регистрация: 06.02.2007
Сообщений: 1,340
Сказал спасибо: 3
Сказали Спасибо 106 раз(а) в 66 сообщении(ях)
urry на пути к лучшему
По умолчанию Re: IAR Embedded Workbench

вы ничего не расскажете о себе ? Какое время занимаетесь с си, что планируете...
А то читаю Ваши сообщения.. Даж не знаю, что сказать..Все больше маты..., если честно..
__________________
warez
urry вне форума  
Непрочитано 26.02.2010, 20:32  
kison
Почётный гражданин KAZUS.RU
 
Регистрация: 13.12.2004
Сообщений: 3,172
Сказал спасибо: 11
Сказали Спасибо 692 раз(а) в 504 сообщении(ях)
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.RU
 
Аватар для picavr
 
Регистрация: 07.10.2007
Адрес: Луганск
Сообщений: 1,816
Сказал спасибо: 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, время: 22:36.


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