Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
22.04.2006, 00:00
|
|
Прописка
Регистрация: 11.01.2005
Сообщений: 196
Сказал спасибо: 0
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
|
Сообщение от dosikus
|
Угу типа того , без обид. ![Валяюсь от смеха](images/smilies/icon_biggrin.gif)
Сам такой был.
|
Да ну ![Улыбка](images/smilies/icon_smile.gif) я не обижаюсь, просто уточнил ![Улыбка](images/smilies/icon_smile.gif) ) правильно ли я понял Вашу мысль. Вообще про барьер согласен + привычка к асму и тотальному контролю действий. Но этот барьер надо разрушить, чем и занимаюсь. А от контроля отказываеться не хочу, поэтому пытаюсь понять как и что там на С делается.
|
|
|
|
22.04.2006, 00:33
|
|
Гражданин KAZUS.RU
Регистрация: 16.12.2004
Сообщений: 587
Сказал спасибо: 13
Сказали Спасибо 23 раз(а) в 9 сообщении(ях)
|
Кстати по поводу "глупости", может я ошибаюсь но смотрите:
+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 лезть влом.
|
|
|
|
22.04.2006, 08:19
|
|
Прописка
Регистрация: 11.01.2005
Сообщений: 196
Сказал спасибо: 0
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
|
Сообщение от 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){} |
Тогда бы у меня не возникло вопросов ![Улыбка](images/smilies/icon_smile.gif) Может разве что о смысле строки
Код:
|
+00000007: LDI R16,0x01 |
|
|
|
|
22.04.2006, 10:12
|
|
Гражданин KAZUS.RU
Регистрация: 16.12.2004
Сообщений: 587
Сказал спасибо: 13
Сказали Спасибо 23 раз(а) в 9 сообщении(ях)
|
Тогда более менее понятно:
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
Тут по названиям более понятно что к чему.
|
|
|
|
22.04.2006, 12:42
|
|
Прописка
Регистрация: 11.01.2005
Сообщений: 196
Сказал спасибо: 0
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
|
Сообщение от 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 байт увеличивает код, но оставив один раз маленькую проблему, которую можно решить, потом может войти в привычку. Поэтому хочу разобраться.
|
|
|
|
02.05.2006, 17:38
|
|
Гражданин KAZUS.RU
Регистрация: 16.12.2004
Сообщений: 587
Сказал спасибо: 13
Сказали Спасибо 23 раз(а) в 9 сообщении(ях)
|
Надо попробовать перекомпилировать библиотеку со startup или вставить в проект свой переписаннный startup.s - линкер в этом случае использует кусок не из библиотеки, а явно заданный.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
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.
|
|