Jhohn 0 24 октября, 2012 Опубликовано 24 октября, 2012 · Жалоба Необходимо на контроллере ADuC845 в среде IAR, с которой работал раньше, перейти по заданному адресу, где находится выполняемая функция. Никак не удается перейти с одной программы в другую. Располагаю для теста две программы незивисымые, с разной частотой мигания светодиода. По заданным для перехода адресам находится то что нужно, проверял вычитыванием памяти flash. Пробовал переход и так asm ("LJMP 0x0400"); и так ((void (*)())0x0000)(); Почитал хорошую темку ПО для перепрошивки 8051, Дайте мудрый совет, но там не про IAR. Может пересесть с любимого? Как перейти с программы начальной адрес которой 0x100 на другую прогу с начальным адресом 0x400? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Артём__ 0 24 октября, 2012 Опубликовано 24 октября, 2012 · Жалоба ((void (*)())0x0000)(); Почему 0x0000? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Jhohn 0 24 октября, 2012 Опубликовано 24 октября, 2012 · Жалоба Почему 0x0000? Не обращайте внимание на это, это я пробовал варианты в 2-х программах. Я пробовал два адреса в разных программах. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Jhohn 0 25 октября, 2012 Опубликовано 25 октября, 2012 (изменено) · Жалоба Почему 0x0000? Если код находится по адресу 0x0400 и сделать прыжок в на этот адрес 0x0400, то программа куда-то улетает. Но если прыжок сделать на 0x0000, то нормальное выполнение. Что упускаю? Выдержка из файла "Debug\List\*.list", может знающий сразу что-то увидит, чего я не вижу... Результат 1 и 2 метода один и тот же: программа улетает и не возвращается. 60 ((void (*)())0x0400)(); // переход к штатной программе \ ??main_2: \ 000042 ; Setup parameters for indirect call \ 000042 120100 LCALL 0x100 61 82 asm ("LJMP 0x0400"); \ 000045 020400 LJMP 0x0400 \ 000048 80B9 SJMP ??main_0 \ 00004A REQUIRE _A_P2 Изменено 25 октября, 2012 пользователем Jhohn Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Палыч 6 25 октября, 2012 Опубликовано 25 октября, 2012 · Жалоба Что упускаю? Верятно, хотя код программы и начинается с адреса 0x400, но "точка входа" в программу имеет другой адрес. Вопросы: 1. Как получены эти две программы? Ранее было написано - "независимые". Т.е. надо понимать: есть два проекта - каждый даёт свой HEX? 2. Как Вы их объединили и записали в память программ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Jhohn 0 25 октября, 2012 Опубликовано 25 октября, 2012 (изменено) · Жалоба Верятно, хотя код программы и начинается с адреса 0x400, но "точка входа" в программу имеет другой адрес. Было предположение, поэтому сделал вычитку памяти flash, когда вычитал криминала не нашел, две программы находились там где указывал в линкере. 1. Как получены эти две программы? Ранее было написано - "независимые". Т.е. надо понимать: есть два проекта - каждый даёт свой HEX? Да, два разных проекта. Физически один проект для теста, в одной программе задаю адрес старта, и делаю jmp на другой адрес, создаю HEX. Затем в этом проете меняю адрес расположения программы, меняю адрес jmp на первую программу, создаю HEX. В друх программах разные мигания светодиодом. В результате получаю 2 HEX. Верятно, хотя код программы и начинается с адреса 0x400, но "точка входа" в программу имеет другой адрес. 2. Как Вы их объединили и записали в память программ? Первая программа :03000000020127D3 :1001000000000080FB120133B900030201217810C6 :100110009001397A0CBA00028007E493A3F608DA5A :10012000F91201AD12010075D00075819F53A7FE31 :10013000020105790153A7FE22E803000000000038 :100140000001000000C3E7960809E7960809E79652 :100150000809E79622E627F60809E637F60809E6D1 :1001600037F60809E637F622E7F60809E7F6080940 :10017000E7F60809E7F62253A7FE758400D083D07E :1001800082CEC0E0EFC0E0C0207808E608C0E0DE24 :10019000FAE473C0D074072FD0D0F8D0E0F618DF9F :1001A000FAD020D0E0FFD0E0FE53A7FE2212024496 :1001B0007910780C120168850C08850D09850E0AE6 :1001C000850F0B7E007F00C3EE940AEF9400A2D24D :1001D00065D033501A63A080E5A0AA08AB09AC0A29 :1001E000AD0B1201F4EE2401FEEF3400FF80D802C3 :1001F000040080BC7408120177E5812404F581E5D0 :100200008124FDF8EAF608EBF608ECF608EDF6793D :1002100014780C120168850C08850D09850E0A8575 :100220000F0BE58124FDF879081201455009791872 :10023000780812015580EB15811581158115817F94 :1002400008020193D29ED29C759E83759D1253A77E :02025000FE228C :00012701D7 :00000001FF Вторая программа :03000000020427D0 :1004000000000080FB120433B900030204217810BD :100410009004397A0CBA00028007E493A3F608DA54 :10042000F91204AD12040075D00075819F53A7FE28 :10043000020405790153A7FE2210270000000000E6 :100440000001000000C3E7960809E7960809E7964F :100450000809E79622E627F60809E637F60809E6CE :1004600037F60809E637F622E7F60809E7F608093D :10047000E7F60809E7F62253A7FE758400D083D07B :1004800082CEC0E0EFC0E0C0207808E608C0E0DE21 :10049000FAE473C0D074072FD0D0F8D0E0F618DF9C :1004A000FAD020D0E0FFD0E0FE53A7FE2212054490 :1004B0007910780C120468850C08850D09850E0AE0 :1004C000850F0B7E007F00C3EE940AEF9400A2D24A :1004D00065D033501A63A080E5A0AA08AB09AC0A26 :1004E000AD0B1204F4EE2401FEEF3400FF80D802BD :1004F000010080BC7408120477E5812404F581E5CD :100500008124FDF8EAF608EBF608ECF608EDF6793A :1005100014780C120468850C08850D09850E0A856F :100520000F0BE58124FDF87908120445500979186C :10053000780812045580EB15811581158115817F8E :1005400008020493D29ED29C759E83759D1253A778 :02055000FE2289 :00042701D4 :00000001FF Объединенный файл вручную :03000000020127D3 :1001000000000080FB120133B900030201217810C6 :100110009001397A0CBA00028007E493A3F608DA5A :10012000F91201AD12010075D00075819F53A7FE31 :10013000020105790153A7FE22E803000000000038 :100140000001000000C3E7960809E7960809E79652 :100150000809E79622E627F60809E637F60809E6D1 :1001600037F60809E637F622E7F60809E7F6080940 :10017000E7F60809E7F62253A7FE758400D083D07E :1001800082CEC0E0EFC0E0C0207808E608C0E0DE24 :10019000FAE473C0D074072FD0D0F8D0E0F618DF9F :1001A000FAD020D0E0FFD0E0FE53A7FE2212024496 :1001B0007910780C120168850C08850D09850E0AE6 :1001C000850F0B7E007F00C3EE940AEF9400A2D24D :1001D00065D033501A63A080E5A0AA08AB09AC0A29 :1001E000AD0B1201F4EE2401FEEF3400FF80D802C3 :1001F000040080BC7408120177E5812404F581E5D0 :100200008124FDF8EAF608EBF608ECF608EDF6793D :1002100014780C120168850C08850D09850E0A8575 :100220000F0BE58124FDF879081201455009791872 :10023000780812015580EB15811581158115817F94 :1002400008020193D29ED29C759E83759D1253A77E :02025000FE228C :03000000020427D0 :1004000000000080FB120433B900030204217810BD :100410009004397A0CBA00028007E493A3F608DA54 :10042000F91204AD12040075D00075819F53A7FE28 :10043000020405790153A7FE2210270000000000E6 :100440000001000000C3E7960809E7960809E7964F :100450000809E79622E627F60809E637F60809E6CE :1004600037F60809E637F622E7F60809E7F608093D :10047000E7F60809E7F62253A7FE758400D083D07B :1004800082CEC0E0EFC0E0C0207808E608C0E0DE21 :10049000FAE473C0D074072FD0D0F8D0E0F618DF9C :1004A000FAD020D0E0FFD0E0FE53A7FE2212054490 :1004B0007910780C120468850C08850D09850E0AE0 :1004C000850F0B7E007F00C3EE940AEF9400A2D24A :1004D00065D033501A63A080E5A0AA08AB09AC0A26 :1004E000AD0B1204F4EE2401FEEF3400FF80D802BD :1004F000010080BC7408120477E5812404F581E5CD :100500008124FDF8EAF608EBF608ECF608EDF6793A :1005100014780C120468850C08850D09850E0A856F :100520000F0BE58124FDF87908120445500979186C :10053000780812045580EB15811581158115817F8E :1005400008020493D29ED29C759E83759D1253A778 :02055000FE2289 :00042701D4 :00000001FF Вычитанная память из контроллера (просто чтение изнутри и передача по UART) U8 __code *p = (U8 __code *)0x000000; 000001 02 04 27 FF FF FF FF FF FF FF FF FF FF FF FF FF 000002 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000003 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000004 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000005 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000006 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000007 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000008 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000009 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000010 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000011 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000012 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000013 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000014 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000015 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000016 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000017 00 00 00 80 FB 12 01 33 B9 00 03 02 01 21 78 10 000018 90 01 39 7A 0C BA 00 02 80 07 E4 93 A3 F6 08 DA 000019 F9 12 01 AD 12 01 00 75 D0 00 75 81 9F 53 A7 FE 000020 02 01 05 79 01 53 A7 FE 22 E8 03 00 00 00 00 00 000021 00 01 00 00 00 C3 E7 96 08 09 E7 96 08 09 E7 96 000022 08 09 E7 96 22 E6 27 F6 08 09 E6 37 F6 08 09 E6 000023 37 F6 08 09 E6 37 F6 22 E7 F6 08 09 E7 F6 08 09 000024 E7 F6 08 09 E7 F6 22 53 A7 FE 75 84 00 D0 83 D0 000025 82 CE C0 E0 EF C0 E0 C0 20 78 08 E6 08 C0 E0 DE 000026 FA E4 73 C0 D0 74 07 2F D0 D0 F8 D0 E0 F6 18 DF 000027 FA D0 20 D0 E0 FF D0 E0 FE 53 A7 FE 22 12 02 44 000028 79 10 78 0C 12 01 68 85 0C 08 85 0D 09 85 0E 0A 000029 85 0F 0B 7E 00 7F 00 C3 EE 94 0A EF 94 00 A2 D2 000030 65 D0 33 50 1A 63 A0 80 E5 A0 AA 08 AB 09 AC 0A 000031 AD 0B 12 01 F4 EE 24 01 FE EF 34 00 FF 80 D8 02 000032 04 00 80 BC 74 08 12 01 77 E5 81 24 04 F5 81 E5 000033 81 24 FD F8 EA F6 08 EB F6 08 EC F6 08 ED F6 79 000034 14 78 0C 12 01 68 85 0C 08 85 0D 09 85 0E 0A 85 000035 0F 0B E5 81 24 FD F8 79 08 12 01 45 50 09 79 18 000036 78 08 12 01 55 80 EB 15 81 15 81 15 81 15 81 7F 000037 08 02 01 93 D2 9E D2 9C 75 9E 83 75 9D 12 53 A7 000038 FE 22 FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000039 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000040 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000041 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000042 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000043 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000044 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000045 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000046 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000047 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000048 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000049 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000050 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000051 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000052 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000053 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000054 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000055 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000056 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000057 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000058 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000059 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000060 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000061 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000062 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000063 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000064 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000065 00 00 00 80 FB 12 04 33 B9 00 03 02 04 21 78 10 000066 90 04 39 7A 10 BA 00 02 80 07 E4 93 A3 F6 08 DA 000067 F9 12 04 B1 12 04 00 75 D0 00 75 81 9F 53 A7 FE 000068 02 04 05 79 01 53 A7 FE 22 10 27 00 00 40 9C 00 000069 00 00 00 00 00 01 00 00 00 C3 E7 96 08 09 E7 96 000070 08 09 E7 96 08 09 E7 96 22 E6 27 F6 08 09 E6 37 000071 F6 08 09 E6 37 F6 08 09 E6 37 F6 22 E7 F6 08 09 000072 E7 F6 08 09 E7 F6 08 09 E7 F6 22 53 A7 FE 75 84 000073 00 D0 83 D0 82 CE C0 E0 EF C0 E0 C0 20 78 08 E6 000074 08 C0 E0 DE FA E4 73 C0 D0 74 07 2F D0 D0 F8 D0 000075 E0 F6 18 DF FA D0 20 D0 E0 FF D0 E0 FE 53 A7 FE 000076 22 12 05 96 79 10 78 0C 12 04 6C 85 0C 08 85 0D 000077 09 85 0E 0A 85 0F 0B 7E 00 7F 00 C3 EE 94 0A EF 000078 94 00 A2 D2 65 D0 33 50 1A 63 A0 80 E5 A0 AA 08 000079 AB 09 AC 0A AD 0B 12 05 46 EE 24 01 FE EF 34 00 000080 FF 80 D8 05 A7 75 82 00 75 83 00 7E 00 7F 00 C3 000081 EE 94 D0 EF 94 07 50 26 43 A7 01 C0 82 C0 83 05 000082 A7 D0 83 D0 82 75 84 00 E4 93 F5 0C 05 A7 A3 A9 000083 0C 12 05 A4 EE 24 01 FE EF 34 00 FF 80 D1 79 14 000084 78 0C 12 04 6C AA 0C AB 0D AC 0E AD 0F 12 05 46 000085 02 01 00 02 04 B4 74 08 12 04 7B E5 81 24 04 F5 000086 81 E5 81 24 FD F8 EA F6 08 EB F6 08 EC F6 08 ED 000087 F6 79 18 78 0C 12 04 6C 85 0C 08 85 0D 09 85 0E 000088 0A 85 0F 0B E5 81 24 FD F8 79 08 12 04 49 50 09 000089 79 1C 78 08 12 04 59 80 EB 15 81 15 81 15 81 15 000090 81 7F 08 02 04 97 D2 9E D2 9C 75 9E 83 75 9D 12 000091 53 A7 FE 22 C2 99 89 99 A2 99 50 FC C2 99 53 A7 000092 FE 22 FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000093 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000094 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000095 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000096 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000097 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000098 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000099 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000100 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000101 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000102 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000103 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000104 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000105 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000106 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000107 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000108 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000109 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000110 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000111 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000112 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000113 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000114 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000115 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000116 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000117 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000118 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000119 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000120 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000121 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000122 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000123 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000124 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 000125 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF Верятно, хотя код программы и начинается с адреса 0x400, но "точка входа" в программу имеет другой адрес. Похоже, что точка входа, далее вычитанный hex 000001 02 04 27 FF FF FF FF FF FF FF FF FF FF FF FF FF 04 27 вместо 0400 И всеже чтобы разобраться теоретически, что плохого делается при переходе на 0x0400 адрес? Изменено 25 октября, 2012 пользователем Jhohn Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Палыч 6 25 октября, 2012 Опубликовано 25 октября, 2012 · Жалоба Объединенный файл вручную Ясно видно, что при объединении двух файлов результирующий файл имеет "перекрывающуюся" область с адресами 0,1,2. По этим адресам в первоначальных файлах размещаются команды LJMP: - в первом файле на адрес 127h - во втором файле на адрес 427h Эти адреса и являются - "точками входа" в Ваши программы (их и нужно использовать при переходах). В зависимости от того, какая программа должна стартовать первой тот LJMP нужно и оставить, а второй убрать (первая строка файла отдельной программы, начинающаяся на ":03...") И всеже чтобы разобраться теоретически, что плохого делается при переходе на 0x0400 адрес? Вы задали линкеру: использовать память программ, начиная с адреса 400h. Линкер это и выполняет, но не обязательно этот адрес будет "стартовым", начиная с этого адреса могут следовать (так оно и получается в Вашем случае) некие подпрограммы или данные, размещаемые в памяти программ. Передавать же на них управление - "не хорошо". Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Jhohn 0 25 октября, 2012 Опубликовано 25 октября, 2012 · Жалоба Похоже, что точка входа, далее вычитанный hex 000001 02 04 27 FF FF FF FF FF FF FF FF FF FF FF FF FF 04 27 вместо 0400 Палыч, спасибо за наталкивание Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Edit2007 3 25 октября, 2012 Опубликовано 25 октября, 2012 · Жалоба Не скажу за IAR, но в KEIL помимо указания адреса Ликеру для верхней программы, необходимо также в ручную поправить стартап файл. Ибо он содержит директиву ORG 0, для вектора сброса. Скорее всего это директива есть в обоих проекта, поэтому и перетирается. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kolia 0 25 октября, 2012 Опубликовано 25 октября, 2012 · Жалоба Если бутлодер находится вначале то необходимо в него добавить команды которые будут автоматически перенаправлять прерывания во вторую программу В настройках проекта второй программы достаточно указать смещение кода программы, вторую программу заргузить при помощи бутлодера... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Lagman 1 3 ноября, 2012 Опубликовано 3 ноября, 2012 · Жалоба Палыч все правильно сказал. Осталось дождаться ответа автора о результате. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Jhohn 0 7 ноября, 2012 Опубликовано 7 ноября, 2012 (изменено) · Жалоба Палыч все правильно сказал. Осталось дождаться ответа автора о результате. из-за аксиомы (04 27 вместо 0400), которую я не сумел постичь, сделал так: в линкере указал расположение 0400 кода, при прыжке на этот код из другой программы указал 0427 (ljmp) Изменено 7 ноября, 2012 пользователем Jhohn Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Edit2007 3 8 ноября, 2012 Опубликовано 8 ноября, 2012 · Жалоба некрасиво, при пересборке проекта адрес 0x427 может измениться. тогда придется опять руками править. "Аксиома" постигается просто. Обратите внимание на мой пост и стартаповый файл второй программы (той которая с адреса 0x400). директива ORG 0 говорит разместить дальнейший код (данные) по фиксированному адресу (в нашем случае 0 -адрес сброса). При этом остальные настройки линкера (в смысле указанные адреса) игнорируются. По этому адресу обычно располагается инструкция LJMP _START. Метка _START располагается уже в перемещаемом сегменте, который линкер успешно размещает по адресам указанным в настройках проекта. Предлагаю еще пару экспериментов для последующих размышлений. 1. При ручной сборке общего HEX-файла поменяйте порядок программ. При считывании увидите. что адрес перехода по сбросу поменяется 2. Создайте двоичные образы обоих программ (hex2bin например) При этом увидите, что вторая программа имеет по адресу 0 некие данные (точнее инструкцию перехода на основную программу) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Jhohn 0 8 ноября, 2012 Опубликовано 8 ноября, 2012 · Жалоба некрасиво, при пересборке проекта адрес 0x427 может измениться. Это да, я это вижу. Однако похоже, что при одной и тоже оптимизации приращение к абсолютному адресу стабильно 0x27 Я проанализировал, на сколько мог map-файл. В частности я увидел в нем: Program entry at : CODE 0000E027 Relocatable, from module : CSTARTUP Понял о чем вы говорили: Cstartup Code that sets up the system before the application starts executing. Это относительно теории (в теории всегда важно разбираться), но на практике вижу, что я буду, как и прежде, смотреть этот "CSTARTUP" в map-файле, и устанавливать на него LJMP. Или есть другие пути? project_aduc.html Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Edit2007 3 9 ноября, 2012 Опубликовано 9 ноября, 2012 (изменено) · Жалоба Я работаю с кейлом, поэтому конкретно про ИАР не скажу. Должен быть асемблерный файл в проекте. У меня он называется startup.a51. Среда сама предлагает добавлять его в проект при создании. У вас должно быть нечто подобное. В этом файле несколько инструкций на ассемблере, которые проводят начальную инициализацию Обычно это обнуление памяти, установка стека и предача управления сишным функциям. Вот начало моего стандартного файла. CSEG AT 0 ; Директива ассемблера. Устанавливает АБСОЛЮТНЫЙ АДРЕС для секции кода. ; Линкер не может поменять этот адрес ; Именно здесь нужно откорректировать адрес для верхней программы. ; Тогда точкой входа в нее всегда будет именно этот адрес ?C_STARTUP: LJMP STARTUP1 ; непосредственно переход с вектора сброса. ; эту секцию линкер разместит в соответствии с установками RSEG ?C_C51STARTUP; начало перемещаемой секции STARTUP1: IF IDATALEN <> 0 MOV R0,#IDATALEN - 1 ; здесь начинается обнуление памяти CLR A IDATALOOP: MOV @R0,A DJNZ R0,IDATALOOP ; ну и так далее Изменено 9 ноября, 2012 пользователем редактор Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться