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

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

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

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

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

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

Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей...

 
Опции темы
Непрочитано 22.04.2006, 00:00  
graham
Прописка
 
Регистрация: 11.01.2005
Сообщений: 196
Сказал спасибо: 0
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
graham на пути к лучшему
По умолчанию

Сообщение от dosikus
Угу типа того , без обид.
Сам такой был.
Да ну я не обижаюсь, просто уточнил ) правильно ли я понял Вашу мысль. Вообще про барьер согласен + привычка к асму и тотальному контролю действий. Но этот барьер надо разрушить, чем и занимаюсь. А от контроля отказываеться не хочу, поэтому пытаюсь понять как и что там на С делается.
Реклама:
graham вне форума  
Непрочитано 22.04.2006, 00:33  
NemoCut32
Гражданин KAZUS.RU
 
Регистрация: 16.12.2004
Сообщений: 587
Сказал спасибо: 13
Сказали Спасибо 23 раз(а) в 9 сообщении(ях)
NemoCut32 на пути к лучшему
По умолчанию

Кстати по поводу "глупости", может я ошибаюсь но смотрите:

+0000000F: RCALL PC+0x0004
+00000010: RCALL PC-0x000F
+00000011: RCALL PC-0x000B
+00000012: RJMP PC-0x000C
+00000013: LDI R16,0x01


1) +0000000F: RCALL PC+0x0004 - вызывает далее следующий код за сим участком;
2)+00000010: RCALL PC-0x000F - вызывает ПП с адреса 000001 SER R16 и т.д. - похоже это обработка Exeption
3)+00000011: RCALL PC-0x000B вызывает:
+00000006: NOP
+00000007: SLEEP
+00000008: RJMP PC-0x0001 - это цикл завершения main() - если из него выйти
Конечно я могу ошибаться - в UM лезть влом.
NemoCut32 вне форума  
Непрочитано 22.04.2006, 08:19  
graham
Прописка
 
Регистрация: 11.01.2005
Сообщений: 196
Сказал спасибо: 0
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
graham на пути к лучшему
По умолчанию

Сообщение от NemoCut32
Кстати по поводу "глупости", может я ошибаюсь но смотрите:

+0000000F: RCALL PC+0x0004
+00000010: RCALL PC-0x000F
+00000011: RCALL PC-0x000B
+00000012: RJMP PC-0x000C
+00000013: LDI R16,0x01

1) +0000000F: RCALL PC+0x0004 - вызывает далее следующий код за сим участком;
2)+00000010: RCALL PC-0x000F - вызывает ПП с адреса 000001 SER R16 и т.д. - похоже это обработка Exeption
3)+00000011: RCALL PC-0x000B вызывает:
+00000006: NOP
+00000007: SLEEP
+00000008: RJMP PC-0x0001 - это цикл завершения main() - если из него выйти
Конечно я могу ошибаться - в UM лезть влом.
Наверное я зря не выложил сразу код на С, что затруднило понимание полученного на АСМе.

Код:
#include ‹ioavr.h›

void main(void) 
{ 
    PORTD=0xFF;
    DDRD=0xF0;
  while(1){}
}

Вот если смотреть с самого начала:
по прерыванию RESET выполняется
Код:
+00000000: RJMP    PC+0x0009,
где начинается инициализация стека и установка Y в 0. Потом проиходит
+0000000F: RCALL PC+0x0004, которое вызывает
Код:
+00000013: LDI     R16,0x01
+00000014: RET     ; упустил его в первом посте кода
Т.е. после инициализации стека и Y, идет переход на
Код:
+00000013: LDI     R16,0x01 ,
а в программе я этого не писал. После этого попадаем в
Код:
+00000010: RCALL   PC-0x000F
что перекидывает в начало main. Оно выполнится и останется МК в
Код:
+00000005: RJMP    PC-0x0000
Т.е. получается что строки
Код:
+00000011: RCALL   PC-0x000B 
+00000012: RJMP    PC-0x000C
Код:
+00000006: NOP 
+00000007: SLEEP 
+00000008: RJMP    PC-0x0001
Никогда не дождутся своего исполнения.

А вот если бы откомпилированное выглядело следующим образом:
Вектор прерывания по RESET
Код:
+00000000: RJMP    PC+0x0001 ;переход в main
Инициализация стека и Y
Код:
	
+00000001: LDI     R16,0x9F ;	
+00000002: OUT     0x3D,R16 ;SPL=0x9F
+00000003: LDI     R16,0x00 ;
+00000004: OUT     0x3E,R16 ;SPH=0x00
+00000005: LDI     R28,0x80 ;YL=0x00
+00000006: LDI     R29,0x00 ;YH=0x00
+00000007: LDI     R16,0x01 ;если оно для чего-то нужно
main
Код:
+00000008: SER     R16      ;
+00000009: OUT     0x12,R16 ;PORTD=0xFF
+0000000A: LDI     R16,0xF0 ;
+0000000B: OUT     0x11,R16 ;DDRD=0xF0
+0000000C: RJMP    PC-0x0000 ;while(1){}
Тогда бы у меня не возникло вопросов Может разве что о смысле строки
Код:
+00000007: LDI     R16,0x01
graham вне форума  
Непрочитано 22.04.2006, 10:12  
NemoCut32
Гражданин KAZUS.RU
 
Регистрация: 16.12.2004
Сообщений: 587
Сказал спасибо: 13
Сказали Спасибо 23 раз(а) в 9 сообщении(ях)
NemoCut32 на пути к лучшему
По умолчанию

Тогда более менее понятно:
1) 00000001 - 00000005 : while(1) {}
2) 0x000009 - 0x00000E : инициализация стеков
3) 0x000006 - 0x000008 : ловушка выхода из main() {}
4) +00000013: LDI R16,0x01 : передача параметра main() (в IAR почему то int main(int), а не void main(void) как положено)
5) +00000010: RCALL PC-0x000F : вызов main()
6) +00000011: RCALL PC-0x000B,
+00000012: RJMP PC-0x000C : переход на ловушку (в случае вашего желания покинуть main)
Все эти коды стандартные для IAR C, в других компиляторах (например ImageCraft) этот код другой. Включается он всегда. Посмотреть всё это можно в файлах $IAR DIR$avrsrclib (это в IARAVR 4.12).
Кстати а какие опции оптимизации были и была ли включена отладка?
Вот что получилось у меня (оптимизация не влияла никак)
?RESET:
__program_start:
000000 C008 RJMP ?C_STARTUP
main:
000002 EF0F LDI R16,0xFF
000004 BB02 OUT PORTD,R16
000006 EF00 LDI R16,0xF0
000008 BB01 OUT DDRD,R16
00000A CFFF RJMP 0x00A
?C_FUNCALL:
_exit:
exit:
00000C 0000 NOP
?C_EXIT:
__exit:
00000E 9588 SLEEP
000010 CFFE RJMP ?C_EXIT
?C_STARTUP:
__RESTART:
000012 E90F LDI R16,0x9F
000014 BF0D OUT SPL,R16
000016 E000 LDI R16,0x00
000018 BF0E OUT SPH,R16
00001A E8C0 LDI R28,0x80
00001C E0D0 LDI R29,0x00
?call_low_level_init:
00001E D003 RCALL __low_level_init
?cstartup_call_main:
000020 DFF0 RCALL main
000022 DFF4 RCALL ?C_FUNCALL
000024 CFF3 RJMP ?C_FUNCALL
__low_level_init:
000026 E001 LDI R16,0x01
000028 9508 RET
00002A 0000 NOP
Тут по названиям более понятно что к чему.
NemoCut32 вне форума  
Непрочитано 22.04.2006, 12:42  
graham
Прописка
 
Регистрация: 11.01.2005
Сообщений: 196
Сказал спасибо: 0
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
graham на пути к лучшему
По умолчанию

Сообщение от NemoCut32
Все эти коды стандартные для IAR C, в других компиляторах (например ImageCraft) этот код другой. Включается он всегда. Посмотреть всё это можно в файлах $IAR DIR$avrsrclib (это в IARAVR 4.12).
Уже смотрел, правда пока не пробовал что-то менять, думал может в компиляторе можно убрать, или как-нибудь директивами в программе это задается.
Сообщение от NemoCut32
Кстати а какие опции оптимизации были и была ли включена отладка?
Отладка выключена - releasе, оптимизация по размеру.

Я тут вырезал, оставил только то что считаю ненужным
Сообщение от NemoCut32
Код:
?C_FUNCALL:
_exit:
exit:
    00000C   0000             NOP
?C_EXIT:
__exit:
    00000E   9588             SLEEP
    000010   CFFE             RJMP    ?C_EXIT

?cstartup_call_main:
    000020   DFF0             RCALL   main
    000022   DFF4             RCALL   ?C_FUNCALL
    000024   CFF3             RJMP    ?C_FUNCALL
Тут по названиям более понятно что к чему.
Правда это всего лишь на 19 байт увеличивает код, но оставив один раз маленькую проблему, которую можно решить, потом может войти в привычку. Поэтому хочу разобраться.
graham вне форума  
Непрочитано 02.05.2006, 17:38  
NemoCut32
Гражданин KAZUS.RU
 
Регистрация: 16.12.2004
Сообщений: 587
Сказал спасибо: 13
Сказали Спасибо 23 раз(а) в 9 сообщении(ях)
NemoCut32 на пути к лучшему
По умолчанию

Надо попробовать перекомпилировать библиотеку со startup или вставить в проект свой переписаннный startup.s - линкер в этом случае использует кусок не из библиотеки, а явно заданный.
NemoCut32 вне форума  
 

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

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

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

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

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
IAR for AVR kassiopay Микроконтроллеры, АЦП, память и т.д 5 27.03.2009 17:20
IAR AVR 5.11B Wanted Kabron Микроконтроллеры, АЦП, память и т.д 30 08.02.2009 01:43
IAR for AVR & Assembler GLVlad Микроконтроллеры, АЦП, память и т.д 3 04.06.2008 16:46
IAR for AVR vasilij-kursikov Микроконтроллеры, АЦП, память и т.д 29 28.09.2006 18:14
[Решено] Ошибка в IAR C for AVR Lean Коллекция глюков 0 15.05.2003 10:34


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


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